widgetTemplatesList.spec.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. import {LocationFixture} from 'sentry-fixture/locationFixture';
  2. import {RouterFixture} from 'sentry-fixture/routerFixture';
  3. import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary';
  4. import {addErrorMessage} from 'sentry/actionCreators/indicator';
  5. import {useNavigate} from 'sentry/utils/useNavigate';
  6. import WidgetTemplatesList from 'sentry/views/dashboards/widgetBuilder/components/widgetTemplatesList';
  7. import {WidgetBuilderProvider} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext';
  8. jest.mock('sentry/utils/useNavigate', () => ({
  9. useNavigate: jest.fn(),
  10. }));
  11. jest.mock('sentry/views/dashboards/widgetLibrary/data', () => ({
  12. getTopNConvertedDefaultWidgets: jest.fn(() => [
  13. {
  14. id: 'duration-distribution',
  15. title: 'Duration Distribution',
  16. description: 'some description',
  17. displayType: 'line',
  18. widgetType: 'transactions-like',
  19. queries: [],
  20. },
  21. ]),
  22. }));
  23. const mockUseNavigate = jest.mocked(useNavigate);
  24. const router = RouterFixture({
  25. location: LocationFixture({query: {}}),
  26. });
  27. jest.mock('sentry/actionCreators/indicator');
  28. describe('WidgetTemplatesList', () => {
  29. const onSave = jest.fn();
  30. beforeEach(() => {
  31. const mockNavigate = jest.fn();
  32. mockUseNavigate.mockReturnValue(mockNavigate);
  33. MockApiClient.addMockResponse({
  34. url: '/organizations/org-slug/dashboards/widgets/',
  35. method: 'POST',
  36. body: {},
  37. statusCode: 400,
  38. });
  39. });
  40. afterEach(() => {
  41. jest.clearAllMocks();
  42. });
  43. it('should render the widget templates list', async () => {
  44. render(
  45. <WidgetBuilderProvider>
  46. <WidgetTemplatesList
  47. onSave={onSave}
  48. setOpenWidgetTemplates={jest.fn()}
  49. setIsPreviewDraggable={jest.fn()}
  50. />
  51. </WidgetBuilderProvider>
  52. );
  53. expect(await screen.findByText('Duration Distribution')).toBeInTheDocument();
  54. expect(await screen.findByText('some description')).toBeInTheDocument();
  55. });
  56. it('should render buttons when the user clicks on a widget template', async () => {
  57. render(
  58. <WidgetBuilderProvider>
  59. <WidgetTemplatesList
  60. onSave={onSave}
  61. setOpenWidgetTemplates={jest.fn()}
  62. setIsPreviewDraggable={jest.fn()}
  63. />
  64. </WidgetBuilderProvider>
  65. );
  66. const widgetTemplate = await screen.findByText('Duration Distribution');
  67. await userEvent.click(widgetTemplate);
  68. expect(await screen.findByText('Customize')).toBeInTheDocument();
  69. expect(await screen.findByText('Add to dashboard')).toBeInTheDocument();
  70. });
  71. it('should put widget in url when clicking a template', async () => {
  72. const mockNavigate = jest.fn();
  73. mockUseNavigate.mockReturnValue(mockNavigate);
  74. render(
  75. <WidgetBuilderProvider>
  76. <WidgetTemplatesList
  77. onSave={onSave}
  78. setOpenWidgetTemplates={jest.fn()}
  79. setIsPreviewDraggable={jest.fn()}
  80. />
  81. </WidgetBuilderProvider>,
  82. {router}
  83. );
  84. const widgetTemplate = await screen.findByText('Duration Distribution');
  85. await userEvent.click(widgetTemplate);
  86. expect(mockNavigate).toHaveBeenLastCalledWith(
  87. expect.objectContaining({
  88. ...router.location,
  89. query: expect.objectContaining({
  90. description: 'some description',
  91. title: 'Duration Distribution',
  92. displayType: 'line',
  93. dataset: 'transactions-like',
  94. }),
  95. }),
  96. {replace: true}
  97. );
  98. });
  99. it('should show error message when the widget fails to save', async () => {
  100. render(
  101. <WidgetBuilderProvider>
  102. <WidgetTemplatesList
  103. onSave={onSave}
  104. setOpenWidgetTemplates={jest.fn()}
  105. setIsPreviewDraggable={jest.fn()}
  106. />
  107. </WidgetBuilderProvider>
  108. );
  109. const widgetTemplate = await screen.findByText('Duration Distribution');
  110. await userEvent.click(widgetTemplate);
  111. await userEvent.click(await screen.findByText('Add to dashboard'));
  112. await waitFor(() => {
  113. expect(addErrorMessage).toHaveBeenCalledWith('Unable to add widget');
  114. });
  115. // show we're still on the widget templates list
  116. expect(await screen.findByText('Add to dashboard')).toBeInTheDocument();
  117. });
  118. });