import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {render, screen, waitForElementToBeRemoved} from 'sentry-test/reactTestingLibrary'; import ProjectsStore from 'sentry/stores/projectsStore'; import type {DetailedOrganization} from 'sentry/types'; import {useLocation} from 'sentry/utils/useLocation'; import usePageFilters from 'sentry/utils/usePageFilters'; import SampleImages from 'sentry/views/performance/browser/resources/resourceSummaryPage/sampleImages'; import {SpanIndexedField} from 'sentry/views/starfish/types'; const {SPAN_GROUP, HTTP_RESPONSE_CONTENT_LENGTH, RAW_DOMAIN, SPAN_DESCRIPTION} = SpanIndexedField; jest.mock('sentry/utils/useLocation'); jest.mock('sentry/utils/usePageFilters'); describe('SampleImages', function () { const organization = OrganizationFixture({ features: ['starfish-view', 'spans-first-ui'], }); beforeEach(() => { setupMocks(); }); afterEach(function () { jest.resetAllMocks(); }); describe('When project setting is enabled', () => { beforeEach(() => { setupMockRequests(organization, {enableImages: true}); }); it('should render images', async () => { render(, {organization}); await waitForElementToBeRemoved(() => screen.queryAllByTestId('loading-indicator')); const sampleImages = screen.queryAllByTestId('sample-image'); expect(sampleImages[0]).toHaveAttribute('src', 'https://cdn.com/image.png'); expect(sampleImages[1]).toHaveAttribute('src', 'https://cdn.com/image2.png'); }); }); describe('When project setting is disabled', () => { beforeEach(() => { setupMockRequests(organization, {enableImages: false}); }); it('should ask to enable images', async () => { render(, {organization}); await waitForElementToBeRemoved(() => screen.queryAllByTestId('loading-indicator')); expect(screen.queryByTestId('sample-image')).not.toBeInTheDocument(); expect(screen.queryByTestId('enable-sample-images-button')).toBeInTheDocument(); }); }); }); const setupMocks = () => { const mockProjects = [ProjectFixture()]; ProjectsStore.loadInitialData(mockProjects); 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], }, }); jest.mocked(useLocation).mockReturnValue({ pathname: '', search: '', query: {statsPeriod: '10d'}, hash: '', state: undefined, action: 'PUSH', key: '', }); }; const setupMockRequests = ( organization: DetailedOrganization, settings: {enableImages: boolean} = {enableImages: true} ) => { const {enableImages} = settings; MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, method: 'GET', match: [ MockApiClient.matchQuery({referrer: 'api.performance.resources.sample-images'}), ], body: { data: [ { [SPAN_GROUP]: 'group123', [`measurements.${HTTP_RESPONSE_CONTENT_LENGTH}`]: 1234, project: 'javascript', [SPAN_DESCRIPTION]: 'https://cdn.com/image.png', 'any(id)': 'anyId123', [RAW_DOMAIN]: '', }, { [SPAN_GROUP]: 'group123', [`measurements.${HTTP_RESPONSE_CONTENT_LENGTH}`]: 1234, project: 'javascript', [SPAN_DESCRIPTION]: '/image2.png', 'any(id)': 'anyId123', [RAW_DOMAIN]: 'https://cdn.com', }, ], }, }); MockApiClient.addMockResponse({ url: `/api/0/projects/org-slug/project-slug/performance/configure/`, method: 'GET', body: { enable_images: enableImages, }, }); };