import { shallow } from 'enzyme';
import expect from 'expect';
import React from 'react';
import fetchMock from 'fetch-mock';
import { NewPasswordForm } from './new_password_form';
describe('NewPasswordForm', () => {
let newPasswordForm;
let mockPrevious;
let mockNext;
let mockTranslations;
beforeEach(() => {
mockTranslations = key => key;
mockPrevious = expect.createSpy();
newPasswordForm = shallow(
);
});
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().type).toEqual('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().type).toEqual('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.button-next');
});
it('returns to previous step on link click', () => {
newPasswordForm.find('BackLink').simulate('click');
expect(mockPrevious).toHaveBeenCalled();
});
describe('Submit', () => {
beforeEach((done) => {
mockNext = expect.createSpy().andCall(() => done());
newPasswordForm = shallow(
);
fetchMock.post('/account-recovery', 200);
newPasswordForm.find('InputField[name="new-password"]').simulate('change', { target: { value: '123' } });
newPasswordForm.find('InputField[name="confirm-password"]').simulate('change', { target: { value: '456' } });
newPasswordForm.find('form').simulate('submit', { preventDefault: expect.createSpy() });
});
it('posts to account recovery', () => {
expect(fetchMock.called('/account-recovery')).toBe(true, 'POST was not called');
});
it('sends user code as content', () => {
expect(fetchMock.lastOptions('/account-recovery').body).toContain('"userCode":"def234"');
});
it('sends password as content', () => {
expect(fetchMock.lastOptions('/account-recovery').body).toContain('"password":"123"');
});
it('sends confirm password as content', () => {
expect(fetchMock.lastOptions('/account-recovery').body).toContain('"confirmPassword":"456"');
});
});
describe('Password validation', () => {
let newPasswordFormInstance;
beforeEach(() => {
newPasswordFormInstance = newPasswordForm.instance();
});
it('verifies initial state', () => {
expect(newPasswordFormInstance.state.errorPassword).toEqual('');
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('');
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(true);
});
context('with valid fields', () => {
beforeEach(() => {
newPasswordFormInstance.validatePassword('12345678', '12345678');
});
it('does not set error in state', () => {
expect(newPasswordFormInstance.state.errorPassword).toEqual('');
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('');
});
it('enables submit button', () => {
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(false);
});
});
context('with invalid password', () => {
beforeEach(() => {
newPasswordFormInstance.validatePassword('1234', '');
});
it('sets password error in state', () => {
expect(newPasswordFormInstance.state.errorPassword).toEqual('account-recovery.new-password-form.error.invalid-password');
});
it('disables submit button', () => {
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(true);
});
});
context('with invalid confirm password', () => {
beforeEach(() => {
newPasswordFormInstance.validatePassword('12345678', '1234');
});
it('sets confirm password error in state', () => {
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('account-recovery.new-password-form.error.invalid-confirm-password');
});
it('disables submit button', () => {
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(true);
});
});
context('with empty fields', () => {
it('does not set error in state if both empty', () => {
newPasswordFormInstance.validatePassword('', '');
expect(newPasswordFormInstance.state.errorPassword).toEqual('');
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('');
});
it('does not set confirm password error in state if empty', () => {
newPasswordFormInstance.validatePassword('12345678', '');
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('');
});
it('sets confirm password error in state if not empty', () => {
newPasswordFormInstance.validatePassword('', '12345678');
expect(newPasswordFormInstance.state.errorConfirmPassword).toEqual('account-recovery.new-password-form.error.invalid-confirm-password');
});
it('disables submit button if empty confirm password', () => {
newPasswordFormInstance.validatePassword('12345678', '');
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(true);
});
it('disables submit button if empty password', () => {
newPasswordFormInstance.validatePassword('', '12345678');
expect(newPasswordForm.find('SubmitButton').props().disabled).toBe(true);
});
});
it('calls next handler on success', () => {
expect(mockNext).toHaveBeenCalled();
});
});
});