import {LocationFixture} from 'sentry-fixture/locationFixture'; import {RouterFixture} from 'sentry-fixture/routerFixture'; import {render, screen, userEvent, waitFor} from 'sentry-test/reactTestingLibrary'; import {addErrorMessage} from 'sentry/actionCreators/indicator'; import {useNavigate} from 'sentry/utils/useNavigate'; import WidgetTemplatesList from 'sentry/views/dashboards/widgetBuilder/components/widgetTemplatesList'; import {WidgetBuilderProvider} from 'sentry/views/dashboards/widgetBuilder/contexts/widgetBuilderContext'; jest.mock('sentry/utils/useNavigate', () => ({ useNavigate: jest.fn(), })); jest.mock('sentry/views/dashboards/widgetLibrary/data', () => ({ getTopNConvertedDefaultWidgets: jest.fn(() => [ { id: 'duration-distribution', title: 'Duration Distribution', description: 'some description', displayType: 'line', widgetType: 'transactions-like', queries: [], }, ]), })); const mockUseNavigate = jest.mocked(useNavigate); const router = RouterFixture({ location: LocationFixture({query: {}}), }); jest.mock('sentry/actionCreators/indicator'); describe('WidgetTemplatesList', () => { const onSave = jest.fn(); beforeEach(() => { const mockNavigate = jest.fn(); mockUseNavigate.mockReturnValue(mockNavigate); MockApiClient.addMockResponse({ url: '/organizations/org-slug/dashboards/widgets/', method: 'POST', body: {}, statusCode: 400, }); }); afterEach(() => { jest.clearAllMocks(); }); it('should render the widget templates list', async () => { render( ); expect(await screen.findByText('Duration Distribution')).toBeInTheDocument(); expect(await screen.findByText('some description')).toBeInTheDocument(); }); it('should render buttons when the user clicks on a widget template', async () => { render( ); const widgetTemplate = await screen.findByText('Duration Distribution'); await userEvent.click(widgetTemplate); expect(await screen.findByText('Customize')).toBeInTheDocument(); expect(await screen.findByText('Add to dashboard')).toBeInTheDocument(); }); it('should put widget in url when clicking a template', async () => { const mockNavigate = jest.fn(); mockUseNavigate.mockReturnValue(mockNavigate); render( , {router} ); const widgetTemplate = await screen.findByText('Duration Distribution'); await userEvent.click(widgetTemplate); expect(mockNavigate).toHaveBeenLastCalledWith( expect.objectContaining({ ...router.location, query: expect.objectContaining({ description: 'some description', title: 'Duration Distribution', displayType: 'line', dataset: 'transactions-like', }), }), {replace: true} ); }); it('should show error message when the widget fails to save', async () => { render( ); const widgetTemplate = await screen.findByText('Duration Distribution'); await userEvent.click(widgetTemplate); await userEvent.click(await screen.findByText('Add to dashboard')); await waitFor(() => { expect(addErrorMessage).toHaveBeenCalledWith('Unable to add widget'); }); // show we're still on the widget templates list expect(await screen.findByText('Add to dashboard')).toBeInTheDocument(); }); });