useFeedbackForm.spec.tsx 2.5 KB

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