310 lines
9.5 KiB
JavaScript
310 lines
9.5 KiB
JavaScript
// Components
|
|
import returnUser from "@/layouts/return-user/return-user.vue";
|
|
|
|
// Supporting Files
|
|
import funnelHeader from "@/fmg-components/funnel-header/funnel-header";
|
|
import funnelSubHeader from "@/fmg-components/funnel-sub-header/funnel-sub-header";
|
|
import { shallowMount } from "@vue/test-utils";
|
|
import { getMountOptions } from "@/helpers/unit-test-helper";
|
|
import baseMixin from "@/mixins/base-mixin.js";
|
|
import { dispatchStoreAction } from "@/mixins/base-mixin.js";
|
|
import store from "@/store";
|
|
import router from "@/router";
|
|
import navbar from "@/fmg-components/nav-bar/nav-bar";
|
|
import { Form } from "vee-validate";
|
|
import { fetchCmsContentForPage } from "@/helpers/cms-content-helper";
|
|
import { navigationScenarios } from "@/router/constants/navigation-scenarios";
|
|
import { settleAllPromises } from "@/helpers/layout-helper";
|
|
import { getFunnelCookie } from "@/helpers/heritage-integration/cookie-helper";
|
|
import { deleteFunnelCookie } from "@/helpers/heritage-integration/cookie-helper";
|
|
import { saveSession } from "@/helpers/heritage-integration/order-helper.js";
|
|
|
|
import { experimentSettings } from "../../constants/experiments";
|
|
import { storeActions } from "@/constants/store-actions";
|
|
import buttonMain from "@/ux-components/button-main/button-main";
|
|
|
|
// Constants
|
|
|
|
// Setup global mocks
|
|
let mockStoreActionData = {};
|
|
|
|
let mockStoreData = {};
|
|
let mockExperimentSettings = {
|
|
experiments: [
|
|
{
|
|
universeName: "ConceptFunnel",
|
|
settings: {
|
|
SuppressVinCapture: false,
|
|
},
|
|
},
|
|
],
|
|
};
|
|
|
|
function resetMockStoreData() {
|
|
mockStoreData = {
|
|
vehicle: {
|
|
year: "2000",
|
|
make: "TestMake",
|
|
model: "TestModel",
|
|
style: "TestStyle",
|
|
carId: "TestID",
|
|
vin: null,
|
|
registration: {
|
|
licensePlate: null,
|
|
},
|
|
},
|
|
serviceLocation: {
|
|
address: null,
|
|
address2: null,
|
|
city: null,
|
|
state: null,
|
|
zipCode: null,
|
|
zipCodeCtu: null,
|
|
appointmentType: null,
|
|
isVehicleProtected: null,
|
|
provider: {
|
|
providerNumber: null,
|
|
address: {
|
|
streetAddress: null,
|
|
city: null,
|
|
state: null,
|
|
zipCode: null,
|
|
zipCodeCtu: null,
|
|
},
|
|
},
|
|
techNotes: null,
|
|
},
|
|
customer: {
|
|
firstName: null,
|
|
lastName: null,
|
|
emailAddress: null,
|
|
phoneNumber: null,
|
|
isSmsOptIn: null,
|
|
},
|
|
damage: {
|
|
isRepair: false,
|
|
numberOfChips: null,
|
|
glassToReplace: [{ glassLocation: "Windshield", glassName: "windshield" }],
|
|
partQuestionAnswers: null,
|
|
moldingQuestionAnswers: null,
|
|
capabilityQuestionAnswers: null,
|
|
dateOfLoss: null,
|
|
damageCause: null,
|
|
},
|
|
lineItems: {
|
|
glassParts: [
|
|
{
|
|
canSafeliteRecalibrate: true,
|
|
childParts: [
|
|
{
|
|
kitPrice: 0,
|
|
laborAmount: 23.55,
|
|
partNumber: "GGG FW4896",
|
|
salesTax: 1.77,
|
|
sellingPrice: 0,
|
|
},
|
|
],
|
|
color: "Green Tint",
|
|
description:
|
|
"solar, soundproofing, lane keep assist, lane departure warning system, w/adaptive cruise control",
|
|
id: "db22fd44-10dd-456f-979b-ff88cf68cca6",
|
|
kitPrice: 0,
|
|
laborAmount: 60,
|
|
partNumber: "FW04896GTYN",
|
|
partType: "WINDSHIELD",
|
|
recalibrationType: "STATIC",
|
|
requiresCapabilityQuestions: false,
|
|
requiresRecalibration: true,
|
|
salesTax: 63.86,
|
|
sellingPrice: 791.46,
|
|
},
|
|
],
|
|
supportingItems: null,
|
|
vaps: null,
|
|
serverData: null,
|
|
promos: null,
|
|
},
|
|
payment: {
|
|
isInsurance: null,
|
|
insuranceCoverage: {
|
|
isVerified: null,
|
|
coverageStatus: null,
|
|
coverageType: null,
|
|
coverageVerificationType: null,
|
|
},
|
|
parentAccountNumber: 0,
|
|
billToAccountNumber: null,
|
|
isPia: null,
|
|
piaType: null,
|
|
inactivePromos: null,
|
|
paypalToken: null,
|
|
nextGenSettledAmount: 0,
|
|
ccToken: {
|
|
subscriptionId: null,
|
|
expMonth: null,
|
|
expYear: null,
|
|
cardType: null,
|
|
billToPostalCode: null,
|
|
billToFirstName: null,
|
|
billToLastName: null,
|
|
referenceNumber: null,
|
|
authCode: null,
|
|
transactionId: null,
|
|
transReferenceNumber: null,
|
|
lastFour: null,
|
|
},
|
|
},
|
|
policy: {
|
|
currentDeductible: 0,
|
|
policyNumber: null,
|
|
isItac: false,
|
|
additionalAuthFlag: null,
|
|
isNoComp: false,
|
|
insuranceCompanyName: null,
|
|
},
|
|
schedule: {
|
|
date: null,
|
|
startTime: null,
|
|
endTime: null,
|
|
routeCode: null,
|
|
jobMaxMinutes: null,
|
|
jobMinMinutes: null,
|
|
},
|
|
externalParameterServiceZip: {
|
|
zipCode: null,
|
|
emailAddress: null,
|
|
},
|
|
externalParameterState: { isExternalParameter: false },
|
|
};
|
|
}
|
|
|
|
function applyMockStoreDataToGetters() {
|
|
store.getters = {
|
|
vehicle: mockStoreData.vehicle,
|
|
};
|
|
store.state.order = mockStoreData;
|
|
store.state.applicationUser.experiments = mockExperimentSettings;
|
|
}
|
|
|
|
async function mockDispatchStoreAction(actionName) {
|
|
return mockStoreActionData[actionName];
|
|
}
|
|
|
|
jest.mock("@/mixins/base-mixin.js", () => ({
|
|
methods: {
|
|
dispatchStoreAction: jest.fn(),
|
|
dispatchStoreActionWithLogging: jest.fn().mockImplementation(mockDispatchStoreAction),
|
|
},
|
|
}));
|
|
|
|
jest.mock("@/helpers/cms-content-helper", () => ({
|
|
fetchCmsContentForPage: () => Promise.resolve("content"),
|
|
}));
|
|
|
|
jest.mock("@/helpers/heritage-integration/order-helper.js", () => ({
|
|
saveSession: jest.fn(),
|
|
}));
|
|
|
|
jest.mock("@/helpers/heritage-integration/cookie-helper", () => ({
|
|
deleteFunnelCookie: jest.fn(),
|
|
getFunnelCookie: jest.fn(),
|
|
}));
|
|
|
|
router.navigateWithoutSaving = jest.fn();
|
|
router.navigateWithSaving = jest.fn();
|
|
|
|
// Tests
|
|
describe("return-user.vue", () => {
|
|
beforeEach(() => {
|
|
resetMockStoreData();
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe("Test prerequisites are valid and child components are rendered", () => {
|
|
test("expect pagePrerequisites are valid to be called", () => {
|
|
// Arrange
|
|
const wrapper = setupMocks({});
|
|
|
|
applyMockStoreDataToGetters();
|
|
|
|
// Act
|
|
const pagePrerequisitesSpy = jest.spyOn(wrapper.vm, "arePagePrerequisitesValid");
|
|
|
|
wrapper.vm.arePagePrerequisitesValid();
|
|
|
|
// Assert
|
|
expect(pagePrerequisitesSpy).toBeCalled();
|
|
expect(getFunnelCookie).toHaveBeenCalled();
|
|
});
|
|
|
|
test("renders child components", () => {
|
|
const wrapper = setupMocks({});
|
|
|
|
expect(wrapper.findComponent(funnelHeader).exists()).toBe(true);
|
|
expect(wrapper.findComponent(funnelSubHeader).exists()).toBe(true);
|
|
expect(wrapper.findComponent(navbar).exists()).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe("Navigation", () => {
|
|
test("Check forwardButtonAction is working", async () => {
|
|
// Arrange
|
|
const wrapper = setupMocks({});
|
|
// Act
|
|
|
|
await wrapper.vm.forwardButtonAction();
|
|
|
|
// Assert
|
|
expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith(
|
|
navigationScenarios.CLICKED_FORWARD,
|
|
wrapper.vm.$route.name
|
|
);
|
|
});
|
|
test("expect functions in startOver to be called", async () => {
|
|
//Arrange
|
|
const wrapper = setupMocks({});
|
|
|
|
// Act
|
|
const dispatchStoreActionSpy = jest.spyOn(wrapper.vm, "dispatchStoreAction");
|
|
|
|
await wrapper.vm.$nextTick();
|
|
await wrapper.vm.startOver();
|
|
|
|
// Assert
|
|
expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith(
|
|
navigationScenarios.CLICKED_RESTART,
|
|
wrapper.vm.$route.name
|
|
);
|
|
});
|
|
});
|
|
});
|
|
|
|
function setupMocks({ customMountOptions }) {
|
|
const route = { name: "return-user" };
|
|
|
|
baseMixin.methods.ResetExternalParamsAndHideModal = jest.fn();
|
|
|
|
const mountOptions = getMountOptions({
|
|
...customMountOptions,
|
|
route: route,
|
|
});
|
|
|
|
mountOptions.global.mocks["$store"] = store;
|
|
mountOptions.global.mocks["$router"] = router;
|
|
mountOptions.global.mocks.pageName = route.name;
|
|
baseMixin.methods.isFormValid = jest.fn().mockReturnValue(true);
|
|
mountOptions["attachTo"] = document.body;
|
|
|
|
const wrapper = shallowMount(returnUser, mountOptions, {
|
|
stubs: {
|
|
Form,
|
|
funnelHeader,
|
|
funnelSubHeader,
|
|
navbar,
|
|
loadingModal: true,
|
|
buttonMain,
|
|
},
|
|
});
|
|
|
|
return wrapper;
|
|
}
|