mirror of
https://github.com/elyby/accounts-frontend.git
synced 2025-01-12 06:42:09 +05:30
Cover change email with e2e tests and fix bugs
This commit is contained in:
parent
5a5d41749e
commit
8af40aed47
@ -61,7 +61,7 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
return {
|
return {
|
||||||
activeStep:
|
activeStep:
|
||||||
typeof props.step === 'number' ? props.step : state.activeStep,
|
typeof props.step === 'number' ? props.step : state.activeStep,
|
||||||
code: props.code || '',
|
code: props.code || state.code,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +75,10 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
onSubmit={this.onFormSubmit}
|
onSubmit={this.onFormSubmit}
|
||||||
onInvalid={() => this.forceUpdate()}
|
onInvalid={() => this.forceUpdate()}
|
||||||
>
|
>
|
||||||
<div className={styles.contentWithBackButton}>
|
<div
|
||||||
|
className={styles.contentWithBackButton}
|
||||||
|
data-testid="change-email"
|
||||||
|
>
|
||||||
<BackButton />
|
<BackButton />
|
||||||
|
|
||||||
<div className={styles.form}>
|
<div className={styles.form}>
|
||||||
@ -158,7 +161,7 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
|
|
||||||
renderStep0({ email, form }) {
|
renderStep0({ email, form }) {
|
||||||
return (
|
return (
|
||||||
<div key="step0" className={styles.formBody}>
|
<div key="step0" data-testid="step1" className={styles.formBody}>
|
||||||
<div className={styles.formRow}>
|
<div className={styles.formRow}>
|
||||||
<p className={styles.description}>
|
<p className={styles.description}>
|
||||||
<Message {...messages.currentAccountEmail} />
|
<Message {...messages.currentAccountEmail} />
|
||||||
@ -182,7 +185,7 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
|
|
||||||
renderStep1({ email, form, code, isCodeSpecified, isActiveStep }) {
|
renderStep1({ email, form, code, isCodeSpecified, isActiveStep }) {
|
||||||
return (
|
return (
|
||||||
<div key="step1" className={styles.formBody}>
|
<div key="step1" data-testid="step2" className={styles.formBody}>
|
||||||
<div className={styles.formRow}>
|
<div className={styles.formRow}>
|
||||||
<p className={styles.description}>
|
<p className={styles.description}>
|
||||||
<Message
|
<Message
|
||||||
@ -231,7 +234,7 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
const { newEmail } = this.state;
|
const { newEmail } = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key="step2" className={styles.formBody}>
|
<div key="step2" data-testid="step3" className={styles.formBody}>
|
||||||
<div className={styles.formRow}>
|
<div className={styles.formRow}>
|
||||||
<p className={styles.description}>
|
<p className={styles.description}>
|
||||||
{newEmail ? (
|
{newEmail ? (
|
||||||
@ -296,17 +299,21 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
return this.state.activeStep + 1 === STEPS_TOTAL;
|
return this.state.activeStep + 1 === STEPS_TOTAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
onSwitchStep = event => {
|
onSwitchStep = (event: React.MouseEvent) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|
||||||
this.nextStep();
|
this.nextStep();
|
||||||
};
|
};
|
||||||
|
|
||||||
onCodeInput = event => {
|
onCodeInput = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
const { value } = event.target;
|
const { value } = event.target;
|
||||||
|
|
||||||
|
if (this.props.code) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
code: this.props.code || value,
|
code: value,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -320,7 +327,12 @@ export default class ChangeEmail extends React.Component<Props, State> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
promise.then(
|
promise.then(
|
||||||
() => this.nextStep(),
|
() => {
|
||||||
|
this.nextStep();
|
||||||
|
this.setState({
|
||||||
|
code: '',
|
||||||
|
});
|
||||||
|
},
|
||||||
resp => {
|
resp => {
|
||||||
if (resp.errors) {
|
if (resp.errors) {
|
||||||
form.setErrors(resp.errors);
|
form.setErrors(resp.errors);
|
||||||
|
186
tests-e2e/cypress/integration/profile/change-email.test.ts
Normal file
186
tests-e2e/cypress/integration/profile/change-email.test.ts
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
import { openSectionByName, confirmWithPassword } from './utils';
|
||||||
|
|
||||||
|
describe('Profile — Change Email', () => {
|
||||||
|
it('should change email', () => {
|
||||||
|
const key = 'key123';
|
||||||
|
const key2 = 'key1232';
|
||||||
|
|
||||||
|
cy.login({ accounts: ['default'] }).then(({ accounts: [account] }) => {
|
||||||
|
cy.server();
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/email-verification`,
|
||||||
|
}).as('requestEmailChange');
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/new-email-verification`,
|
||||||
|
response: { success: true },
|
||||||
|
}).as('verifyNewEmail');
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/email`,
|
||||||
|
response: { success: true },
|
||||||
|
}).as('saveEmail');
|
||||||
|
|
||||||
|
cy.visit('/');
|
||||||
|
|
||||||
|
openSectionByName('E‑mail');
|
||||||
|
|
||||||
|
cy.location('pathname').should('eq', '/profile/change-email');
|
||||||
|
|
||||||
|
cy.contains('Send E‑mail').click();
|
||||||
|
|
||||||
|
cy.wait('@requestEmailChange')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
password: '',
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/email-verification`,
|
||||||
|
response: { success: true },
|
||||||
|
}).as('requestEmailChange');
|
||||||
|
|
||||||
|
confirmWithPassword(account.password);
|
||||||
|
|
||||||
|
cy.wait('@requestEmailChange')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
password: account.password,
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.location('pathname').should('eq', '/profile/change-email/step2');
|
||||||
|
|
||||||
|
cy.getByTestId('step2')
|
||||||
|
.find('[name=key]')
|
||||||
|
.type(key);
|
||||||
|
cy.getByTestId('step2')
|
||||||
|
.find('[name=email]')
|
||||||
|
.type(`${account.email}{enter}`);
|
||||||
|
|
||||||
|
cy.wait('@verifyNewEmail')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
email: account.email,
|
||||||
|
key,
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
cy.location('pathname').should('eq', '/profile/change-email/step3');
|
||||||
|
|
||||||
|
cy.getByTestId('step3')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('have.value', '');
|
||||||
|
cy.getByTestId('step3')
|
||||||
|
.find('[name=key]')
|
||||||
|
.type(`${key2}{enter}`);
|
||||||
|
|
||||||
|
cy.wait('@saveEmail')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
key: key2,
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
cy.location('pathname').should('eq', '/');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should allow to skip steps', () => {
|
||||||
|
cy.login({ accounts: ['default'] });
|
||||||
|
|
||||||
|
cy.visit('/profile/change-email');
|
||||||
|
|
||||||
|
cy.contains('Already received code').click();
|
||||||
|
|
||||||
|
cy.visit('/profile/change-email/step2');
|
||||||
|
|
||||||
|
cy.contains('Already received code').click();
|
||||||
|
|
||||||
|
cy.visit('/profile/change-email/step3');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should read code from url on step2', () => {
|
||||||
|
const key = 'key123';
|
||||||
|
|
||||||
|
cy.login({ accounts: ['default'] }).then(({ accounts: [account] }) => {
|
||||||
|
cy.server();
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/new-email-verification`,
|
||||||
|
response: { success: true },
|
||||||
|
}).as('verifyNewEmail');
|
||||||
|
|
||||||
|
cy.visit(`/profile/change-email/step2/${key}`);
|
||||||
|
|
||||||
|
cy.getByTestId('step2')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('have.value', key);
|
||||||
|
cy.getByTestId('step2')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('be.disabled');
|
||||||
|
cy.getByTestId('step2')
|
||||||
|
.find('[name=email]')
|
||||||
|
.type(`${account.email}{enter}`);
|
||||||
|
|
||||||
|
cy.wait('@verifyNewEmail')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
email: account.email,
|
||||||
|
key,
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
cy.location('pathname').should('eq', '/profile/change-email/step3');
|
||||||
|
cy.getByTestId('step3')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('have.value', '');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should read code from url on step3', () => {
|
||||||
|
const key = 'key123';
|
||||||
|
|
||||||
|
cy.login({ accounts: ['default'] }).then(({ accounts: [account] }) => {
|
||||||
|
cy.server();
|
||||||
|
cy.route({
|
||||||
|
method: 'POST',
|
||||||
|
url: `/api/v1/accounts/${account.id}/email`,
|
||||||
|
response: { success: true },
|
||||||
|
}).as('saveEmail');
|
||||||
|
|
||||||
|
cy.visit(`/profile/change-email/step3/${key}`);
|
||||||
|
|
||||||
|
cy.getByTestId('step3')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('have.value', key);
|
||||||
|
cy.getByTestId('step3')
|
||||||
|
.find('[name=key]')
|
||||||
|
.should('be.disabled');
|
||||||
|
|
||||||
|
cy.getByTestId('change-email')
|
||||||
|
.find('[type=submit]')
|
||||||
|
.click();
|
||||||
|
|
||||||
|
cy.wait('@saveEmail')
|
||||||
|
.its('requestBody')
|
||||||
|
.should(
|
||||||
|
'eq',
|
||||||
|
new URLSearchParams({
|
||||||
|
key,
|
||||||
|
}).toString(),
|
||||||
|
);
|
||||||
|
cy.location('pathname').should('eq', '/');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -1,6 +1,6 @@
|
|||||||
import { openSectionByName, confirmWithPassword } from './utils';
|
import { openSectionByName, confirmWithPassword } from './utils';
|
||||||
|
|
||||||
describe('Change password', () => {
|
describe('Profile — Change password', () => {
|
||||||
it('should change password', () => {
|
it('should change password', () => {
|
||||||
cy.login({ accounts: ['default'] }).then(({ accounts: [account] }) => {
|
cy.login({ accounts: ['default'] }).then(({ accounts: [account] }) => {
|
||||||
cy.server();
|
cy.server();
|
||||||
@ -12,6 +12,8 @@ describe('Change password', () => {
|
|||||||
|
|
||||||
openSectionByName('Password');
|
openSectionByName('Password');
|
||||||
|
|
||||||
|
cy.location('pathname').should('eq', '/profile/change-password');
|
||||||
|
|
||||||
cy.get('[name=newPassword]').type(account.password);
|
cy.get('[name=newPassword]').type(account.password);
|
||||||
cy.get('[name=newRePassword]').type(account.password);
|
cy.get('[name=newRePassword]').type(account.password);
|
||||||
cy.get('[name=logoutAll]').should('be.checked');
|
cy.get('[name=logoutAll]').should('be.checked');
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { openSectionByName, confirmWithPassword } from './utils';
|
import { openSectionByName, confirmWithPassword } from './utils';
|
||||||
|
|
||||||
describe('Change username', () => {
|
describe('Profile — Change Username', () => {
|
||||||
it('should change username', () => {
|
it('should change username', () => {
|
||||||
cy.server();
|
cy.server();
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
describe('Change locales', () => {
|
describe('Change locale', () => {
|
||||||
it('should change locale from footer', () => {
|
it('should change locale from footer', () => {
|
||||||
cy.visit('/');
|
cy.visit('/');
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user