import {QueryClient, QueryClientProvider} from '@tanstack/react-query'; import {addMetricsDataMock} from 'sentry-test/performance/addMetricsDataMock'; import {initializeData} from 'sentry-test/performance/initializePerformanceData'; import {act, render, screen} from 'sentry-test/reactTestingLibrary'; import TeamStore from 'sentry/stores/teamStore'; import {MetricsCardinalityProvider} from 'sentry/utils/performance/contexts/metricsCardinality'; import {OrganizationContext} from 'sentry/views/organizationContext'; import {generatePerformanceEventView} from 'sentry/views/performance/data'; import {PerformanceLanding} from 'sentry/views/performance/landing'; const WrappedComponent = ({data, withStaticFilters = true}) => { const eventView = generatePerformanceEventView(data.router.location, data.projects, { withStaticFilters, }); const client = new QueryClient(); return ( {}} handleTrendsClick={() => {}} setError={() => {}} withStaticFilters={withStaticFilters} /> ); }; const features = [ 'performance-transaction-name-only-search', 'organizations:performance-transaction-name-only-search', ]; describe('Performance > Landing > MetricsDataSwitcher', function () { let wrapper: any; act(() => void TeamStore.loadInitialData([], false, null)); beforeEach(function () { // @ts-ignore no-console // eslint-disable-next-line no-console jest.spyOn(console, 'error').mockImplementation(jest.fn()); MockApiClient.addMockResponse({ url: '/organizations/org-slug/sdk-updates/', body: [], }); MockApiClient.addMockResponse({ url: '/prompts-activity/', body: {}, }); MockApiClient.addMockResponse({ url: '/organizations/org-slug/projects/', body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/key-transactions-list/`, body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/legacy-key-transactions-count/`, body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/events-stats/`, body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/events-trends-stats/`, body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/events-histogram/`, body: [], }); MockApiClient.addMockResponse({ method: 'GET', url: `/organizations/org-slug/eventsv2/`, body: { meta: { id: 'string', }, data: [ { id: '1234', }, ], }, }); }); afterEach(function () { MockApiClient.clearMockResponses(); // @ts-ignore no-console // eslint-disable-next-line no-console console.error.mockRestore(); if (wrapper) { wrapper.unmount(); wrapper = undefined; } }); it('renders basic UI elements', function () { addMetricsDataMock(); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(screen.getByTestId('performance-landing-v3')).toBeInTheDocument(); }); it('renders with feature flag and all metric data', async function () { addMetricsDataMock(); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('transaction-search-bar')).toBeInTheDocument(); }); it('renders with feature flag and no metrics data', async function () { addMetricsDataMock({ metricsCount: 0, nullCount: 0, unparamCount: 0, }); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('smart-search-bar')).toBeInTheDocument(); }); it('renders with feature flag and checking dynamic sampled projects exist', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 0, unparamCount: 0, }); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('transaction-search-bar')).toBeInTheDocument(); }); it('renders with feature flag and any incompatible data', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 1, unparamCount: 0, }); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('smart-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-single-project-incompatible') ).toBeInTheDocument(); }); it('renders with feature flag and any incompatible transactions on multiple projects with at least one compatible project', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 1, unparamCount: 0, compatibleProjects: [1], }); const project = TestStubs.Project({id: 1}); const project2 = TestStubs.Project({id: 2}); const data = initializeData({ project: '-1', projects: [project, project2], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('smart-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-multi-project-incompatible') ).toBeInTheDocument(); }); it('renders with feature flag and any incompatible transactions on multiple projects with no compatible project', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 1, unparamCount: 0, compatibleProjects: [], }); const project = TestStubs.Project({id: 1}); const project2 = TestStubs.Project({id: 2}); const data = initializeData({ project: '-1', projects: [project, project2], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('smart-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-multi-project-all-incompatible') ).toBeInTheDocument(); }); it('renders with feature flag and all other(unparam) transactions', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 0, unparamCount: 100, }); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('smart-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-unnamed-discover') ).toBeInTheDocument(); }); it('renders with feature flag and partial other(unparam) transactions and platform with docs', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 0, unparamCount: 1, }); const platformWithDocs = 'javascript.react'; const project = TestStubs.Project({platform: platformWithDocs}); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('transaction-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-unnamed-discover-or-set') ).toBeInTheDocument(); }); it('renders with feature flag and partial other(unparam) transactions', async function () { addMetricsDataMock({ metricsCount: 100, nullCount: 0, unparamCount: 1, }); const project = TestStubs.Project(); const data = initializeData({ project: project.id, projects: [project], features, }); wrapper = render(, data.routerContext); expect(await screen.findByTestId('transaction-search-bar')).toBeInTheDocument(); expect( await screen.findByTestId('landing-mep-alert-unnamed-discover') ).toBeInTheDocument(); }); });