recoveryOptionsModal.spec.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import styled from '@emotion/styled';
  2. import {AllAuthenticators, Authenticators} from 'sentry-fixture/authenticators';
  3. import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary';
  4. import {makeCloseButton} from 'sentry/components/globalModal/components';
  5. import RecoveryOptionsModal from 'sentry/components/modals/recoveryOptionsModal';
  6. describe('RecoveryOptionsModal', function () {
  7. const closeModal = jest.fn();
  8. const mockId = Authenticators().Recovery().authId;
  9. const routerContext = TestStubs.routerContext();
  10. beforeEach(function () {
  11. MockApiClient.clearMockResponses();
  12. MockApiClient.addMockResponse({
  13. url: '/users/me/authenticators/',
  14. method: 'GET',
  15. body: AllAuthenticators(),
  16. });
  17. });
  18. function renderComponent() {
  19. const styledWrapper = styled(c => c.children);
  20. render(
  21. <RecoveryOptionsModal
  22. Body={styledWrapper()}
  23. Header={p => <span>{p.children}</span>}
  24. Footer={styledWrapper()}
  25. authenticatorName="Authenticator App"
  26. closeModal={closeModal}
  27. CloseButton={makeCloseButton(() => {})}
  28. />,
  29. {context: routerContext}
  30. );
  31. }
  32. it('can redirect to recovery codes if user skips backup phone setup', async function () {
  33. renderComponent();
  34. expect(
  35. screen.queryByRole('button', {name: 'Get Recovery Codes'})
  36. ).not.toBeInTheDocument();
  37. // skip backup phone setup
  38. await userEvent.click(screen.getByRole('button', {name: 'Skip this step'}));
  39. const getCodesbutton = screen.getByRole('button', {name: 'Get Recovery Codes'});
  40. expect(getCodesbutton).toBeInTheDocument();
  41. expect(getCodesbutton).toHaveAttribute(
  42. 'href',
  43. `/settings/account/security/mfa/${mockId}/`
  44. );
  45. await userEvent.click(getCodesbutton);
  46. expect(closeModal).toHaveBeenCalled();
  47. });
  48. it('can redirect to backup phone setup', async function () {
  49. renderComponent();
  50. const backupPhoneButton = screen.getByRole('button', {name: 'Add a Phone Number'});
  51. expect(backupPhoneButton).toBeInTheDocument();
  52. expect(backupPhoneButton).toHaveAttribute(
  53. 'href',
  54. '/settings/account/security/mfa/sms/enroll/'
  55. );
  56. await userEvent.click(backupPhoneButton);
  57. expect(closeModal).toHaveBeenCalled();
  58. });
  59. it('skips backup phone setup if text message authenticator unavailable', function () {
  60. MockApiClient.clearMockResponses();
  61. MockApiClient.addMockResponse({
  62. url: '/users/me/authenticators/',
  63. method: 'GET',
  64. body: [Authenticators().Totp(), Authenticators().Recovery()],
  65. });
  66. renderComponent();
  67. const getCodesbutton = screen.getByRole('button', {name: 'Get Recovery Codes'});
  68. expect(getCodesbutton).toBeInTheDocument();
  69. expect(getCodesbutton).toHaveAttribute(
  70. 'href',
  71. `/settings/account/security/mfa/${mockId}/`
  72. );
  73. expect(
  74. screen.queryByRole('button', {name: 'Skip this step'})
  75. ).not.toBeInTheDocument();
  76. expect(
  77. screen.queryByRole('button', {name: 'Add a Phone Number'})
  78. ).not.toBeInTheDocument();
  79. });
  80. });