passwordForm.spec.jsx 3.5 KB

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