import 'reflect-metadata'; import { TrackingEventInterface, } from './../../../models/index'; import { SegmentTrackingService, } from './segment-tracking.service'; const initSegmentTrackingService = ( segmentService, ) => { return new SegmentTrackingService( segmentService, ); }; describe('sendEvent', () => { test('Sends a track event from the segment analytics service', () => { const eventDetails = { name: 'Signed Up', } as TrackingEventInterface; const globalSegmentTrackingService = { track: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendEvent(eventDetails); expect(globalSegmentTrackingService.track) .toHaveBeenCalledWith( eventDetails.name, undefined, undefined, undefined, ); }); // tslint:disable-next-line test('Sends a track event once segment has loaded', () => { jest.useFakeTimers(); const eventDetails = { name: 'Signed Up', } as TrackingEventInterface; const globalSegmentTrackingService = {}; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendEvent(eventDetails); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); globalSegmentTrackingService.track = jest.fn(); jest.runOnlyPendingTimers(); expect(globalSegmentTrackingService.track) .toHaveBeenCalledTimes(1); }); // tslint:disable-next-line test('Sends a track event from the segment analytics service, with properties if supplied', () => { const eventDetails = { name: 'Signed Up', properties: { foo: 'bar', }, } as TrackingEventInterface; const globalSegmentTrackingService = { track: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendEvent(eventDetails); expect(globalSegmentTrackingService.track) .toHaveBeenCalledWith( eventDetails.name, eventDetails.properties, undefined, undefined, ); }); // tslint:disable-next-line test('Sends a track event from the segment analytics service, with options if supplied', () => { const eventDetails = { name: 'Signed Up', options: { foo: 'bar', }, } as TrackingEventInterface; const globalSegmentTrackingService = { track: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendEvent(eventDetails); expect(globalSegmentTrackingService.track) .toHaveBeenCalledWith( eventDetails.name, undefined, eventDetails.options, undefined, ); }); }); describe('sendPage', () => { test('Sends a page event from the Segment analytics service', () => { const pageEventDetails = { name: 'page', } as TrackingEventInterface; const globalSegmentTrackingService = { page: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendPage(pageEventDetails); expect(globalSegmentTrackingService.page) .toHaveBeenCalledWith( undefined, pageEventDetails.name, undefined, undefined, undefined, ); }); // tslint:disable-next-line test('Sends a page event once segment has loaded', () => { jest.useFakeTimers(); const eventDetails = { name: 'Signed Up', } as TrackingEventInterface; const globalSegmentTrackingService = {}; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); const spy = jest.spyOn(segmentTrackingService, 'sendPage'); segmentTrackingService.sendPage(eventDetails); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); jest.runOnlyPendingTimers(); globalSegmentTrackingService.page = jest.fn(); jest.runOnlyPendingTimers(); expect(globalSegmentTrackingService.page) .toHaveBeenCalledTimes(1); }); // tslint:disable-next-line test('Sends a page event from the Segment analytics service, with category if supplied', () => { const pageEventDetails = { category: 'Foo', name: 'page', } as TrackingEventInterface; const globalSegmentTrackingService = { page: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendPage(pageEventDetails); expect(globalSegmentTrackingService.page) .toHaveBeenCalledWith( pageEventDetails.category, pageEventDetails.name, undefined, undefined, undefined, ); }); // tslint:disable-next-line test('Sends a page event from the Segment analytics service, with properties if supplied', () => { const pageEventDetails = { name: 'page', properties: { foo: 'bar', }, } as TrackingEventInterface; const globalSegmentTrackingService = { page: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendPage(pageEventDetails); expect(globalSegmentTrackingService.page) .toHaveBeenCalledWith( undefined, pageEventDetails.name, pageEventDetails.properties, undefined, undefined, ); }); // tslint:disable-next-line test('Sends a page event from the Segment analytics service, with options if supplied', () => { const pageEventDetails = { name: 'page', options: { foo: 'bar', }, } as TrackingEventInterface; const globalSegmentTrackingService = { page: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendPage(pageEventDetails); expect(globalSegmentTrackingService.page) .toHaveBeenCalledWith( undefined, pageEventDetails.name, undefined, pageEventDetails.options, undefined, ); }); // tslint:disable-next-line test('Sends a page event from the Segment analytics service, with a callback if supplied', () => { const pageEventDetails = { callback: () => 'foo', name: 'page', } as TrackingEventInterface; const globalSegmentTrackingService = { page: jest.fn(), }; const segmentTrackingService = initSegmentTrackingService(globalSegmentTrackingService); segmentTrackingService.sendPage(pageEventDetails); expect(globalSegmentTrackingService.page) .toHaveBeenCalledWith( undefined, pageEventDetails.name, undefined, undefined, pageEventDetails.callback, ); }); });