import {browserHistory} from 'react-router'; import {initializeOrg} from 'sentry-test/initializeOrg'; import { render, screen, userEvent, waitForElementToBeRemoved, } from 'sentry-test/reactTestingLibrary'; import {GroupEvents} from 'sentry/views/organizationGroupDetails/groupEvents'; describe('groupEvents', function () { let request; let discoverRequest; const {organization, routerContext} = initializeOrg(); beforeEach(function () { request = MockApiClient.addMockResponse({ url: '/issues/1/events/', body: [ TestStubs.Event({ eventID: '12345', id: '1', message: 'ApiException', groupID: '1', }), TestStubs.Event({ crashFile: { sha1: 'sha1', name: 'name.dmp', dateCreated: '2019-05-21T18:01:48.762Z', headers: {'Content-Type': 'application/octet-stream'}, id: '12345', size: 123456, type: 'event.minidump', }, culprit: '', dateCreated: '2019-05-21T18:00:23Z', 'event.type': 'error', eventID: '123456', groupID: '1', id: '98654', location: 'main.js', message: 'TestException', platform: 'native', projectID: '123', tags: [{value: 'production', key: 'production'}], title: 'TestException', }), ], }); browserHistory.push = jest.fn(); discoverRequest = MockApiClient.addMockResponse({ url: '/organizations/org-slug/events/', body: { data: [ { timestamp: '2022-09-11T15:01:10+00:00', transaction: '/api', release: 'backend@1.2.3', 'transaction.duration': 1803, environment: 'prod', 'user.display': 'sentry@sentry.sentry', id: 'id123', trace: 'trace123', 'project.name': 'project123', }, ], meta: { fields: { timestamp: 'date', transaction: 'string', release: 'string', 'transaction.duration': 'duration', environment: 'string', 'user.display': 'string', id: 'string', trace: 'string', 'project.name': 'string', }, units: { timestamp: null, transaction: null, release: null, 'transaction.duration': 'millisecond', environment: null, 'user.display': null, id: null, trace: null, 'project.name': null, }, isMetricsData: false, tips: {query: null, columns: null}, }, }, }); }); afterEach(() => { MockApiClient.clearMockResponses(); jest.clearAllMocks(); }); it('renders', function () { const wrapper = render( , {context: routerContext, organization} ); expect(wrapper.container).toSnapshot(); }); it('handles search', function () { render( , {context: routerContext, organization} ); const list = [ {searchTerm: '', expectedQuery: ''}, {searchTerm: 'test', expectedQuery: 'test'}, {searchTerm: 'environment:production test', expectedQuery: 'test'}, ]; const input = screen.getByPlaceholderText('Search events by id, message, or tags'); for (const item of list) { userEvent.clear(input); userEvent.type(input, `${item.searchTerm}{enter}`); expect(browserHistory.push).toHaveBeenCalledWith( expect.objectContaining({ query: {query: item.expectedQuery}, }) ); } }); it('handles environment filtering', function () { render( , {context: routerContext, organization} ); expect(request).toHaveBeenCalledWith( '/issues/1/events/', expect.objectContaining({ query: {limit: 50, query: '', environment: ['prod', 'staging']}, }) ); }); describe('When the performance flag is enabled', () => { let org; let group; beforeEach(() => { org = initializeOrg({ organization: {features: ['performance-issues-all-events-tab']}, }); group = TestStubs.Group(); }); it('renders new events table for performance', function () { group.issueCategory = 'performance'; render( , {context: routerContext, organization} ); expect(discoverRequest).toHaveBeenCalledWith( '/organizations/org-slug/events/', expect.objectContaining({ query: expect.objectContaining({query: 'performance.issue_ids:1 '}), }) ); const perfEventsColumn = screen.getByText('transaction'); expect(perfEventsColumn).toBeInTheDocument(); }); it('renders event and trace link correctly', async () => { group.issueCategory = 'performance'; render( , {context: routerContext, organization} ); await waitForElementToBeRemoved(document.querySelector('div.loading-indicator')); const eventIdATag = screen.getByText('id123').closest('a'); const traceIdATag = screen.getByText('trace123').closest('a'); expect(eventIdATag).toHaveAttribute( 'href', '/organizations/org-slug/issues/1/events/id123/' ); expect(traceIdATag).toHaveAttribute( 'href', '/organizations/org-slug/performance/trace/trace123/?' ); }); it('renders new events table if error', function () { render( , {context: routerContext, organization} ); expect(discoverRequest).toHaveBeenCalledWith( '/organizations/org-slug/events/', expect.objectContaining({query: expect.objectContaining({query: 'issue.id:1 '})}) ); const perfEventsColumn = screen.getByText('transaction'); expect(perfEventsColumn).toBeInTheDocument(); }); }); it('does not renders new events table if error', function () { const org = initializeOrg(); const group = TestStubs.Group(); render( , {context: routerContext, organization} ); const perfEventsColumn = screen.queryByText('transaction'); expect(perfEventsColumn).not.toBeInTheDocument(); }); });