import {ProjectFixture} from 'sentry-fixture/project';
import {render, screen} from 'sentry-test/reactTestingLibrary';
import type {Project} from 'sentry/types/project';
import usePageFilters from 'sentry/utils/usePageFilters';
import {useReleaseSelection} from 'sentry/views/insights/common/queries/useReleases';
import {UIScreens} from 'sentry/views/insights/mobile/ui/components/uiScreens';
import {Referrer} from 'sentry/views/insights/mobile/ui/referrers';
jest.mock('sentry/utils/usePageFilters');
jest.mock('sentry/views/insights/common/queries/useReleases');
jest.mocked(useReleaseSelection).mockReturnValue({
primaryRelease: 'com.example.vu.android@2.10.5',
isLoading: false,
secondaryRelease: 'com.example.vu.android@2.10.3+42',
});
const createMockTablePayload = ({
transaction,
project,
}: {
project: Project;
transaction: string;
}) => ({
'avg_compare(mobile.frames_delay,release,com.example.vu.android@2.10.5,com.example.vu.android@2.10.3+42)':
null,
'avg_if(mobile.frames_delay,release,com.example.vu.android@2.10.5)': 0,
'avg_if(mobile.frames_delay,release,com.example.vu.android@2.10.3+42)': 0.259326119,
'division_if(mobile.frozen_frames,mobile.total_frames,release,com.example.vu.android@2.10.5)': 0,
'division_if(mobile.frozen_frames,mobile.total_frames,release,com.example.vu.android@2.10.3+42)': 0,
'division_if(mobile.slow_frames,mobile.total_frames,release,com.example.vu.android@2.10.5)': 0,
'division_if(mobile.slow_frames,mobile.total_frames,release,com.example.vu.android@2.10.3+42)': 2,
'project.id': project.id,
transaction,
});
describe('Performance Mobile UI Screens', () => {
const project = ProjectFixture({platform: 'apple-ios'});
beforeEach(() => {
MockApiClient.clearMockResponses();
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: [parseInt(project.id, 10)],
},
});
});
it('queries for the correct table data', async () => {
const tableRequestMock = MockApiClient.addMockResponse({
url: '/organizations/org-slug/events/',
body: [],
match: [MockApiClient.matchQuery({referrer: Referrer.OVERVIEW_SCREENS_TABLE})],
});
render();
expect(await screen.findByRole('columnheader', {name: 'Screen'})).toBeInTheDocument();
[
'Slow (R1)',
'Slow (R2)',
'Frozen (R1)',
'Frozen (R2)',
'Delay (R1)',
'Delay (R2)',
].forEach(header => {
expect(screen.getByRole('columnheader', {name: header})).toBeInTheDocument();
});
expect(tableRequestMock).toHaveBeenCalledWith(
'/organizations/org-slug/events/',
expect.objectContaining({
query: expect.objectContaining({
field: [
'project.id',
'transaction',
'division_if(mobile.slow_frames,mobile.total_frames,release,com.example.vu.android@2.10.5)',
'division_if(mobile.slow_frames,mobile.total_frames,release,com.example.vu.android@2.10.3+42)',
'division_if(mobile.frozen_frames,mobile.total_frames,release,com.example.vu.android@2.10.5)',
'division_if(mobile.frozen_frames,mobile.total_frames,release,com.example.vu.android@2.10.3+42)',
'avg_if(mobile.frames_delay,release,com.example.vu.android@2.10.5)',
'avg_if(mobile.frames_delay,release,com.example.vu.android@2.10.3+42)',
'avg_compare(mobile.frames_delay,release,com.example.vu.android@2.10.5,com.example.vu.android@2.10.3+42)',
],
}),
})
);
});
it('queries for the correct chart data using the top transactions', async () => {
MockApiClient.addMockResponse({
url: '/organizations/org-slug/events/',
body: {
data: [
createMockTablePayload({transaction: 'top 1', project}),
createMockTablePayload({transaction: 'top 2', project}),
createMockTablePayload({transaction: 'top 3', project}),
createMockTablePayload({transaction: 'top 4', project}),
createMockTablePayload({transaction: 'top 5', project}),
createMockTablePayload({transaction: 'top 6', project}), // excluded
],
},
match: [MockApiClient.matchQuery({referrer: Referrer.OVERVIEW_SCREENS_TABLE})],
});
const chartDataRequest = MockApiClient.addMockResponse({
url: '/organizations/org-slug/events/',
body: [],
match: [MockApiClient.matchQuery({referrer: Referrer.MOBILE_UI_BAR_CHART})],
});
render();
await screen.findByText('top 1');
screen.getByText('Top 5 Screen Slow Frames');
screen.getByText('Top 5 Screen Frozen Frames');
screen.getByText('Top 5 Screen Frames Delay');
expect(chartDataRequest).toHaveBeenCalledWith(
'/organizations/org-slug/events/',
expect.objectContaining({
query: expect.objectContaining({
field: [
'transaction',
'release',
'avg(mobile.slow_frames)',
'avg(mobile.frozen_frames)',
'avg(mobile.frames_delay)',
],
query:
'( release:com.example.vu.android@2.10.5 OR release:com.example.vu.android@2.10.3+42 ) transaction:["top 1","top 2","top 3","top 4","top 5"]',
}),
})
);
});
});