import {OrganizationFixture} from 'sentry-fixture/organization'; import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary'; import {useLocation} from 'sentry/utils/useLocation'; import usePageFilters from 'sentry/utils/usePageFilters'; import PageOverview from 'sentry/views/performance/browser/webVitals/pageOverview'; jest.mock('sentry/utils/useLocation'); jest.mock('sentry/utils/usePageFilters'); describe('PageOverview', function () { const organization = OrganizationFixture({ features: ['spans-first-ui'], }); let eventsMock; beforeEach(function () { jest.mocked(useLocation).mockReturnValue({ pathname: '', search: '', query: {}, hash: '', state: undefined, action: 'PUSH', key: '', }); 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: [], }, }); eventsMock = MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events-stats/`, body: {}, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/spans-aggregation/`, body: {}, }); }); afterEach(function () { jest.clearAllMocks(); }); it('renders FID deprecation alert', async () => { jest.mocked(useLocation).mockReturnValue({ pathname: '', search: '', query: {useStoredScores: 'true', transaction: '/'}, hash: '', state: undefined, action: 'PUSH', key: '', }); render(, {organization}); await screen.findByText(/\(Interaction to Next Paint\) will replace/); await screen.findByText( /\(First Input Delay\) in our performance score calculation./ ); }); it('renders interaction samples', async () => { const organizationWithInp = OrganizationFixture({ features: ['spans-first-ui'], }); jest.mocked(useLocation).mockReturnValue({ pathname: '', search: '', query: {useStoredScores: 'true', transaction: '/', type: 'interactions'}, hash: '', state: undefined, action: 'PUSH', key: '', }); render(, {organization: organizationWithInp}); await waitFor(() => expect(eventsMock).toHaveBeenCalledWith( '/organizations/org-slug/events/', expect.objectContaining({ query: expect.objectContaining({ dataset: 'spansIndexed', field: [ 'measurements.inp', 'measurements.score.inp', 'measurements.score.weight.inp', 'measurements.score.total', 'span_id', 'timestamp', 'profile_id', 'replay.id', 'user', 'origin.transaction', 'project', 'browser.name', 'span.self_time', 'span.description', ], query: 'span.op:ui.interaction.click measurements.score.weight.inp:>0 origin.transaction:/', }), }) ) ); }); it('escapes transaction name before querying discover', async () => { const organizationWithInp = OrganizationFixture({ features: ['spans-first-ui'], }); jest.mocked(useLocation).mockReturnValue({ pathname: '', search: '', query: { useStoredScores: 'true', transaction: '/page-with-a-*/', type: 'interactions', }, hash: '', state: undefined, action: 'PUSH', key: '', }); render(, {organization: organizationWithInp}); await waitFor(() => expect(eventsMock).toHaveBeenCalledWith( '/organizations/org-slug/events/', expect.objectContaining({ query: expect.objectContaining({ dataset: 'spansIndexed', field: [ 'measurements.inp', 'measurements.score.inp', 'measurements.score.weight.inp', 'measurements.score.total', 'span_id', 'timestamp', 'profile_id', 'replay.id', 'user', 'origin.transaction', 'project', 'browser.name', 'span.self_time', 'span.description', ], query: 'span.op:ui.interaction.click measurements.score.weight.inp:>0 origin.transaction:"/page-with-a-\\*/"', }), }) ) ); }); });