import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {render, screen} from 'sentry-test/reactTestingLibrary'; import {PageAlert, PageAlertProvider} from 'sentry/utils/performance/contexts/pageAlert'; import usePageFilters from 'sentry/utils/usePageFilters'; import useProjects from 'sentry/utils/useProjects'; import {PlatformCompatibilityChecker} from 'sentry/views/performance/platformCompatibilityChecker'; jest.mock('sentry/utils/useProjects'); jest.mock('sentry/utils/usePageFilters'); describe('PlatformCompatibilityChecker', () => { let organization; beforeEach(() => { MockApiClient.clearMockResponses(); jest.mocked(useProjects).mockReturnValue({ projects: [ ProjectFixture({id: '1'}), ProjectFixture({id: '2', slug: 'incompatible'}), ], onSearch: jest.fn(), placeholders: [], fetching: false, hasMore: null, fetchError: null, initiallyLoaded: false, }); 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: [1], }, }); organization = OrganizationFixture(); }); it('renders the children if all projects are compatible', async () => { // Incompatible projects response MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [], }, }); render(
Child
); expect(await screen.findByText('Child')).toBeInTheDocument(); }); it('does not render the children if all selected projects are incompatible', async () => { 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: [2], }, }); // Incompatible projects response MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [{project_id: 2, 'sdk.name': 'incompatible', count: 1}], }, }); render(
Child
); expect( await screen.findByText( /The following selected projects contain data from SDKs that are not supported by this view: incompatible/ ) ).toBeInTheDocument(); expect( screen.getByText(/The currently supported SDK platforms are: foobar/) ).toBeInTheDocument(); expect(screen.queryByText('Child')).not.toBeInTheDocument(); }); it('renders the children and a warning message if some projects are incompatible', async () => { 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: [1, 2], }, }); // Incompatible projects response MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [{project_id: 2, 'sdk.name': 'incompatible', count: 1}], }, }); render(
Child
); expect( await screen.findByText( /The following selected projects contain data from SDKs that are not supported by this view: incompatible/ ) ).toBeInTheDocument(); expect(await screen.findByText('Child')).toBeInTheDocument(); }); it('handles all project selection', async () => { 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: [], }, }); // Incompatible projects response MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [{project_id: 2, 'sdk.name': 'incompatible', count: 1}], }, }); render(
Child
); expect( await screen.findByText( /The following selected projects contain data from SDKs that are not supported by this view: incompatible/ ) ).toBeInTheDocument(); expect(await screen.findByText('Child')).toBeInTheDocument(); }); });