feat: add signup and 404 e2e test (#322)
This commit is contained in:
		
							parent
							
								
									480b46bd0c
								
							
						
					
					
						commit
						28144ff820
					
				|  | @ -0,0 +1,46 @@ | |||
| import root from '../fixtures/api/role-root.json'; | ||||
| import user from '../fixtures/api/user.json'; | ||||
| 
 | ||||
| describe('404', () => { | ||||
|   beforeEach(() => { | ||||
|     cy.signin(); | ||||
|     cy.intercept( | ||||
|       { | ||||
|         method: 'GET', | ||||
|         url: '/api/v1/users/1', | ||||
|       }, | ||||
|       (req) => { | ||||
|         req.reply({ | ||||
|           statusCode: 200, | ||||
|           body: user, | ||||
|         }); | ||||
|       }, | ||||
|     ); | ||||
|     cy.intercept( | ||||
|       { | ||||
|         method: 'GET', | ||||
|         url: '/api/v1/users/1/roles', | ||||
|       }, | ||||
|       (req) => { | ||||
|         req.reply({ | ||||
|           statusCode: 200, | ||||
|           body: root, | ||||
|         }); | ||||
|       }, | ||||
|     ); | ||||
|     cy.viewport(1440, 1080); | ||||
|   }); | ||||
| 
 | ||||
|   it('show 404 page', () => { | ||||
|     cy.visit('/root'); | ||||
|     cy.get('.MuiTypography-h4').should('have.text', 'Something gone wrong!'); | ||||
|   }); | ||||
| 
 | ||||
|   it('click the `go back cluster` button', () => { | ||||
|     cy.visit('/root'); | ||||
|     cy.get('.MuiTypography-h4').should('have.text', 'Something gone wrong!'); | ||||
|     cy.get('.MuiButtonBase-root').click(); | ||||
|     // Then I see that the current page is the clusters
 | ||||
|     cy.url().should('include', '/clusters'); | ||||
|   }); | ||||
| }); | ||||
|  | @ -203,6 +203,27 @@ describe('Signin', () => { | |||
|     cy.get('#password').should('not.have.text', 'dragonfly'); | ||||
|   }); | ||||
| 
 | ||||
|   it('should handle API error response', () => { | ||||
|     cy.intercept('POST', '/api/v1/users/signin', (req) => { | ||||
|       (req.body = { name: 'root', password: 'dragonfly' }), | ||||
|         req.reply({ | ||||
|           forceNetworkError: true, | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     cy.get('#account').type('root'); | ||||
|     cy.get('#password').type(`dragonfly`); | ||||
| 
 | ||||
|     cy.get('form').submit(); | ||||
| 
 | ||||
|     // show error message
 | ||||
|     cy.get('.MuiAlert-message').should('be.visible').and('contain', 'Failed to fetch'); | ||||
|     // close error message
 | ||||
|     cy.get('.MuiAlert-action > .MuiButtonBase-root').click(); | ||||
| 
 | ||||
|     cy.get('.MuiSnackbar-root > .MuiPaper-root').should('not.exist'); | ||||
|   }); | ||||
| 
 | ||||
|   it('try to verify account and password', () => { | ||||
|     const nameNotLongEnough = _.times(2, () => _.sample('abcdefghijklmnopqrstuvwxyz')).join(''); | ||||
|     const nameLengthExceeds = _.times(11, () => _.sample('abcdefghijklmnopqrstuvwxyz')).join(''); | ||||
|  |  | |||
|  | @ -0,0 +1,159 @@ | |||
| import signup from '../fixtures/api/signup.json'; | ||||
| import _ from 'lodash'; | ||||
| 
 | ||||
| describe('Signup', () => { | ||||
|   beforeEach(() => { | ||||
|     cy.intercept('POST', '/api/v1/users/signup', (req) => { | ||||
|       const { name, password, email } = req.body; | ||||
|       if (name === 'root-1' && password === 'dragonfly1' && email === 'root@console.com') { | ||||
|         req.reply({ | ||||
|           statusCode: 200, | ||||
|           body: signup, | ||||
|         }); | ||||
|       } else { | ||||
|         req.reply({ | ||||
|           statusCode: 409, | ||||
|           body: { | ||||
|             message: 'Conflict', | ||||
|           }, | ||||
|         }); | ||||
|       } | ||||
|     }); | ||||
|     cy.visit('/signup'); | ||||
|   }); | ||||
| 
 | ||||
|   it('can create user account', () => { | ||||
|     cy.get('#account').type('root-1'); | ||||
|     cy.get('#email').type('root@console.com'); | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     cy.get('#confirmPassword').type(`dragonfly1{enter}`); | ||||
|     // then I see that the current page is the signin
 | ||||
|     cy.url().should('include', '/signin'); | ||||
|   }); | ||||
| 
 | ||||
|   it('cannot create account with existing email', () => { | ||||
|     cy.get('#account').type('root-1'); | ||||
|     cy.get('#email').type('lucy@example.com'); | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     cy.get('#confirmPassword').type(`dragonfly1{enter}`); | ||||
|     // show error message
 | ||||
|     cy.get('.MuiAlert-message').should('be.visible').and('contain', 'Conflict'); | ||||
|     // close error message
 | ||||
|     cy.get('.MuiAlert-action > .MuiButtonBase-root').click(); | ||||
| 
 | ||||
|     cy.get('.MuiSnackbar-root > .MuiPaper-root').should('not.exist'); | ||||
|   }); | ||||
| 
 | ||||
|   it('cannot create account with existing account', () => { | ||||
|     cy.get('#account').type('root'); | ||||
|     cy.get('#email').type('root@console.co'); | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     cy.get('#confirmPassword').type(`dragonfly1{enter}`); | ||||
|     // show error message
 | ||||
|     cy.get('.MuiAlert-message').should('be.visible').and('contain', 'Conflict'); | ||||
|     // close error message
 | ||||
|     cy.get('.MuiAlert-action > .MuiButtonBase-root').click(); | ||||
| 
 | ||||
|     cy.get('.MuiSnackbar-root > .MuiPaper-root').should('not.exist'); | ||||
|   }); | ||||
| 
 | ||||
|   it('click the password hide butto and confirm password hide butto', () => { | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     cy.get('#confirmPassword').type(`dragonfly1{enter}`); | ||||
| 
 | ||||
|     cy.get('.MuiInputBase-root > .MuiButtonBase-root > [data-testid="VisibilityOffIcon"] > path').click(); | ||||
|     cy.get('#confirmPassword').should('have.value', 'dragonfly1'); | ||||
| 
 | ||||
|     cy.get('[data-testid="VisibilityOffIcon"]').click(); | ||||
|     cy.get('#confirmPassword').should('have.value', 'dragonfly1'); | ||||
|   }); | ||||
| 
 | ||||
|   it('cannot signup without required attributes', () => { | ||||
|     cy.get('.MuiButton-root').click(); | ||||
| 
 | ||||
|     cy.get('#account-helper-text').should('be.visible').and('contain', 'Fill in the characters, the length is 3-10.'); | ||||
|     cy.get('#email-helper-text').should('be.visible').and('contain', 'Email is invalid or already taken.'); | ||||
|     cy.get('#confirmPassword-helper-text').should('be.visible').and('contain', 'Please enter the same password.'); | ||||
|     cy.get('#confirmPassword-helper-text').should('be.visible').and('contain', 'Please enter the same password.'); | ||||
|   }); | ||||
| 
 | ||||
|   it('should handle API error response', () => { | ||||
|     cy.intercept('POST', '/api/v1/users/signup', (req) => { | ||||
|       (req.body = { name: 'root-1', password: 'dragonrly1', email: 'root@console.com' }), | ||||
|         req.reply({ | ||||
|           forceNetworkError: true, | ||||
|         }); | ||||
|     }); | ||||
| 
 | ||||
|     cy.get('#account').type('root-1'); | ||||
|     cy.get('#email').type('root@console.com'); | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     cy.get('#confirmPassword').type(`dragonfly1{enter}`); | ||||
| 
 | ||||
|     // show error message
 | ||||
|     cy.get('.MuiAlert-message').should('be.visible').and('contain', 'Failed to fetch'); | ||||
|     // close error message
 | ||||
|     cy.get('.MuiAlert-action > .MuiButtonBase-root').click(); | ||||
| 
 | ||||
|     cy.get('.MuiSnackbar-root > .MuiPaper-root').should('not.exist'); | ||||
|   }); | ||||
| 
 | ||||
|   it('click the `Sign in` button', () => { | ||||
|     cy.get('.MuiTypography-inherit > .MuiTypography-root').click(); | ||||
|     // Then I see that the current page is the signin
 | ||||
|     cy.url().should('include', '/signin'); | ||||
| 
 | ||||
|     cy.get('.MuiTypography-inherit > .MuiTypography-root').click(); | ||||
|     // Then I see that the current page is the signup
 | ||||
|     cy.url().should('include', '/signup'); | ||||
|   }); | ||||
| 
 | ||||
|   it('cannot signup with invalid attributes', () => { | ||||
|     const nameNotLongEnough = _.times(2, () => _.sample('abcdefghijklmnopqrstuvwxyz')).join(''); | ||||
|     const nameLengthExceeds = _.times(11, () => _.sample('abcdefghijklmnopqrstuvwxyz')).join(''); | ||||
|     const passsword = _.times(8, () => _.sample('abcdefghijklmnopqrstuvwxyz')).join(''); | ||||
| 
 | ||||
|     cy.get('#account').type(nameNotLongEnough); | ||||
|     cy.get('#account-helper-text').should('be.visible').and('contain', 'Fill in the characters, the length is 3-10.'); | ||||
| 
 | ||||
|     cy.get('#account').type(nameLengthExceeds); | ||||
|     cy.get('#account-helper-text').should('be.visible').and('contain', 'Fill in the characters, the length is 3-10.'); | ||||
| 
 | ||||
|     cy.get('#account').clear(); | ||||
| 
 | ||||
|     cy.get('#account').type('root'); | ||||
|     // verification passed
 | ||||
|     cy.get('#account-helper-text').should('not.exist'); | ||||
| 
 | ||||
|     cy.get('#email').type('root'); | ||||
|     cy.get('#email-helper-text').should('be.visible').and('contain', 'Email is invalid or already taken.'); | ||||
| 
 | ||||
|     cy.get('#email').clear(); | ||||
| 
 | ||||
|     cy.get('#email').type('root@console.com'); | ||||
|     // verification passed
 | ||||
|     cy.get('#email-helper-text').should('not.exist'); | ||||
| 
 | ||||
|     cy.get('#password').type(passsword); | ||||
|     // missing number
 | ||||
|     cy.get('#password-helper-text') | ||||
|       .should('be.visible') | ||||
|       .and('contain', 'At least 8-16 characters, with at least 1 lowercase letter and 1 number.'); | ||||
| 
 | ||||
|     cy.get('#password').clear(); | ||||
| 
 | ||||
|     cy.get('#password').type('dragonfly1'); | ||||
|     // verification passed
 | ||||
|     cy.get('#password-helper-text').should('not.exist'); | ||||
| 
 | ||||
|     cy.get('#confirmPassword').type(`dragonfly`); | ||||
|     // confirm password verification error when the two passwords are not the same
 | ||||
|     cy.get('#confirmPassword-helper-text').should('be.visible').and('contain', 'Please enter the same password.'); | ||||
| 
 | ||||
|     cy.get('#confirmPassword').clear(); | ||||
| 
 | ||||
|     cy.get('#confirmPassword').type('dragonfly1'); | ||||
|     // verification passed
 | ||||
|     cy.get('#confirmPassword-helper-text').should('not.exist'); | ||||
|   }); | ||||
| }); | ||||
|  | @ -0,0 +1,14 @@ | |||
| { | ||||
|   "id": 2, | ||||
|   "created_at": "2023-11-08T10:26:26Z", | ||||
|   "updated_at": "2023-11-08T10:26:26Z", | ||||
|   "is_del": 0, | ||||
|   "email": "root@console.com", | ||||
|   "name": "Jack", | ||||
|   "avatar": "https://example.com/avatar.png", | ||||
|   "phone": "1234567890", | ||||
|   "state": "enable", | ||||
|   "location": "ShangHai", | ||||
|   "bio": "I am jack", | ||||
|   "configs": null | ||||
| } | ||||
		Loading…
	
		Reference in New Issue