import moment from 'moment'; import {mountWithTheme} from 'sentry-test/enzyme'; import {trackAnalyticsEvent} from 'sentry/utils/analytics'; import ConfigureDistributedTracing from 'sentry/views/organizationGroupDetails/quickTrace/configureDistributedTracing'; jest.mock('sentry/utils/analytics'); describe('ConfigureDistributedTracing', function () { let putMock; const organization = TestStubs.Organization({features: ['performance-view']}); const project = TestStubs.Project({platform: 'javascript'}); const event = TestStubs.Event({ id: '2', eventID: '21098765432109876543210987654321', }); beforeEach(function () { jest.clearAllMocks(); MockApiClient.clearMockResponses(); MockApiClient.addMockResponse({ method: 'GET', url: '/prompts-activity/', body: {}, }); putMock = MockApiClient.addMockResponse({ method: 'PUT', url: '/prompts-activity/', }); }); it('renders basic UI', async function () { const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(true); expect(wrapper.find('Hovercard').exists()).toBe(true); }); it('renders hover card when feature is disabled', async function () { const newOrganization = TestStubs.Organization(); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(true); expect(wrapper.find('Hovercard').exists()).toBe(true); }); /** * Want to alternate between showing the configure suspect commits prompt and * the show configure distributed tracing prompt. */ it('doesnt render when event id starts with odd char', async function () { const newEvent = TestStubs.Event({ id: 'B', eventID: 'BAFEDCBAFEDCBAFEDCBAFEDCBAFEDCBA', }); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); }); it('doesnt render when the project platform doesnt support tracing', async function () { const newProject = TestStubs.Project({platform: ''}); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); }); it('can be snoozed', async function () { const wrapper = mountWithTheme( ); await tick(); wrapper.update(); wrapper.find('button[aria-label="Snooze"]').first().simulate('click'); await tick(); wrapper.update(); expect(putMock).toHaveBeenCalledWith( '/prompts-activity/', expect.objectContaining({ method: 'PUT', data: { organization_id: organization.id, project_id: project.id, feature: 'distributed_tracing', status: 'snoozed', }, }) ); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); expect(trackAnalyticsEvent).toHaveBeenCalledWith({ eventKey: 'quick_trace.missing_instrumentation.snoozed', eventName: 'Quick Trace: Missing Instrumentation Snoozed', organization_id: parseInt(organization.id, 10), project_id: parseInt(project.id, 10), platform: project.platform, }); }); it('does not render when snoozed', async function () { const snoozed_ts = moment().subtract(1, 'day').unix(); MockApiClient.addMockResponse({ method: 'GET', url: '/prompts-activity/', body: {data: {snoozed_ts}}, }); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); }); it('can be dismissed', async function () { const wrapper = mountWithTheme( ); await tick(); wrapper.update(); wrapper.find('button[aria-label="Dismiss"]').first().simulate('click'); await tick(); wrapper.update(); expect(putMock).toHaveBeenCalledWith( '/prompts-activity/', expect.objectContaining({ method: 'PUT', data: { organization_id: organization.id, project_id: project.id, feature: 'distributed_tracing', status: 'dismissed', }, }) ); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); expect(trackAnalyticsEvent).toHaveBeenCalledWith({ eventKey: 'quick_trace.missing_instrumentation.dismissed', eventName: 'Quick Trace: Missing Instrumentation Dismissed', organization_id: parseInt(organization.id, 10), project_id: parseInt(project.id, 10), platform: project.platform, }); }); it('does not render when dismissed', async function () { MockApiClient.addMockResponse({ method: 'GET', url: '/prompts-activity/', body: {data: {dismissed_ts: moment().unix()}}, }); const wrapper = mountWithTheme( ); await tick(); wrapper.update(); expect(wrapper.find('ExampleQuickTracePanel').exists()).toBe(false); }); it('can capture analytics on docs click', async function () { const wrapper = mountWithTheme( ); await tick(); wrapper.update(); wrapper.find('[aria-label="Read the docs"]').first().simulate('click'); expect(trackAnalyticsEvent).toHaveBeenCalledWith({ eventKey: 'quick_trace.missing_instrumentation.docs', eventName: 'Quick Trace: Missing Instrumentation Docs', organization_id: parseInt(organization.id, 10), project_id: parseInt(project.id, 10), platform: project.platform, }); }); });