UNPKG

@causalfoundry/js-sdk

Version:

Causal Foundry WEB SDK (JS/TS)

263 lines (220 loc) 7.52 kB
/** * @jest-environment jsdom */ import CfCore from "../../../core/CfCore"; import ECommerce from ".."; import { ECommerceTypes, CancelCheckoutProperties, CancelType, } from "../typings"; import { ICatalogRepository } from "../../../core/repositories/catalog/CatalogRepository"; import { ContentBlock } from "../../Navigation/typings"; let windowSpy; let mockSender; let mockImpressionManager = { on: () => {}, }; let mockCatalogRepository: ICatalogRepository = { injectBlood: (itemId: string, properties: any) => new Promise((r) => r()), injectDrug: (itemId: string, properties: any) => new Promise((r) => r()), injectMedicalEquipment: (itemId: string, properties: any) => new Promise((r) => r()), injectOxygen: (itemId: string, properties: any) => new Promise((r) => r()), injectMedia: (properties: any) => {}, injectFacility: (itemId: string, properties: any) => new Promise((r) => r()), injectGrocery: (itemId: string, properties: any) => new Promise((r) => r()), injectUser: (properties: any) => new Promise((r) => r()), injectSurvey: (subjectId: string, properties: any) => new Promise((r) => r()), injectReward: (subjectId: string, properties: any) => new Promise((r) => r()), injectHCW: (properties: any) => new Promise((r) => r()), injectPatient: (properties: any) => new Promise((r) => r()), injectSite: (properties: any) => new Promise((r) => r()), }; const device_id = "asdf"; describe("ECommerce", () => { beforeAll(() => { ECommerce.init(mockCatalogRepository); }); beforeEach(() => { mockSender = { add() { return false; }, sendException() { return false; }, }; windowSpy = jest.spyOn(window, "window", "get"); }); afterEach(() => { // to remove the singleton instance (CfCore as any).instance = null; }); it('Should deliver a "CancelCheckout" event', async () => { const senderSpy = jest.spyOn(mockSender, "add"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: CancelType.Cart, items: ["item1", "item2"], reason: "User requested cancellation", }; await ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true); expect(senderSpy).toHaveBeenCalledWith( expect.stringMatching(device_id), expect.stringMatching(device_id), expect.objectContaining({ name: ECommerceTypes.CancelCheckout, ctx: { ...event }, }), true, expect.anything() ); }); it("Should throw exception when cancel_type_id is missing", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: undefined as any, // Missing cancel_type_id type: CancelType.Cart, items: ["item1", "item2"], reason: "User requested cancellation", }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); it("Should throw exception when type is missing", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: undefined as any, // Missing type items: ["item1", "item2"], reason: "User requested cancellation", }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); it("Should throw exception when items is missing", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: CancelType.Cart, items: undefined as any, // Missing items reason: "User requested cancellation", }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); it("Should throw exception when reason is missing", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: CancelType.Cart, items: ["item1", "item2"], reason: undefined as any, // Missing reason }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); it("Should throw exception when items array is empty", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: CancelType.Cart, items: [], // Empty items array reason: "User requested cancellation", }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); it("Should throw exception when items array contains repeated ids", async () => { const addSpy = jest.spyOn(mockSender, "add"); const sendExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: CancelCheckoutProperties = { cancel_type_id: "cancel_123", type: CancelType.Cart, items: ["item1", "item2", "item1"], // Repeated item1 reason: "User requested cancellation", }; await expect( ECommerce.logIngestEvent(ECommerceTypes.CancelCheckout, event, true) ).rejects.toThrow(); expect(addSpy).not.toHaveBeenCalled(); expect(sendExceptionSpy).toHaveBeenCalled(); }); });