UNPKG

@causalfoundry/js-sdk

Version:

Causal Foundry WEB SDK (JS/TS)

255 lines (224 loc) 6.01 kB
/** * @jest-environment jsdom */ import CfCore from "../../../core/CfCore"; import ECommerce from ".."; import { ECommerceTypes, ItemType, StockStatus, CheckoutProperties, } from "../typings"; import { CurrencyCode } from "../../../core/commonTypes"; import { ContentBlock } from "../../Navigation/typings"; let windowSpy; let mockSender; let mockImpressionManager = { on: () => {}, }; const device_id = "asdf"; describe("ECommerce", () => { 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 "Checkout" 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: CheckoutProperties = { order_id: "1", cart_price: 10, items: [ { id: "111", price: 90, type: ItemType.Drug, quantity: 1, promo_id: "11111", currency: CurrencyCode.EUR, stock_status: StockStatus.InStock, }, ], cart_id: "11", is_successful: true, }; await ECommerce.logIngestEvent(ECommerceTypes.Checkout, event, true); expect(senderSpy).toHaveBeenCalledWith( expect.stringMatching(device_id), expect.stringMatching(device_id), expect.objectContaining({ name: ECommerceTypes.Checkout, ctx: { ...event }, }), true, expect.anything() ); }); it('Should NOT deliver a "Checkout" event when order_id is not provided', async () => { const senderSpy = jest.spyOn(mockSender, "add"); const senderExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: Partial<CheckoutProperties> = { cart_price: 10, items: [ { id: "111", price: 90, type: ItemType.Drug, quantity: 1, promo_id: "11111", currency: CurrencyCode.EUR, stock_status: StockStatus.InStock, }, ], cart_id: "11", is_successful: true, }; await expect( ECommerce.logIngestEvent( ECommerceTypes.Checkout, event as CheckoutProperties, true ) ).rejects.toThrow(); expect(senderExceptionSpy).toHaveBeenCalled(); expect(senderSpy).not.toHaveBeenCalled(); }); it('Should NOT deliver a "Checkout" event when cart_id is not provided', async () => { const senderSpy = jest.spyOn(mockSender, "add"); const senderExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: Partial<CheckoutProperties> = { order_id: "1", cart_price: 10, items: [ { id: "111", price: 90, type: ItemType.Drug, quantity: 1, promo_id: "11111", currency: CurrencyCode.EUR, stock_status: StockStatus.InStock, }, ], is_successful: true, }; await expect( ECommerce.logIngestEvent( ECommerceTypes.Checkout, event as CheckoutProperties, true ) ).rejects.toThrow(); expect(senderExceptionSpy).toHaveBeenCalled(); expect(senderSpy).not.toHaveBeenCalled(); }); it('Should NOT deliver a "Checkout" event when items is empty', async () => { const senderSpy = jest.spyOn(mockSender, "add"); const senderExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: Partial<CheckoutProperties> = { order_id: "1", cart_price: 10, items: [], cart_id: "11", is_successful: true, }; await expect( ECommerce.logIngestEvent( ECommerceTypes.Checkout, event as CheckoutProperties, true ) ).rejects.toThrow(); expect(senderExceptionSpy).toHaveBeenCalled(); expect(senderSpy).not.toHaveBeenCalled(); }); it('Should NOT deliver a "Checkout" event when there are repeated items', async () => { const senderSpy = jest.spyOn(mockSender, "add"); const senderExceptionSpy = jest.spyOn(mockSender, "sendException"); const cfCore = CfCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id, false ); const event: Partial<CheckoutProperties> = { order_id: "1", cart_price: 10, cart_id: "11", items: [ { id: "111", price: 90, type: ItemType.Drug, quantity: 1, promo_id: "11111", currency: CurrencyCode.EUR, stock_status: StockStatus.InStock, }, { id: "111", price: 90, type: ItemType.Drug, quantity: 1, promo_id: "11111", currency: CurrencyCode.EUR, stock_status: StockStatus.InStock, }, ], is_successful: true, }; await expect( ECommerce.logIngestEvent( ECommerceTypes.Checkout, event as CheckoutProperties, true ) ).rejects.toThrow(); expect(senderExceptionSpy).toHaveBeenCalled(); expect(senderSpy).not.toHaveBeenCalled(); }); });