UNPKG

@benshi.ai/js-sdk

Version:

Benshi SDK

188 lines (150 loc) 5.58 kB
/** * @jest-environment jsdom */ const fs = require('fs') const yaml = require('js-yaml'); var beautify = require("json-beautify"); import Ajv from 'ajv' import ECommerce from ".." import { CartAction, DeliveryAction, DrugProperties, ECommerceTypes, ItemAction, ListAction, ListType, ItemType, StockStatus } from "../typings"; import { ICurrencyRepository } from "../../../core/repositories/currency/CurrencyRepository" import { CurrencyCode } from "../../../core/commonTypes"; import { AudioVideoType, ContentBlock, MediaData, UserProperties } from "../../Navigation/typings"; import { ICatalogRepository } from "../../../core/repositories/catalog/CatalogRepository"; import BsCore from "../../../core/BsCore"; let mockCatalogRepository: ICatalogRepository; let windowSpy let mockSender; let mockImpressionManager = { on: () => { } }; describe('ECommerce - API', () => { let schemaValidate; const device_id = 'asdf' beforeAll(() => { const schemaPath = `${__dirname}/../../../../scripts/standardized-schema.json` const jsonSchema = fs.readFileSync(schemaPath, 'utf8') const ajv = new Ajv() schemaValidate = ajv.compile(JSON.parse(jsonSchema)) mockSender = { add() { return false } } const mockCurrencyRepository: ICurrencyRepository = { convertCurrencyToUSD: (currency: CurrencyCode) => new Promise(r => r({ date: '2022-10-02', usd: 2 })) } mockCatalogRepository = { injectDrug: (userId: string, properties: DrugProperties) => new Promise(r => r()), injectUser: (userId: string, properties: UserProperties) => new Promise(r => r()), injectMedia: (id: string, type: AudioVideoType, properties: MediaData | {}) => {} } ECommerce.init(mockCurrencyRepository, mockCatalogRepository) }) beforeEach(() => { windowSpy = jest.spyOn(window, "window", "get"); }) afterEach(() => { // to remove the singleton instance (BsCore as any).instance = null }) it('Should deliver a "Checkout" event with the correct format', async () => { const senderSpy = jest.spyOn(mockSender, 'add') const bsCore = BsCore.createInstance(mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id) const event = { id: "1", cart_price: 10, currency: CurrencyCode.EUR, tax: 0, 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.logCheckoutEvent(event) const valid = schemaValidate(senderSpy.mock.calls[0][2]) expect(valid).toEqual(true) }) it('Should deliver a "Delivery" event', () => { const senderSpy = jest.spyOn(mockSender, 'add') const bsCore = BsCore.createInstance(mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id) const event = { id: "1", action: DeliveryAction.Delivered, order_id: '11', } ECommerce.logDeliveryEvent(event) const valid = schemaValidate(senderSpy.mock.calls[0][2]) expect(valid).toEqual(true) }) it('Should deliver a "Cart" event', async () => { const senderSpy = jest.spyOn(mockSender, 'add') const bsCore = BsCore.createInstance( mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id) const event = { id: "1", action: CartAction.AddItem, cart_price: 10, currency: CurrencyCode.EUR, item: { id: '111', type: ItemType.Drug, price: 90, quantity: 1, promo_id: '11111', currency: CurrencyCode.EUR, stock_status: StockStatus.InStock }, } await ECommerce.logCartEvent(event) const valid = schemaValidate(senderSpy.mock.calls[0][2]) if (!valid) { console.log(beautify(senderSpy.mock.calls[0][2], null, 2, 80)) console.log(schemaValidate.errors) } expect(valid).toEqual(true) }) it('Should deliver an "Item" event', async () => { const senderSpy = jest.spyOn(mockSender, 'add') const bsCore = BsCore.createInstance(mockSender as any, mockImpressionManager as any, false, ContentBlock.Core, device_id) const event = { action: ItemAction.View, item: { id: '111', type: ItemType.Drug, quantity: 2, price: 100, currency: CurrencyCode.FKP, stock_status: StockStatus.InStock, promo_id: 'asdf' }, search_id: "1" } await ECommerce.logItemEvent(event, {}) const valid = schemaValidate(senderSpy.mock.calls[0][2]) if (!valid) { console.log(beautify(senderSpy.mock.calls[0][2], null, 2, 80)) console.log(schemaValidate.errors) } expect(valid).toEqual(true) }) })