import {OrganizationFixture} from 'sentry-fixture/organization'; import {ProjectFixture} from 'sentry-fixture/project'; import {render, screen, waitForElementToBeRemoved} from 'sentry-test/reactTestingLibrary'; import {textWithMarkupMatcher} from 'sentry-test/utils'; import {EntryType} from 'sentry/types/event'; import usePageFilters from 'sentry/utils/usePageFilters'; import {DatabaseSpanDescription} from 'sentry/views/insights/common/components/spanDescription'; jest.mock('sentry/utils/usePageFilters'); describe('DatabaseSpanDescription', function () { beforeEach(() => { jest.clearAllMocks(); }); const organization = OrganizationFixture(); const project = ProjectFixture(); 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: [], }, }); const groupId = '2ed2abf6ce7e3577'; const spanId = 'abfed2aabf'; const eventId = '65c7d8647b8a76ef8f4c05d41deb7860'; it('shows preliminary description if no more data is available', async function () { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: [], }); render( , {organization} ); await waitForElementToBeRemoved(() => screen.getByTestId('loading-indicator')); expect(screen.getByText('SELECT USERS FRO*')).toBeInTheDocument(); }); it('shows full query if full event is available', async function () { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [ { 'transaction.id': eventId, project: project.slug, span_id: spanId, }, ], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/${project.slug}:${eventId}/`, body: { id: eventId, entries: [ { type: EntryType.SPANS, data: [ { span_id: spanId, description: 'SELECT users FROM my_table LIMIT 1;', }, ], }, ], }, }); render( , {organization} ); await waitForElementToBeRemoved(() => screen.getByTestId('loading-indicator')); expect( await screen.findByText('SELECT users FROM my_table LIMIT 1;') ).toBeInTheDocument(); }); it('shows query source if available', async function () { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [ { 'transaction.id': eventId, project: project.slug, span_id: spanId, }, ], }, }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/${project.slug}:${eventId}/`, body: { id: eventId, entries: [ { type: EntryType.SPANS, data: [ { span_id: spanId, description: 'SELECT users FROM my_table LIMIT 1;', data: { 'code.filepath': '/app/views/users.py', 'code.lineno': 78, }, }, ], }, ], }, }); render( , {organization} ); await waitForElementToBeRemoved(() => screen.getByTestId('loading-indicator')); expect( await screen.findByText('SELECT users FROM my_table LIMIT 1;') ).toBeInTheDocument(); expect( screen.getByText(textWithMarkupMatcher('/app/views/users.py at line 78')) ).toBeInTheDocument(); }); it('correctly formats and displays MongoDB queries', async function () { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: { data: [ { 'transaction.id': eventId, project: project.slug, span_id: spanId, }, ], }, }); const sampleMongoDBQuery = `{"a": "?", "insert": "documents"}`; MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/${project.slug}:${eventId}/`, body: { id: eventId, entries: [ { type: EntryType.SPANS, data: [ { span_id: spanId, description: sampleMongoDBQuery, data: { 'db.system': 'mongodb', }, }, ], }, ], }, }); render( , {organization} ); await waitForElementToBeRemoved(() => screen.getByTestId('loading-indicator')); // expect(await screen.findBy).toBeInTheDocument(); const mongoQuerySnippet = await screen.findByText( /\{ "a": "\?", "insert": "documents" \}/i ); expect(mongoQuerySnippet).toBeInTheDocument(); expect(mongoQuerySnippet).toHaveClass('language-json'); }); });