diff --git a/static/app/views/issueDetails/traceTimeline/traceTimeline.spec.tsx b/static/app/views/issueDetails/traceTimeline/traceTimeline.spec.tsx index 05102db90ffe69..ce657e2a29d17e 100644 --- a/static/app/views/issueDetails/traceTimeline/traceTimeline.spec.tsx +++ b/static/app/views/issueDetails/traceTimeline/traceTimeline.spec.tsx @@ -15,7 +15,11 @@ jest.mock('sentry/utils/routeAnalytics/useRouteAnalyticsParams'); jest.mock('sentry/utils/analytics'); describe('TraceTimeline', () => { - const organization = OrganizationFixture(); + // Paid plans have global-views enabled + // Include project: -1 in all matchQuery calls to ensure we are looking at all projects + const organization = OrganizationFixture({ + features: ['global-views'], + }); // This creates the ApiException event const event = EventFixture({ dateCreated: '2024-01-24T09:09:03+00:00', @@ -72,12 +76,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: issuePlatformBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: discoverBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); render(, {organization}); expect(await screen.findByLabelText('Current Event')).toBeInTheDocument(); @@ -94,12 +98,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: discoverBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); const {container} = render(, {organization}); await waitFor(() => @@ -115,12 +119,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); const {container} = render(, {organization}); await waitFor(() => @@ -136,12 +140,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: issuePlatformBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); render(, {organization}); // Checking for the presence of seconds @@ -152,12 +156,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: issuePlatformBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); render(, {organization}); expect(await screen.findByLabelText('Current Event')).toBeInTheDocument(); @@ -167,12 +171,12 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: issuePlatformBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); // I believe the call to projects is to determine what projects a user belongs to MockApiClient.addMockResponse({ @@ -182,7 +186,7 @@ describe('TraceTimeline', () => { render(, { organization: OrganizationFixture({ - features: ['related-issues-issue-details-page'], + features: ['related-issues-issue-details-page', 'global-views'], }), }); @@ -201,7 +205,7 @@ describe('TraceTimeline', () => { { group_id: issuePlatformBody.data[0]['issue.id'], organization: OrganizationFixture({ - features: ['related-issues-issue-details-page'], + features: ['related-issues-issue-details-page', 'global-views'], }), } ); @@ -211,13 +215,13 @@ describe('TraceTimeline', () => { MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, body: emptyBody, - match: [MockApiClient.matchQuery({dataset: 'issuePlatform'})], + match: [MockApiClient.matchQuery({dataset: 'issuePlatform', project: -1})], }); MockApiClient.addMockResponse({ url: `/organizations/${organization.slug}/events/`, // Only 1 issue body: discoverBody, - match: [MockApiClient.matchQuery({dataset: 'discover'})], + match: [MockApiClient.matchQuery({dataset: 'discover', project: -1})], }); // I believe the call to projects is to determine what projects a user belongs to MockApiClient.addMockResponse({ @@ -227,7 +231,7 @@ describe('TraceTimeline', () => { render(, { organization: OrganizationFixture({ - features: ['related-issues-issue-details-page'], + features: ['related-issues-issue-details-page', 'global-views'], }), }); @@ -244,4 +248,36 @@ describe('TraceTimeline', () => { trace_timeline_status: 'empty', }); }); + + it('works for plans with no global-views feature', async () => { + MockApiClient.addMockResponse({ + url: `/organizations/${organization.slug}/events/`, + body: issuePlatformBody, + match: [ + MockApiClient.matchQuery({ + dataset: 'issuePlatform', + // Since we don't have global-views, we only look at the current project + project: event.projectID, + }), + ], + }); + MockApiClient.addMockResponse({ + url: `/organizations/${organization.slug}/events/`, + body: emptyBody, + match: [ + MockApiClient.matchQuery({ + dataset: 'discover', + // Since we don't have global-views, we only look at the current project + project: event.projectID, + }), + ], + }); + + render(, { + organization: OrganizationFixture({ + features: [], // No global-views feature + }), + }); + expect(await screen.findByLabelText('Current Event')).toBeInTheDocument(); + }); }); diff --git a/static/app/views/issueDetails/traceTimeline/useTraceTimelineEvents.tsx b/static/app/views/issueDetails/traceTimeline/useTraceTimelineEvents.tsx index 6ccc734bde8e65..fe572bf0af236a 100644 --- a/static/app/views/issueDetails/traceTimeline/useTraceTimelineEvents.tsx +++ b/static/app/views/issueDetails/traceTimeline/useTraceTimelineEvents.tsx @@ -43,6 +43,10 @@ export function useTraceTimelineEvents({event}: UseTraceTimelineEventsOptions): traceEvents: TimelineEvent[]; } { const organization = useOrganization(); + // If the org has global views, we want to look across all projects, + // otherwise, just look at the current project. + const hasGlobalViews = organization.features.includes('global-views'); + const project = hasGlobalViews ? -1 : event.projectID; const {start, end} = getTraceTimeRangeFromEvent(event); const traceId = event.contexts?.trace?.trace_id ?? ''; @@ -65,6 +69,7 @@ export function useTraceTimelineEvents({event}: UseTraceTimelineEventsOptions): sort: '-timestamp', start, end, + project: project, }, }, ], @@ -100,6 +105,7 @@ export function useTraceTimelineEvents({event}: UseTraceTimelineEventsOptions): sort: '-timestamp', start, end, + project: project, }, }, ],