diff options
Diffstat (limited to 'web-ui/src/account_recovery')
6 files changed, 103 insertions, 5 deletions
| diff --git a/web-ui/src/account_recovery/forms/new_password_form.js b/web-ui/src/account_recovery/forms/new_password_form.js new file mode 100644 index 00000000..71239cfa --- /dev/null +++ b/web-ui/src/account_recovery/forms/new_password_form.js @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2017 ThoughtWorks, Inc. + * + * Pixelated is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Pixelated is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Pixelated. If not, see <http://www.gnu.org/licenses/>. + */ + +import React from 'react'; +import { translate } from 'react-i18next'; + +import InputField from 'src/common/input_field/input_field'; +import SubmitButton from 'src/common/submit_button/submit_button'; + +export const NewPasswordForm = ({ t }) => ( +  <form> +    <img +      className='account-recovery-progress' +      src='/public/images/account-recovery/step_3.svg' +      alt={t('account-recovery.new-password.image-description')} +    /> +    <h1>{t('account-recovery.new-password-form.title')}</h1> +    <InputField name='new-password' label={t('account-recovery.new-password-form.input-label1')} /> +    <InputField name='confirm-password' label={t('account-recovery.new-password-form.input-label2')} /> +    <SubmitButton buttonText={t('account-recovery.new-password-form.button')} /> +  </form> +); + +NewPasswordForm.propTypes = { +  t: React.PropTypes.func.isRequired +}; + +export default translate('', { wait: true })(NewPasswordForm); diff --git a/web-ui/src/account_recovery/forms/new_password_form.spec.js b/web-ui/src/account_recovery/forms/new_password_form.spec.js new file mode 100644 index 00000000..a2986165 --- /dev/null +++ b/web-ui/src/account_recovery/forms/new_password_form.spec.js @@ -0,0 +1,31 @@ +import { shallow } from 'enzyme'; +import expect from 'expect'; +import React from 'react'; +import { NewPasswordForm } from 'src/account_recovery/forms/new_password_form'; + +describe('NewPasswordForm', () => { +  let newPasswordForm; + +  beforeEach(() => { +    const mockTranslations = key => key; +    newPasswordForm = shallow( +      <NewPasswordForm t={mockTranslations} /> +    ); +  }); + +  it('renders title for new password form', () => { +    expect(newPasswordForm.find('h1').text()).toEqual('account-recovery.new-password-form.title'); +  }); + +  it('renders input for new password', () => { +    expect(newPasswordForm.find('InputField').at(0).props().label).toEqual('account-recovery.new-password-form.input-label1'); +  }); + +  it('renders input to confirm new password', () => { +    expect(newPasswordForm.find('InputField').at(1).props().label).toEqual('account-recovery.new-password-form.input-label2'); +  }); + +  it('renders submit button', () => { +    expect(newPasswordForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.new-password-form.button'); +  }); +}); diff --git a/web-ui/src/account_recovery/forms/user_recovery_code_form.js b/web-ui/src/account_recovery/forms/user_recovery_code_form.js index 5b679f88..aaefd75d 100644 --- a/web-ui/src/account_recovery/forms/user_recovery_code_form.js +++ b/web-ui/src/account_recovery/forms/user_recovery_code_form.js @@ -21,8 +21,10 @@ import { translate } from 'react-i18next';  import InputField from 'src/common/input_field/input_field';  import SubmitButton from 'src/common/submit_button/submit_button'; -export const UserRecoveryCodeForm = ({ t }) => ( -  <form> +import './forms.scss'; + +export const UserRecoveryCodeForm = ({ t, next }) => ( +  <form className='user-code-form' onSubmit={next}>      <img        className='account-recovery-progress'        src='/public/images/account-recovery/step_2.svg' @@ -36,7 +38,8 @@ export const UserRecoveryCodeForm = ({ t }) => (  );  UserRecoveryCodeForm.propTypes = { -  t: React.PropTypes.func.isRequired +  t: React.PropTypes.func.isRequired, +  next: React.PropTypes.func.isRequired  };  export default translate('', { wait: true })(UserRecoveryCodeForm); diff --git a/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js b/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js index c950e305..a20d3b7b 100644 --- a/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js +++ b/web-ui/src/account_recovery/forms/user_recovery_code_form.spec.js @@ -5,11 +5,13 @@ import { UserRecoveryCodeForm } from 'src/account_recovery/forms/user_recovery_c  describe('UserRecoveryCodeForm', () => {    let userRecoveryCodeForm; +  let mockNext;    beforeEach(() => {      const mockTranslations = key => key; +    mockNext = expect.createSpy();      userRecoveryCodeForm = shallow( -      <UserRecoveryCodeForm t={mockTranslations} /> +      <UserRecoveryCodeForm t={mockTranslations} next={mockNext} />      );    }); @@ -28,4 +30,9 @@ describe('UserRecoveryCodeForm', () => {    it('renders submit button', () => {      expect(userRecoveryCodeForm.find('SubmitButton').props().buttonText).toEqual('account-recovery.user-form.button');    }); + +  it('submits form to next step', () => { +    userRecoveryCodeForm.find('form').simulate('submit'); +    expect(mockNext).toHaveBeenCalled(); +  });  }); diff --git a/web-ui/src/account_recovery/page.js b/web-ui/src/account_recovery/page.js index 93781729..f867fcd5 100644 --- a/web-ui/src/account_recovery/page.js +++ b/web-ui/src/account_recovery/page.js @@ -21,6 +21,7 @@ import DocumentTitle from 'react-document-title';  import Header from 'src/common/header/header';  import AdminRecoveryCodeForm from 'src/account_recovery/forms/admin_recovery_code_form';  import UserRecoveryCodeForm from 'src/account_recovery/forms/user_recovery_code_form'; +import NewPasswordForm from 'src/account_recovery/forms/new_password_form';  import Footer from 'src/common/footer/footer';  import 'font-awesome/scss/font-awesome.scss'; @@ -41,7 +42,8 @@ export class Page extends React.Component {    steps = {      0: <AdminRecoveryCodeForm next={this.nextStep} />, -    1: <UserRecoveryCodeForm /> +    1: <UserRecoveryCodeForm next={this.nextStep} />, +    2: <NewPasswordForm />    }    mainContent = () => this.steps[this.state.step]; diff --git a/web-ui/src/account_recovery/page.spec.js b/web-ui/src/account_recovery/page.spec.js index 37c7be6f..f5e52c85 100644 --- a/web-ui/src/account_recovery/page.spec.js +++ b/web-ui/src/account_recovery/page.spec.js @@ -6,6 +6,7 @@ import { Page } from 'src/account_recovery/page';  import Header from 'src/common/header/header';  import AdminRecoveryCodeForm from 'src/account_recovery/forms/admin_recovery_code_form';  import UserRecoveryCodeForm from 'src/account_recovery/forms/user_recovery_code_form'; +import NewPasswordForm from 'src/account_recovery/forms/new_password_form';  import Footer from 'src/common/footer/footer';  describe('Account Recovery Page', () => { @@ -37,6 +38,8 @@ describe('Account Recovery Page', () => {      it('renders admin recovery code form as default form', () => {        expect(page.find(AdminRecoveryCodeForm).length).toEqual(1); +      expect(page.find(UserRecoveryCodeForm).length).toEqual(0); +      expect(page.find(NewPasswordForm).length).toEqual(0);      });      it('renders user recovery code form when admin code submitted', () => { @@ -44,6 +47,16 @@ describe('Account Recovery Page', () => {        expect(page.find(AdminRecoveryCodeForm).length).toEqual(0);        expect(page.find(UserRecoveryCodeForm).length).toEqual(1); +      expect(page.find(NewPasswordForm).length).toEqual(0); +    }); + +    it('renders new password form when user code submitted', () => { +      pageInstance.nextStep({ preventDefault: () => {} }); +      pageInstance.nextStep({ preventDefault: () => {} }); + +      expect(page.find(AdminRecoveryCodeForm).length).toEqual(0); +      expect(page.find(UserRecoveryCodeForm).length).toEqual(0); +      expect(page.find(NewPasswordForm).length).toEqual(1);      });    });  }); | 
