import {initializeOrg} from 'sentry-test/initializeOrg'; import {render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import {openAddDashboardWidgetModal} from 'sentry/actionCreators/modal'; import DashboardWidgetLibraryModal from 'sentry/components/modals/dashboardWidgetLibraryModal'; import * as types from 'sentry/views/dashboardsV2/types'; const stubEl = props =>
{props.children}
; const alertText = 'Please select at least one Widget from our Library. Alternatively, you can build a custom widget from scratch.'; jest.mock('sentry/actionCreators/modal', () => ({ openAddDashboardWidgetModal: jest.fn(), })); function mountModal({initialData}, onApply, closeModal, widgets = []) { return render( ); } describe('Modals -> DashboardWidgetLibraryModal', function () { const initialData = initializeOrg({ organization: { apdexThreshold: 400, }, }); let container; afterEach(() => { MockApiClient.clearMockResponses(); if (container) { container.unmount(); } }); it('opens modal and renders correctly', function () { // Checking initial modal states container = mountModal({initialData}); expect(screen.getByText('Duration Distribution')).toBeInTheDocument(); expect(screen.getByText('High Throughput Transactions')).toBeInTheDocument(); expect(screen.getByText('LCP by Country')).toBeInTheDocument(); expect(screen.getByText('Miserable Users')).toBeInTheDocument(); expect(screen.getByText('Slow vs. Fast Transactions')).toBeInTheDocument(); expect(screen.getByText('Issues For Review')).toBeInTheDocument(); expect(screen.getByText('Top Unhandled Error Types')).toBeInTheDocument(); expect(screen.getByText('Users Affected by Errors')).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Widget Library new'})).toBeInTheDocument(); expect(screen.getByRole('button', {name: 'Custom Widget'})).toBeInTheDocument(); const button = screen.getByRole('button', {name: 'Custom Widget'}); userEvent.click(button); expect(openAddDashboardWidgetModal).toHaveBeenCalledTimes(1); }); it('submits selected widgets', function () { // Checking initial modal states const mockApply = jest.fn(); const closeModal = jest.fn(); container = mountModal({initialData}, mockApply, closeModal, [ TestStubs.Widget( [ { name: '', orderby: '', conditions: 'event.type:error', fields: ['count()'], aggregates: ['count()'], columns: [], }, ], { title: 'Errors', interval: '1d', id: '1', displayType: 'line', } ), ]); // Select some widgets const allEvents = screen.queryByText('High Throughput Transactions'); userEvent.click(allEvents); expect(screen.getByTestId('confirm-widgets')).toBeEnabled(); userEvent.click(screen.getByTestId('confirm-widgets')); expect(mockApply).toHaveBeenCalledTimes(1); expect(mockApply).toHaveBeenCalledWith([ expect.objectContaining({ displayType: 'line', id: '1', interval: '1d', queries: [ { conditions: 'event.type:error', fields: ['count()'], aggregates: ['count()'], columns: [], name: '', orderby: '', }, ], title: 'Errors', }), expect.objectContaining({ displayType: 'top_n', id: 'high-throughput-transactions', interval: '5m', description: 'Top 5 transactions with the largest volume.', queries: [ { conditions: 'event.type:transaction', fields: ['transaction', 'count()'], aggregates: ['count()'], columns: ['transaction'], name: '', orderby: '-count()', }, ], title: 'High Throughput Transactions', widgetType: 'discover', }), ]); expect(closeModal).toHaveBeenCalledTimes(1); }); it('raises warning if widget not selected', function () { // Checking initial modal states const mockApply = jest.fn(); const closeModal = jest.fn(); container = mountModal({initialData}, mockApply, closeModal); expect(screen.queryByText(alertText)).not.toBeInTheDocument(); userEvent.click(screen.getByTestId('confirm-widgets')); expect(mockApply).toHaveBeenCalledTimes(0); expect(closeModal).toHaveBeenCalledTimes(0); expect(screen.getByText(alertText)).toBeInTheDocument(); }); it('disables save button if widget limit is exceeded', function () { // Checking initial modal states const mockApply = jest.fn(); const closeModal = jest.fn(); types.MAX_WIDGETS = 1; container = mountModal({initialData}, mockApply, closeModal); // Select some widgets const allEvents = screen.queryByText('High Throughput Transactions'); userEvent.click(allEvents); const totalErrors = screen.queryByText('Users Affected by Errors'); userEvent.click(totalErrors); expect(screen.getByTestId('confirm-widgets')).toBeDisabled(); }); });