import type { RumEvent } from '@datadog/browser-rum'; import { getInitAllowedTracingUrls, isAllowedTracingUrl, minimalApplication, processEvent, resetSharedImpl, } from '../__mocks__'; import { init, RumServiceRegistration } from '../init'; jest.mock('@datadog/browser-rum'); describe('[datadog-rum] integration', () => { const serviceContext = { logicalEnv: 'go5', orgId: '42' }; const applicationBeforeSendHandler = jest.fn(); let event: Partial; beforeEach(() => { jest.clearAllMocks(); resetSharedImpl(); applicationBeforeSendHandler.mockReturnValue(true); init({ service: { name: 'desktop' }, application: { ...minimalApplication, beforeSend: applicationBeforeSendHandler }, }); event = { type: 'error', error: { message: 'boom', stack: 'at https://unpkg.servicetitan.com/@servicetitan/task-hub@1.2.3/main.js', } as any, }; }); const subject = () => processEvent(event); test('passes event through the pipeline', () => { expect(subject()).toBe(true); }); test('sets event service and version', () => { subject(); expect(event.service).toBe('task-hub'); expect(event.version).toBe('1.2.3'); }); describe('when application handler returns false', () => { beforeEach(() => applicationBeforeSendHandler.mockReturnValue(false)); test('drops the event', () => { expect(subject()).toBe(false); }); }); describe('with service handler', () => { let serviceBeforeSendHandler: jest.Mock; let serviceRegistration: RumServiceRegistration; beforeEach(() => { serviceBeforeSendHandler = jest.fn(e => { e.context = { ...e.context, kibanaUrl: 'https://kibana/example' }; }); serviceRegistration = init({ service: { name: 'task-hub', allowedTracingUrls: { tracecontext: [/\/api\/task-hub\//] }, beforeSend: serviceBeforeSendHandler, }, }); serviceRegistration.setServiceContext(serviceContext); }); test('traces registered URLs', () => { expect( isAllowedTracingUrl( getInitAllowedTracingUrls(), 'https://go.example.com/api/task-hub/list' ) ).toBe(true); }); test('does not trace unregistered URLs', () => { expect( isAllowedTracingUrl(getInitAllowedTracingUrls(), 'https://go.example.com/api/other') ).toBe(false); }); test('runs service handlers', () => { subject(); expect(serviceBeforeSendHandler).toHaveBeenCalled(); }); test('enriches event.context', () => { subject(); expect(event.context).toEqual({ kibanaUrl: 'https://kibana/example', ...serviceContext, }); }); describe('when application handler returns false', () => { beforeEach(() => applicationBeforeSendHandler.mockReturnValue(false)); test('does not run service handlers', () => { subject(); expect(serviceBeforeSendHandler).not.toHaveBeenCalled(); }); }); describe('when service handler returns false', () => { beforeEach(() => serviceBeforeSendHandler.mockReturnValue(false)); test('passes event through the pipeline', () => { expect(subject()).toBe(true); }); }); describe('when service is unregistered', () => { beforeEach(() => serviceRegistration.cleanup()); test('stops tracing URLs', () => { subject(); expect( isAllowedTracingUrl( getInitAllowedTracingUrls(), 'https://go.example.com/api/task-hub/list' ) ).toBe(false); }); test('stops enriching event.context', () => { subject(); expect(event.context).toBeUndefined(); }); }); }); });