passwordForm.spec.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import {mountWithTheme} from 'sentry-test/enzyme';
  2. import {Client} from 'sentry/api';
  3. import PasswordForm from 'sentry/views/settings/account/passwordForm';
  4. const ENDPOINT = '/users/me/password/';
  5. describe('PasswordForm', function () {
  6. let wrapper;
  7. let putMock;
  8. const routerContext = TestStubs.routerContext([
  9. {
  10. router: {
  11. ...TestStubs.router(),
  12. params: {
  13. authId: 15,
  14. },
  15. },
  16. },
  17. ]);
  18. beforeEach(function () {
  19. Client.clearMockResponses();
  20. putMock = Client.addMockResponse({
  21. url: ENDPOINT,
  22. method: 'PUT',
  23. });
  24. wrapper = mountWithTheme(<PasswordForm />, routerContext);
  25. });
  26. it('has 3 text inputs', function () {
  27. expect(wrapper.find('input[type="password"]')).toHaveLength(3);
  28. });
  29. it('does not submit when any password field is empty', function () {
  30. wrapper.find('input[name="password"]').simulate('change', {target: {value: 'test'}});
  31. wrapper.find('form').simulate('submit');
  32. expect(putMock).not.toHaveBeenCalled();
  33. wrapper.find('input[name="password"]').simulate('change', {target: {value: ''}});
  34. wrapper
  35. .find('input[name="passwordNew"]')
  36. .simulate('change', {target: {value: 'test'}});
  37. wrapper
  38. .find('input[name="passwordVerify"]')
  39. .simulate('change', {target: {value: 'test'}});
  40. wrapper.find('form').simulate('submit');
  41. expect(putMock).not.toHaveBeenCalled();
  42. });
  43. it('does not submit when new passwords do not match', function () {
  44. wrapper.find('input[name="password"]').simulate('change', {target: {value: 'test'}});
  45. wrapper
  46. .find('input[name="passwordNew"]')
  47. .simulate('change', {target: {value: 'test'}});
  48. wrapper
  49. .find('input[name="passwordVerify"]')
  50. .simulate('change', {target: {value: 'nottest'}});
  51. wrapper.find('form').simulate('submit');
  52. expect(putMock).not.toHaveBeenCalled();
  53. });
  54. it('calls API when all fields are validated and clears form on success', async function () {
  55. wrapper.find('input[name="password"]').simulate('change', {target: {value: 'test'}});
  56. wrapper
  57. .find('input[name="passwordNew"]')
  58. .simulate('change', {target: {value: 'nottest'}});
  59. wrapper
  60. .find('input[name="passwordVerify"]')
  61. .simulate('change', {target: {value: 'nottest'}});
  62. wrapper.find('form').simulate('submit');
  63. expect(putMock).toHaveBeenCalledWith(
  64. ENDPOINT,
  65. expect.objectContaining({
  66. method: 'PUT',
  67. data: {
  68. password: 'test',
  69. passwordNew: 'nottest',
  70. passwordVerify: 'nottest',
  71. },
  72. })
  73. );
  74. await tick();
  75. wrapper.update();
  76. expect(wrapper.find('input[name="password"]').prop('value')).toBe('');
  77. });
  78. it('validates mismatched passwords and remvoes validation on match', function () {
  79. wrapper.find('input[name="password"]').simulate('change', {target: {value: 'test'}});
  80. wrapper
  81. .find('input[name="passwordNew"]')
  82. .simulate('change', {target: {value: 'nottest'}});
  83. wrapper
  84. .find('input[name="passwordVerify"]')
  85. .simulate('change', {target: {value: 'nottest-mismatch'}});
  86. const error = wrapper.find('Field[id="passwordVerify"] FieldErrorReason');
  87. expect(error.exists()).toBe(true);
  88. expect(error.text()).toBe('Passwords do not match');
  89. wrapper
  90. .find('input[name="passwordVerify"]')
  91. .simulate('change', {target: {value: 'nottest'}});
  92. expect(wrapper.find('Field[id="passwordVerify"] FieldErrorReason').exists()).toBe(
  93. false
  94. );
  95. });
  96. });