diff --git a/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue b/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue index 09c7dcdb4..67ec8861b 100644 --- a/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue +++ b/src/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons.vue @@ -42,12 +42,14 @@ export default { isDisplayed() { return this.showAddRainDefense || this.showAddWipers; }, - showAddRainDefense() { // if it's not found in the cart + showAddRainDefense() { + // if it's not found in the cart return !this.cart.some((vap) => { return vap.partType === "RAIN DEFENSE"; }); }, - showAddWipers() { // if it's not found in the cart + showAddWipers() { + // if it's not found in the cart return !this.cart.some((vap) => { return vap.partType.includes(" WIPER"); }); diff --git a/src/helpers/heritage-integration/order-helper.js b/src/helpers/heritage-integration/order-helper.js index addca2d41..cb80cba86 100644 --- a/src/helpers/heritage-integration/order-helper.js +++ b/src/helpers/heritage-integration/order-helper.js @@ -72,6 +72,13 @@ export async function saveSession({ pageNameToLog, shouldAwaitSaveSessionQueue = } } +export async function submitWorkOrder({ pageNameToLog }) { + await saveSession({ + pageNameToLog: pageNameToLog, + shouldAwaitSaveSessionQueue: true, + }); +} + // PRIVATE FUNCTIONS // /* diff --git a/src/helpers/heritage-integration/order-helper.spec.js b/src/helpers/heritage-integration/order-helper.spec.js index 94e52b1dd..322d9237d 100644 --- a/src/helpers/heritage-integration/order-helper.spec.js +++ b/src/helpers/heritage-integration/order-helper.spec.js @@ -1,5 +1,9 @@ import * as cookieHelper from "@/helpers/heritage-integration/cookie-helper"; -import { loadSessionIfPresent, saveSession } from "@/helpers/heritage-integration/order-helper"; +import { + loadSessionIfPresent, + saveSession, + submitWorkOrder, +} from "@/helpers/heritage-integration/order-helper"; import { cookieNames } from "@/constants/cookie-names"; import { setupMocksForJsFiles, @@ -239,3 +243,111 @@ describe("saveSession", () => { expect(cookieHelper.getFunnelCookie().DidHeritageFunnelUpdateLast).toEqual(false); }); }); + +describe("submitWorkOrder", () => { + afterEach(() => { + removeAllTestCookies(); + }); + + test("submitWorkOrder => should set state order values", async () => { + // Arrange + const mockReferralNumber = "2"; + const mockCorrelationId = "55"; + const mockReferralDate = "2022"; + const mockParentAccountNumber = "167132"; + const mockSavedSessionId = "xxx-xxx-xxx"; + const mockCrmCustomerId = "xxx-xxx-xxx"; + + const mockOrderInfo = getMockOrderInfo( + mockReferralNumber, + mockCorrelationId, + mockReferralDate, + mockParentAccountNumber, + mockSavedSessionId, + mockCrmCustomerId + ); + + const mockData = { + actionList: [ + { + actionName: storeActions.SAVE_SESSION, + data: mockOrderInfo, + }, + { + actionName: storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE, + }, + ], + }; + + const mocks = setupMocksForJsFiles(mockData); + + // Act + await submitWorkOrder({ pageNameToLog: "test" }); + + // Assert + expect(mocks.baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledWith( + storeActions.SAVE_SESSION, + null, + "test" + ); + expect(mocks.baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith( + storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE, + { + referralNumber: mockReferralNumber, + referralDate: mockReferralDate, + referralCorrelationId: mockCorrelationId, + parentAccountNumber: mockParentAccountNumber, + savedSessionId: mockSavedSessionId, + crmCustomerId: mockCrmCustomerId, + }, + false + ); + }); + + test("submitWorkOrder => should update DidHeritageFunnelUpdateLast cookie value to false", async () => { + // Arrange + const mockReferralNumber = 1566818; + const mockReferralDate = "2022-03-15T10:56:24.597"; + const mockReferralCorrelationId = "404d2b04-f86e-45c3-b373-127b6217b060"; + const mockParentAccountNumber = "167132"; + const mockSavedSessionId = "xxx-xxx-xxx"; + const mockCrmCustomerId = "xxx-xxx-xxx"; + + const mockOrderInfo = getMockOrderInfo( + mockReferralNumber, + mockReferralCorrelationId, + mockReferralDate, + mockParentAccountNumber, + mockSavedSessionId, + mockCrmCustomerId + ); + + const mockData = { + actionList: [ + { + actionName: storeActions.SAVE_SESSION, + data: mockOrderInfo, + }, + ], + router: router, + }; + + setupMocksForJsFiles(mockData); + + const testCookieValue = { + ReferralNumber: mockReferralNumber, + ReferralDate: mockReferralDate, + ReferralCorrelationId: mockReferralCorrelationId, + ShouldResetState: false, + DidHeritageFunnelUpdateLast: true, + }; + + setupCookies({ funnelCookieValue: JSON.stringify(testCookieValue) }); + + // Act + await submitWorkOrder({ pageNameToLog: "test" }); + + // Assert + expect(cookieHelper.getFunnelCookie().DidHeritageFunnelUpdateLast).toEqual(false); + }); +}); diff --git a/src/layouts/confirmation/confirmation.vue b/src/layouts/confirmation/confirmation.vue index 6c4645901..6e913fdf5 100644 --- a/src/layouts/confirmation/confirmation.vue +++ b/src/layouts/confirmation/confirmation.vue @@ -77,7 +77,9 @@ export default { return serviceLocationReqs && scheduleReqs; }, - forwardButtonAction() {}, + forwardButtonAction() { + window.location.replace("https://safelite.com"); + }, }, components: { funnelHeader, diff --git a/src/layouts/customer-details/customer-details.vue b/src/layouts/customer-details/customer-details.vue index 03de9ff97..34a585c1e 100644 --- a/src/layouts/customer-details/customer-details.vue +++ b/src/layouts/customer-details/customer-details.vue @@ -82,7 +82,6 @@ import { routerParams } from "@/router/router-constants/router-params"; import { required, regex } from "@/helpers/validation-rules"; import { Form, defineRule } from "vee-validate"; import { useField, validate } from "vee-validate"; -import { navigateToHeritageFunnel } from "@/helpers/heritage-integration/navigation-helper"; import store from "@/store"; // DEFINE VALIDATION RULES @@ -178,7 +177,6 @@ export default { false ); - this.dispatchStoreAction(this.storeActions.SAVE_WORK_ORDER_FLAG, true, false); this.$router.navigateWithSaving(this.navigationScenarios.CLICKED_FORWARD, this.$route); }, }, diff --git a/src/layouts/payment-method/payment-method.spec.js b/src/layouts/payment-method/payment-method.spec.js index 3d0843e10..37c8c3236 100644 --- a/src/layouts/payment-method/payment-method.spec.js +++ b/src/layouts/payment-method/payment-method.spec.js @@ -1 +1,65 @@ -test.todo("some test to be written in the future"); +// Components +import customerDetails from "@/layouts/payment-method/payment-method.vue"; + +// Supporting Files +import { shallowMount } from "@vue/test-utils"; +import { getMountOptions } from "@/helpers/unit-test-helper.js"; +import store from "@/store"; + +// Mock our module for promises. +jest.mock("@/helpers/layout-helper.js", () => ({ + settleAllPromises: jest.fn(), +})); + +jest.mock("@/helpers/heritage-integration/order-helper.js", () => ({ + submitWorkOrder: jest.fn(), +})); + +describe("payment-method.vue", () => { + describe("navigation", () => { + test("if the back button is clicked, navigate back", async () => { + // Arrange + const { wrapper } = setupMocks(); + + // Act + await wrapper.vm.backButtonAction(); + + // Assert + expect(wrapper.vm.$router.navigateWithoutSaving).toHaveBeenCalled(); + }); + + test("if the continue button is clicked, navigate forward", async () => { + // Arrange + const { wrapper } = setupMocks(); + + // Act + await wrapper.vm.forwardButtonAction(); + + // Assert + expect(wrapper.vm.$router.navigateWithoutSaving).toHaveBeenCalled(); + }); + }); +}); + +function setupMocks() { + store.getters = { + damage: {}, + lineItems: [], + }; + + const wrapper = shallowMount( + customerDetails, + getMountOptions({ + router: { + navigate: jest.fn(), + navigateWithSaving: jest.fn(), + navigateWithoutSaving: jest.fn(), + }, + store: { + getters: store.getters, + }, + }) + ); + + return { wrapper }; +} diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index a99282a6a..7aadf9174 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -47,6 +47,7 @@ import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-heade import loadingModal from "@/fmg-components/loading-modal/loading-modal.vue"; import cart from "@/fmg-components/cart/cart"; import addVapsModalButtons from "@/fmg-components/add-vaps-modal-buttons/add-vaps-modal-buttons"; +import { submitWorkOrder } from "@/helpers/heritage-integration/order-helper.js"; import baseMixin from "@/mixins/base-mixin.js"; import { settleAllPromises } from "@/helpers/layout-helper"; @@ -141,9 +142,16 @@ export default { vapsItemsSelectedAction(vapsItemsSelected) { this.cartItems = vapsItemsSelected; }, - backButtonAction() {}, - forwardButtonAction() { - this.$router.navigateWithSaving(this.navigationScenarios.CLICKED_FORWARD, this.$route); + backButtonAction() { + this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); + }, + async forwardButtonAction() { + this.dispatchStoreAction(this.storeActions.SAVE_WORK_ORDER_FLAG, true, false); + await submitWorkOrder({ pageNameToLog: "payment-method" }); + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_FORWARD, + this.$route + ); }, }, computed: { diff --git a/src/layouts/review/review.vue b/src/layouts/review/review.vue index 639fd0fd5..f30f6f6ac 100644 --- a/src/layouts/review/review.vue +++ b/src/layouts/review/review.vue @@ -125,6 +125,9 @@ import { fetchCmsContentForPage } from "@/helpers/cms-content-helper"; import { settleAllPromises } from "@/helpers/layout-helper"; import store from "@/store"; +// Validation +import { Form } from "vee-validate"; + export default { name: "review", async beforeRouteEnter(to, from, next) { @@ -231,7 +234,12 @@ export default { backButtonAction() { this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); }, - forwardButtonAction() {}, + forwardButtonAction() { + this.$router.navigateWithoutSaving( + this.navigationScenarios.CLICKED_FORWARD, + this.$route + ); + }, editVehicle() { this.$router.navigateWithoutSaving( this.navigationScenarios.CLICKED_VEHICLE_EDIT, @@ -310,6 +318,7 @@ export default { serviceLocationReview, scheduleReview, customerReview, + Form, }, }; diff --git a/src/router/index.js b/src/router/index.js index b2f3f687b..04772febd 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -29,14 +29,7 @@ import analyticsMixin from "@/mixins/analytics-mixin"; import { experimentTriggers } from "../constants/experiments"; import { applicationConfig } from "../constants/application-config"; -import review from "@/layouts/review/review"; -import paymentMethod from "@/layouts/payment-method/payment-method"; const routes = [ - { - path: "/payment-method", // This is a temporary route for testing. - name: "root", - component: paymentMethod, - }, { path: "/", name: "root", diff --git a/src/router/router-constants/routing-table.js b/src/router/router-constants/routing-table.js index a2796ed0e..141186d23 100644 --- a/src/router/router-constants/routing-table.js +++ b/src/router/router-constants/routing-table.js @@ -465,11 +465,19 @@ const routingTable = function (store) { scenario: navigationScenarios.CLICKED_CUSTOMER_EDIT, destinationFmgPageValue: fmgPageValues.CUSTOMER_DETAILS, }, + { + scenario: navigationScenarios.CLICKED_FORWARD, + destinationFmgPageValue: fmgPageValues.PAYMENT_METHOD, + }, ], }, { fmgPageValue: fmgPageValues.PAYMENT_METHOD, maps: [ + { + scenario: navigationScenarios.CLICKED_BACK, + destinationFmgPageValue: fmgPageValues.REVIEW, + }, { scenario: navigationScenarios.CLICKED_FORWARD, destinationFmgPageValue: fmgPageValues.CONFIRMATION, diff --git a/src/store/index.js b/src/store/index.js index 0c9a55c41..23e8ca8e0 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -504,6 +504,7 @@ export const mutations = { // Export Getters export const getters = { + submitAfterSave: (state) => state.submitAfterSave, vehicle: (state) => state.order.vehicle, eventBusItem: (state) => (eventCategory, eventSubCategory) => { const matchedEvent = state.applicationUser.eventBus.find( diff --git a/src/store/store.spec.js b/src/store/store.spec.js index bdb81279d..d55862e3e 100644 --- a/src/store/store.spec.js +++ b/src/store/store.spec.js @@ -2767,6 +2767,17 @@ describe("Actions", () => { }); describe("Getters", () => { + it("submitAfterSave, should return true", () => { + // Arrange + const storeState = state; + + // Act + mutations.updateWorkOrderFlag(storeState, true); + + // Assert + expect(getters.submitAfterSave(storeState)).toEqual(true); + }); + it("Vehicle getter, should return vehicle data", () => { // Arrange const storeState = state;