import type {Location} from 'history'; import {OrganizationFixture} from 'sentry-fixture/organization'; import {render, screen, within} from 'sentry-test/reactTestingLibrary'; import {browserHistory} from 'sentry/utils/browserHistory'; import {useLocation} from 'sentry/utils/useLocation'; import usePageFilters from 'sentry/utils/usePageFilters'; import {ScreenLoadSpansTable} from 'sentry/views/insights/mobile/screenload/components/tables/screenLoadSpansTable'; jest.mock('sentry/utils/useLocation'); jest.mock('sentry/utils/usePageFilters'); describe('ScreenLoadSpansTable', function () { const organization = OrganizationFixture({ features: ['insights-initial-modules'], }); jest.mocked(useLocation).mockReturnValue({ action: 'PUSH', hash: '', key: '', pathname: '/organizations/org-slug/performance/mobile/screens/', query: {}, search: '', state: undefined, } as Location); jest.mocked(usePageFilters).mockReturnValue({ isReady: true, desyncedFilters: new Set(), pinnedFilters: new Set(), shouldPersist: true, selection: { datetime: { period: '10d', start: null, end: null, utc: false, }, environments: [], projects: [], }, }); let eventsMock; beforeEach(function () { browserHistory.push = jest.fn(); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/releases/`, body: [], }); eventsMock = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { meta: {}, data: [], }, }); }); afterEach(function () { MockApiClient.clearMockResponses(); jest.clearAllMocks(); }); it('renders table with the right columns', async function () { render( , {organization} ); expect(eventsMock).toHaveBeenCalledTimes(2); // Span op selector expect(eventsMock).toHaveBeenNthCalledWith( 1, expect.anything(), expect.objectContaining({ query: expect.objectContaining({ dataset: 'spansMetrics', environment: [], field: ['span.op', 'count()'], per_page: 25, project: [], query: 'transaction.op:ui.load transaction:MainActivity span.op:[file.read,file.write,ui.load,http.client,db,db.sql.room,db.sql.query,db.sql.transaction] has:span.description ( release:io.sentry.samples.android@7.0.0+2 OR release:io.sentry.samples.android@6.27.0+2 )', referrer: 'api.starfish.get-span-operations', statsPeriod: '14d', }), }) ); // Spans table expect(eventsMock).toHaveBeenNthCalledWith( 2, expect.anything(), expect.objectContaining({ query: expect.objectContaining({ dataset: 'spansMetrics', environment: [], field: [ 'project.id', 'span.op', 'span.group', 'span.description', 'avg_if(span.self_time,release,io.sentry.samples.android@7.0.0+2)', 'avg_if(span.self_time,release,io.sentry.samples.android@6.27.0+2)', 'ttid_contribution_rate()', 'ttfd_contribution_rate()', 'count()', 'time_spent_percentage()', 'sum(span.self_time)', ], per_page: 25, project: [], query: 'transaction.op:ui.load transaction:MainActivity has:span.description span.op:[file.read,file.write,ui.load,http.client,db,db.sql.room,db.sql.query,db.sql.transaction] ( release:io.sentry.samples.android@7.0.0+2 OR release:io.sentry.samples.android@6.27.0+2 )', referrer: 'api.starfish.mobile-span-table', sort: '-time_spent_percentage()', statsPeriod: '14d', }), }) ); const header = await screen.findAllByTestId('grid-head-row'); const headerCells = within(header[0]).getAllByTestId('grid-head-cell'); const headerCell = headerCells[4]; expect(headerCell).toHaveTextContent('Affects TTID'); expect(await screen.findByRole('link', {name: 'Affects TTID'})).toHaveAttribute( 'href', '/organizations/org-slug/performance/mobile/screens/?spansSort=-ttid_contribution_rate%28%29' ); }); it('sorts ttfd contribution', async function () { jest.mocked(useLocation).mockReturnValue({ action: 'PUSH', hash: '', key: '', pathname: '/organizations/org-slug/performance/mobile/screens/', query: {spansSort: '-ttid_contribution_rate()'}, search: '', state: undefined, } as Location); render( , {organization} ); const header = await screen.findAllByTestId('grid-head-row'); const headerCells = within(header[0]).getAllByTestId('grid-head-cell'); const headerCell = headerCells[4]; expect(headerCell).toHaveTextContent('Affects TTID'); expect(await screen.findByRole('link', {name: 'Affects TTID'})).toHaveAttribute( 'href', '/organizations/org-slug/performance/mobile/screens/?spansSort=-ttfd_contribution_rate%28%29' ); }); });