useFeedbackForm.spec.tsx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {renderHook, waitFor} from 'sentry-test/reactTestingLibrary';
  2. import type {FeedbackIntegration} from 'sentry/components/feedback/widget/useFeedback';
  3. import * as useFeedback from 'sentry/components/feedback/widget/useFeedback';
  4. import {GlobalFeedbackForm, useFeedbackForm} from 'sentry/utils/useFeedbackForm';
  5. const mockForm = {
  6. appendToDom: jest.fn(),
  7. open: jest.fn(),
  8. close: jest.fn(),
  9. removeFromDom: jest.fn(),
  10. };
  11. const mockFeedback = {
  12. createForm: jest.fn().mockResolvedValue(mockForm),
  13. } as unknown as FeedbackIntegration;
  14. const defaultOptions = {
  15. colorScheme: 'light' as const,
  16. buttonLabel: '',
  17. submitButtonLabel: '',
  18. messagePlaceholder: '',
  19. formTitle: '',
  20. tags: {},
  21. };
  22. describe('useFeedbackForm', function () {
  23. beforeEach(() => {
  24. jest
  25. .spyOn(useFeedback, 'useFeedback')
  26. .mockReturnValue({feedback: mockFeedback, options: defaultOptions});
  27. jest.clearAllMocks();
  28. });
  29. it('can open the form using useFeedbackForm', async function () {
  30. const {result} = renderHook(useFeedbackForm, {wrapper: GlobalFeedbackForm});
  31. const openForm = result.current;
  32. expect(openForm).not.toBe(null);
  33. // Calling openForm() should create a form and append it to the DOM
  34. await openForm!();
  35. expect(mockFeedback.createForm).toHaveBeenCalledTimes(1);
  36. expect(mockForm.appendToDom).toHaveBeenCalledTimes(1);
  37. expect(mockForm.open).toHaveBeenCalledTimes(1);
  38. });
  39. it('uses a new form instance each time', async function () {
  40. const {result} = renderHook(useFeedbackForm, {wrapper: GlobalFeedbackForm});
  41. const openForm = result.current;
  42. await openForm!({formTitle: 'foo'});
  43. expect(mockFeedback.createForm).toHaveBeenLastCalledWith(
  44. expect.objectContaining({...defaultOptions, formTitle: 'foo'})
  45. );
  46. expect(mockForm.removeFromDom).not.toHaveBeenCalled();
  47. await openForm!({formTitle: 'bar'});
  48. expect(mockFeedback.createForm).toHaveBeenLastCalledWith(
  49. expect.objectContaining({...defaultOptions, formTitle: 'bar'})
  50. );
  51. // Shoul have been removed once and added twice
  52. expect(mockForm.removeFromDom).toHaveBeenCalledTimes(1);
  53. expect(mockFeedback.createForm).toHaveBeenCalledTimes(2);
  54. expect(mockForm.appendToDom).toHaveBeenCalledTimes(2);
  55. expect(mockForm.open).toHaveBeenCalledTimes(2);
  56. });
  57. it('cleans up on unmount', async function () {
  58. const {result, unmount} = renderHook(useFeedbackForm, {wrapper: GlobalFeedbackForm});
  59. const openForm = result.current;
  60. await openForm!();
  61. unmount();
  62. await waitFor(() => {
  63. expect(mockForm.removeFromDom).toHaveBeenCalledTimes(1);
  64. });
  65. });
  66. });