import {browserHistory} from 'react-router'; import { initializeData as _initializeData, initializeDataSettings, } from 'sentry-test/performance/initializePerformanceData'; import {act, render, screen, userEvent} from 'sentry-test/reactTestingLibrary'; import ProjectsStore from 'sentry/stores/projectsStore'; import {MEPSettingProvider} from 'sentry/utils/performance/contexts/metricsEnhancedSetting'; import TransactionEvents from 'sentry/views/performance/transactionSummary/transactionEvents'; import {EVENTS_TABLE_RESPONSE_FIELDS, MOCK_EVENTS_TABLE_DATA} from './eventsTable.spec'; const WrappedComponent = ({data}) => { return ( ); }; const setupMockApiResponeses = () => { MockApiClient.addMockResponse({ url: '/organizations/org-slug/events-has-measurements/', body: {measurements: false}, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: [ { 'p100()': 9500, 'p99()': 9000, 'p95()': 7000, 'p75()': 5000, 'p50()': 500, }, ], meta: { fields: { 'p100()': 'duration', 'p99()': 'duration', 'p95()': 'duration', 'p75()': 'duration', 'p50()': 'duration', }, }, }, match: [ (_, options) => { return options.query?.field?.includes('p95()'); }, ], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: [ { 'count()': 4000, }, ], meta: { fields: { 'count()': 'integer', }, }, }, match: [ (_, options) => { return options.query?.field?.includes('count()'); }, ], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: [ { 'count()': 4000, }, ], meta: { fields: { 'count()': 'integer', }, }, }, match: [(_, options) => options.query?.field?.includes('count()')], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: MOCK_EVENTS_TABLE_DATA, meta: { fields: EVENTS_TABLE_RESPONSE_FIELDS, }, }, match: [ (_, options) => options.query?.field?.includes('transaction.duration') && !options.query?.query.includes('transaction.duration'), ], }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: [MOCK_EVENTS_TABLE_DATA[0]], meta: { fields: EVENTS_TABLE_RESPONSE_FIELDS, }, }, match: [ (_, options) => options.query?.field?.includes('transaction.duration') && options.query?.query.includes('transaction.duration:<=500'), // 500 refers to p50 value ], }); }; const initializeData = (settings?: initializeDataSettings) => { settings = { features: ['performance-view'], query: {project: '1', transaction: 'transaction'}, ...settings, }; const data = _initializeData(settings); act(() => void ProjectsStore.loadInitialData(data.organization.projects)); return data; }; describe('Performance > Transaction Summary > Transaction Events > Index', () => { beforeEach(setupMockApiResponeses); afterEach(() => { MockApiClient.clearMockResponses(); jest.clearAllMocks(); }); it('should contain all transaction events', async () => { const data = initializeData(); render(, {context: data.routerContext}); expect(await screen.findByText('uhoh@example.com')).toBeInTheDocument(); expect(await screen.findByText('moreuhoh@example.com')).toBeInTheDocument(); }); it('should filter the transaction duration if in query', async () => { const data = initializeData({ query: {project: '1', transaction: 'transaction', showTransactions: 'p50'}, }); render(, {context: data.routerContext}); expect(await screen.findByText('uhoh@example.com')).toBeInTheDocument(); expect(screen.queryByText('moreuhoh@example.com')).not.toBeInTheDocument(); }); it('should update transaction percentile query if selected', async () => { const data = initializeData(); render(, {context: data.routerContext}); const percentileButton = await screen.findByRole('button', { name: /percentile p100/i, }); userEvent.click(percentileButton); const p50Selection = document.querySelector('[value=p50]') as HTMLElement; expect(p50Selection).not.toBe(null); userEvent.click(p50Selection); expect(browserHistory.push).toHaveBeenCalledWith( expect.objectContaining({query: expect.objectContaining({showTransactions: 'p50'})}) ); }); });