import { LocalEvent } from "../commons/types/local-event"; import { PageType } from "../commons/types/page-type"; import { CookieUtils } from "../commons/utils/cookie-utils"; import { EventEmitter } from "../commons/utils/event-emitter"; import { EventType } from "../event/core/event"; import { GARunner } from "./ga-runner"; beforeEach(() => { EventEmitter.off(LocalEvent.EventPush); EventEmitter.off(LocalEvent.EventBatch); CookieUtils.set = jest.fn(); (CookieUtils.set as jest.Mock).mockClear(); CookieUtils.get = jest.fn(); (CookieUtils.get as jest.Mock).mockClear(); let cookie: string; (CookieUtils.set as jest.Mock).mockImplementation((_, value) => (cookie = value)); (CookieUtils.get as jest.Mock).mockImplementation(() => cookie); window.dataLayer = []; }); test("when bfront click is triggered should save conversion cookie for front", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.FrontClick, page: PageType.Home, area: "ONE", storefront: "BestChoice", product: "105", }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(CookieUtils.set).toHaveBeenCalledTimes(1); expect(CookieUtils.set).toHaveBeenCalledWith( expect.any(String), btoa(JSON.stringify({ front: true, search: false })), expect.any(Object), ); }); test("when bsearch click is triggered should save conversion cookie for search", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.SearchClick, product: "105", text: "sapato", }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(CookieUtils.set).toHaveBeenCalledTimes(1); expect(CookieUtils.set).toHaveBeenCalledWith( expect.any(String), btoa(JSON.stringify({ front: false, search: true })), expect.any(Object), ); }); test("when bsearch and bfront click is triggered should save conversion cookie for both", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.SearchClick, product: "105", text: "sapato", }); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.FrontClick, page: PageType.Home, area: "ONE", storefront: "BestChoice", product: "105", }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(CookieUtils.set).toHaveBeenCalledTimes(2); expect(CookieUtils.set).toHaveBeenLastCalledWith( expect.any(String), btoa(JSON.stringify({ front: true, search: true })), expect.any(Object), ); }); test("when user buys something but is not a search/front conversion should not push conversion event to dataLayer", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.PageConfirmation, }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(window.dataLayer).toHaveLength(0); }); test("when user buys something and has clicked in bfront this session should push conversion event to dataLayer", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.SearchClick, product: "105", text: "sapato", }); EventEmitter.trigger(LocalEvent.EventPush, { type: EventType.PageConfirmation, order: "5", }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(CookieUtils.set).toHaveBeenCalledTimes(2); expect(CookieUtils.set).toHaveBeenLastCalledWith( expect.any(String), btoa(JSON.stringify({ front: false, search: true })), expect.any(Object), ); expect(window.dataLayer).not.toHaveLength(0); expect(window.dataLayer).toContainEqual({ event: "biggy.search.conversion", }); }); test("should work on batch events", async () => { await new GARunner().start(); EventEmitter.trigger(LocalEvent.EventBatch, { events: [ { type: EventType.SearchClick, product: "105", text: "sapato", }, { type: EventType.FrontClick, page: PageType.Home, area: "ONE", storefront: "BestChoice", product: "105", }, { type: EventType.PageConfirmation, order: "5", }, ], }); // Wait for all events to be processed. await new Promise((resolve) => setTimeout(resolve, 1000)); expect(CookieUtils.set).toHaveBeenCalledTimes(3); expect(CookieUtils.set).toHaveBeenLastCalledWith( expect.any(String), btoa(JSON.stringify({ front: true, search: true })), expect.any(Object), ); expect(window.dataLayer).not.toHaveLength(0); expect(window.dataLayer).toContainEqual({ event: "biggy.search.conversion", }); expect(window.dataLayer).toContainEqual({ event: "biggy.front.conversion", }); });