@causalfoundry/js-sdk
Version:
Causal Foundry WEB SDK (JS/TS)
255 lines (224 loc) • 6.01 kB
text/typescript
/**
* @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();
});
});