diff --git a/src/mixins/analytics-mixin.spec.js b/src/mixins/analytics-mixin.spec.js index 567d9154e..ff6c30e7e 100644 --- a/src/mixins/analytics-mixin.spec.js +++ b/src/mixins/analytics-mixin.spec.js @@ -22,6 +22,46 @@ import { getUserIdValue, } from "@/helpers/heritage-integration/cookie-helper"; +const parts = { + windshield: { + name: "windshield", + canSafeliteRecalibrate: true, + childParts: [], + color: "Green Tint", + description: + "solar, soundproofing, lane keep assist, lane departure warning system, w/adaptive cruise control", + id: "db22fd44-10dd-456f-979b-ff88cf68cca6", + partNumber: "FW04896GTYN", + partType: "WINDSHIELD", + recalibrationType: "STATIC", + requiresCapabilityQuestions: false, + requiresRecalibration: true, + salesTax: 63.86, + sellingPrice: 791.46, + }, + frontWipers: { + name: "front wipers", + partNumber: "SBB16", + description: "SAFELITE BEAM BLADE 16", + partType: "FRONT WIPER", + price: 32.64, + }, + rearWipers: { + name: "rear wipers", + partNumber: "SBBR12A", + description: "SAFELITE REAR BLADE 12A", + partType: "REAR WIPER", + price: 24.48, + }, + rainDefense: { + name: "rain defense", + partNumber: "RAIN DEFENSE", + description: null, + partType: "RAIN DEFENSE", + price: 35.5, + }, +}; + describe("analyticsMixin.js", () => { beforeEach(() => { removeAllTestCookies(); @@ -284,6 +324,130 @@ describe("analyticsMixin.js", () => { ]); }); + describe("pushSubmittedOrderToDataLayer", () => { + beforeEach(() => { + store.getters.hasSubmittedOrder = true; + store.getters.submittedOrder = { + vehicle: { + year: "2020", + make: "acura", + model: "mdx", + style: "4-door sedan", + carId: "dummyCarId", + category: "dummyCategory", + vin: "dummyVin", + }, + serviceLocation: { + address: "add1", + address2: "add2", + city: "city", + state: "state", + zipCode: "zip", + zipCodeCtu: "zipCtu", + appointmentType: "IN_SHOP", + isVehicleProtected: true, + provider: { + providerNumber: 2, + address: { + streetAddress: "add3", + city: "city2", + state: "state2", + zipCode: "zip2", + zipCodeCtu: "zipCtu2", + }, + }, + techNotes: "", + }, + customer: { + firstName: "first", + lastName: "last", + emailAddress: "builddigitaltest@safelite.com", + phoneNumber: "555-555-5555", + isSmsOptIn: false, + }, + damage: { + isRepair: false, + numberOfChips: null, + glassToReplace: [{ glassName: "single", location: "windshield" }], + }, + lineItems: { + glassParts: [parts.windshield], + supportingItems: [], + vaps: [parts.frontWipers], + promos: [{ promoCode: "promoTEST" }, { promoCode: "promoTEST2" }], + }, + payment: { + isInsurance: false, + insuranceCoverage: { + isVerified: null, + coverageStatus: null, + coverageVerificationType: null, + }, + isPia: true, + piaType: "Afterpay", + inactivePromos: [], + }, + schedule: { + date: "date", + startTime: "start", + endTime: "end", + jobMinMinutes: "30", + jobMaxMinutes: "45", + }, + workOrderNumber: "01820-111111", + workOrderId: "222222222222", + }; + }); + + test("Pushes to data layer if nominal", () => { + // Arrange + const mockDataLayerFn = jest.fn(); + + window.dataLayer = { + push: mockDataLayerFn, + }; + + // Act + analyticsMixin.methods.pushSubmittedOrderToDataLayer(); + + // Assert + expect(mockDataLayerFn).toHaveBeenCalled(); + }); + + test("Does not push to data layer if no submitted order available.", () => { + // Arrange + store.getters.hasSubmittedOrder = false; + store.getters.submittedOrder = undefined; + + const mockDataLayerFn = jest.fn(); + + window.dataLayer = { + push: mockDataLayerFn, + }; + + // Act + analyticsMixin.methods.pushSubmittedOrderToDataLayer(); + + // Assert + expect(mockDataLayerFn).not.toHaveBeenCalled(); + }); + + test("Glass and Promo strings correctly formatted", () => { + // Arrange + window.dataLayer = []; + + // Act + analyticsMixin.methods.pushSubmittedOrderToDataLayer(); + + // Assert + const glassString = window.dataLayer[0].glassToReplace; + const promoString = window.dataLayer[0].promoCodes; + + expect(glassString).toMatch(/(\w+\/\w+)?(,\w+\/\w+)*/); + expect(promoString).toMatch(/(\w+)?(,\w+)*/); + }); + }); + test("Obj is not null after action prepended", () => { //Arrange const obj = { baseMethodName: "testMethodName", data: "testData" };