adminConfirmationModal.spec.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import {Fragment} from 'react';
  2. import {
  3. render,
  4. renderGlobalModal,
  5. screen,
  6. userEvent,
  7. } from 'sentry-test/reactTestingLibrary';
  8. import ModalStore from 'sentry/stores/modalStore';
  9. import AdminConfirmationModal from 'admin/components/adminConfirmationModal';
  10. describe('Admin confirmation modal', function () {
  11. const mockOnConfirm = jest.fn();
  12. const mockOnCancel = jest.fn();
  13. beforeEach(() => {
  14. ModalStore.reset();
  15. jest.clearAllMocks();
  16. });
  17. const setTicketURL = async (url: string) => {
  18. await userEvent.clear(screen.getByRole('textbox', {name: 'TicketURL'}));
  19. await userEvent.type(screen.getByRole('textbox', {name: 'TicketURL'}), url);
  20. };
  21. const setNotes = async (notes: string) => {
  22. await userEvent.clear(screen.getByRole('textbox', {name: 'Notes'}));
  23. await userEvent.type(screen.getByRole('textbox', {name: 'Notes'}), notes);
  24. };
  25. it('renders default fields', async function () {
  26. render(
  27. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  28. <button>Open Modal</button>
  29. </AdminConfirmationModal>
  30. );
  31. await userEvent.click(screen.getByRole('button'));
  32. renderGlobalModal();
  33. expect(screen.getByRole('textbox', {name: 'TicketURL'})).toBeInTheDocument();
  34. expect(screen.getByRole('textbox', {name: 'Notes'})).toBeInTheDocument();
  35. });
  36. it('obeys showAuditFields prop', async function () {
  37. render(
  38. <AdminConfirmationModal
  39. onConfirm={mockOnConfirm}
  40. onCancel={mockOnCancel}
  41. showAuditFields={false}
  42. >
  43. <button>Open Modal</button>
  44. </AdminConfirmationModal>
  45. );
  46. await userEvent.click(screen.getByRole('button'));
  47. renderGlobalModal();
  48. expect(screen.queryByRole('textbox', {name: 'TicketURL'})).not.toBeInTheDocument();
  49. expect(screen.queryByRole('textbox', {name: 'Notes'})).not.toBeInTheDocument();
  50. });
  51. it('renders text content', async function () {
  52. render(
  53. <AdminConfirmationModal
  54. onConfirm={mockOnConfirm}
  55. onCancel={mockOnCancel}
  56. modalSpecificContent="random text"
  57. >
  58. <button>Open Modal</button>
  59. </AdminConfirmationModal>
  60. );
  61. await userEvent.click(screen.getByRole('button'));
  62. renderGlobalModal();
  63. expect(screen.getByRole('dialog')).toHaveTextContent('random text');
  64. });
  65. it('renders jsx content', async function () {
  66. render(
  67. <AdminConfirmationModal
  68. onConfirm={mockOnConfirm}
  69. onCancel={mockOnCancel}
  70. modalSpecificContent={<div data-test-id="top-half-div">Hello</div>}
  71. >
  72. <button>Open Modal</button>
  73. </AdminConfirmationModal>
  74. );
  75. await userEvent.click(screen.getByRole('button'));
  76. renderGlobalModal();
  77. expect(screen.getByTestId('top-half-div')).toBeInTheDocument();
  78. });
  79. it('renders content given by a function', async function () {
  80. const testFunc = (handlers: any) => (
  81. <Fragment>
  82. <button onClick={handlers.close}>close</button>
  83. <button onClick={handlers.confirm}>confirm</button>
  84. </Fragment>
  85. );
  86. render(
  87. <AdminConfirmationModal
  88. onConfirm={mockOnConfirm}
  89. onCancel={mockOnCancel}
  90. renderModalSpecificContent={testFunc}
  91. >
  92. <button>Open Modal</button>
  93. </AdminConfirmationModal>
  94. );
  95. await userEvent.click(screen.getByRole('button'));
  96. const {waitForModalToHide} = renderGlobalModal();
  97. // check that confirm works
  98. await userEvent.click(screen.getByRole('button', {name: 'confirm'}));
  99. expect(mockOnConfirm).toHaveBeenCalled();
  100. await waitForModalToHide();
  101. // re-open the modal
  102. await userEvent.click(screen.getByRole('button'));
  103. // check that close works
  104. await userEvent.click(screen.getByRole('button', {name: 'close'}));
  105. await waitForModalToHide();
  106. });
  107. it('passes notes and ticket url to parent', async function () {
  108. render(
  109. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  110. <button>Open Modal</button>
  111. </AdminConfirmationModal>
  112. );
  113. await userEvent.click(screen.getByRole('button'));
  114. renderGlobalModal();
  115. await setTicketURL('http://im.a.cool.website');
  116. await setNotes('notes');
  117. await userEvent.click(screen.getByRole('button', {name: 'Confirm'}));
  118. expect(mockOnConfirm).toHaveBeenCalledWith({
  119. ticketURL: 'http://im.a.cool.website',
  120. notes: 'notes',
  121. });
  122. });
  123. // TODO: adapt this for custom renderer including a confirm button (click on that button instead)
  124. // eslint-disable-next-line jest/no-commented-out-tests
  125. // it('no-ops on URL error', function() {
  126. // render(
  127. // <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  128. // <div id="testing" />
  129. // </AdminConfirmationModal>
  130. // );
  131. // const instance = wrapper.instance();
  132. // const spy = jest.spyOn(instance, 'handleConfirm');
  133. // instance.forceUpdate();
  134. // wrapper.find('div[id="testing"]').simulate('click');
  135. // setTicketURL(wrapper, 'ttp://im.missing.the.h');
  136. // wrapper.find('button[data-test-id="confirm-button"]').simulate('click');
  137. // expect(spy).toHaveBeenCalled();
  138. // expect(mockOnConfirm).not.toHaveBeenCalled();
  139. // });
  140. it('disables confirm button on initial render', async function () {
  141. render(
  142. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  143. <button>Open Modal</button>
  144. </AdminConfirmationModal>
  145. );
  146. await userEvent.click(screen.getByRole('button'));
  147. renderGlobalModal();
  148. expect(screen.getByRole('button', {name: 'Confirm'})).toBeEnabled();
  149. });
  150. it('disables confirm button on URL error', async function () {
  151. render(
  152. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  153. <button>Open Modal</button>
  154. </AdminConfirmationModal>
  155. );
  156. await userEvent.click(screen.getByRole('button'));
  157. renderGlobalModal();
  158. await setTicketURL('1invalid');
  159. // Trigger blur validity check
  160. await userEvent.click(screen.getByRole('textbox', {name: 'Notes'}));
  161. expect(screen.getByRole('button', {name: 'Confirm'})).toBeDisabled();
  162. });
  163. it('enables confirm button on valid URL input', async function () {
  164. render(
  165. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  166. <button>Open Modal</button>
  167. </AdminConfirmationModal>
  168. );
  169. await userEvent.click(screen.getByRole('button'));
  170. renderGlobalModal();
  171. await setTicketURL('http://www.goodwebsite.com');
  172. expect(screen.getByRole('button', {name: 'Confirm'})).toBeEnabled();
  173. });
  174. it('handles url change', async function () {
  175. render(
  176. <AdminConfirmationModal onConfirm={mockOnConfirm} onCancel={mockOnCancel}>
  177. <button>Open Modal</button>
  178. </AdminConfirmationModal>
  179. );
  180. await userEvent.click(screen.getByRole('button'));
  181. renderGlobalModal();
  182. await setTicketURL('1invalid');
  183. // Trigger blur validity check
  184. await userEvent.click(screen.getByRole('textbox', {name: 'Notes'}));
  185. expect(screen.getByText('Invalid ticket URL')).toBeInTheDocument();
  186. await setTicketURL('https://sentry.zendesk.com/agent/tickets/1234');
  187. // Trigger blur validity check
  188. await userEvent.click(screen.getByRole('textbox', {name: 'Notes'}));
  189. expect(screen.queryByText('Invalid ticket URL')).not.toBeInTheDocument();
  190. });
  191. });