import {PageFiltersFixture} from 'sentry-fixture/pageFilters'; import {ProjectFixture} from 'sentry-fixture/project'; import {ProjectSdkUpdatesFixture} from 'sentry-fixture/projectSdkUpdates'; import {render, screen, waitFor} from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; import ProjectsStore from 'sentry/stores/projectsStore'; import importedUsePageFilters from 'sentry/utils/usePageFilters'; jest.mock('sentry/utils/usePageFilters'); const usePageFilters = jest.mocked(importedUsePageFilters); import {NoDataMessage} from 'sentry/views/performance/database/noDataMessage'; describe('NoDataMessage', () => { beforeEach(() => { jest.clearAllMocks(); MockApiClient.clearMockResponses(); usePageFilters.mockClear(); ProjectsStore.loadInitialData([ ProjectFixture({ name: 'Awesome API', slug: 'awesome-api', features: ['span-metrics-extraction'], }), ]); usePageFilters.mockImplementation(() => ({ selection: PageFiltersFixture({projects: [2]}), isReady: true, shouldPersist: true, pinnedFilters: new Set(), desyncedFilters: new Set(), })); }); afterEach(() => { ProjectsStore.reset(); }); it('does not show anything if there is recent data', function () { MockApiClient.addMockResponse({ url: '/organizations/org-slug/sdk-updates/', body: [], }); render(); expect( screen.queryByText(textWithMarkupMatcher('No queries found.')) ).not.toBeInTheDocument(); }); it('shows a no data message if there is no recent data', async function () { const sdkMock = MockApiClient.addMockResponse({ url: '/organizations/org-slug/sdk-updates/', body: [], }); render(); await waitFor(() => expect(sdkMock).toHaveBeenCalled()); await tick(); // There is no visual indicator, this awaits the promise resolve expect( screen.queryByText(textWithMarkupMatcher('No queries found.')) ).toBeInTheDocument(); expect( screen.queryByText( textWithMarkupMatcher('You may be missing data due to outdated SDKs') ) ).not.toBeInTheDocument(); }); it('shows a list of outdated SDKs if there is no data available and SDKs are outdated', async function () { const sdkMock = MockApiClient.addMockResponse({ url: '/organizations/org-slug/sdk-updates/', body: [ProjectSdkUpdatesFixture({projectId: '2'})], }); render(); await waitFor(() => expect(sdkMock).toHaveBeenCalled()); await tick(); // There is no visual indicator, this awaits the promise resolve expect( screen.queryByText(textWithMarkupMatcher('No queries found.')) ).toBeInTheDocument(); expect( screen.getByText( textWithMarkupMatcher('You may be missing data due to outdated SDKs') ) ).toBeInTheDocument(); expect(screen.getAllByRole('link')[1]).toHaveAttribute( 'href', '/organizations/org-slug/projects/awesome-api/' ); }); it('shows a list of denylisted projects if any are are set even if data is available', async function () { ProjectsStore.loadInitialData([ ProjectFixture({ name: 'Awful API', slug: 'awful-api', features: [], }), ]); render(); await tick(); // There is no visual indicator, this awaits the promise resolve expect( screen.getByText( textWithMarkupMatcher( 'Some of your projects have been omitted from query performance analysis' ) ) ).toBeInTheDocument(); expect(screen.getAllByRole('link')[0]).toHaveAttribute( 'href', '/organizations/org-slug/projects/awful-api/' ); }); });