Update tests
This commit is contained in:
parent
cccefcbff8
commit
f9dc366b84
3 changed files with 449 additions and 46 deletions
|
|
@ -86,15 +86,18 @@ describe("estimate.vue", () => {
|
||||||
expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled();
|
expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO KO
|
test("Selecting no vin on ForwardButtonAction triggers a router.navigateWithSaving", async () => {
|
||||||
describe("isRepair", () => {
|
//Arrange
|
||||||
test.todo("is repair and zip codes are valid/serviceable => go to quote page");
|
const { wrapper } = setupMocks({});
|
||||||
test.todo(
|
await wrapper.setData({
|
||||||
"is repair and zip codes are valid but not serviceable => show correct alert, remove loader"
|
selectedVinLookupMethod: vinLookupMethodSelections.DECLINE,
|
||||||
);
|
});
|
||||||
test.todo(
|
|
||||||
"is repair and zip codes are not valid/serviceable => show correct alert, remove loader"
|
//Act
|
||||||
);
|
wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -207,43 +210,6 @@ describe("estimate.vue", () => {
|
||||||
expect(arePagePrerequisitesValid).toBe(true);
|
expect(arePagePrerequisitesValid).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
test("Changing zip should reset alert", async () => {
|
|
||||||
//Arrange
|
|
||||||
const { wrapper } = setupMocks({});
|
|
||||||
|
|
||||||
//Act
|
|
||||||
wrapper.vm.displayNonServiceableZipAlert = "true";
|
|
||||||
wrapper.vm.serviceZipCode = "43015";
|
|
||||||
|
|
||||||
await wrapper.vm.$nextTick();
|
|
||||||
|
|
||||||
//Assert
|
|
||||||
expect(wrapper.vm.displayNonServiceableZipAlert).toEqual(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("test alertInfo and isRepair", () => {
|
|
||||||
const skipOptions = [
|
|
||||||
[true, false, "AlertQuoteReady"],
|
|
||||||
[false, true, "AlertQuoteVinOptional"],
|
|
||||||
[false, false, "AlertQuoteReady"],
|
|
||||||
[true, true, "AlertQuoteVinOptional"],
|
|
||||||
];
|
|
||||||
test.each(skipOptions)(
|
|
||||||
"isRepair %s, skipVinNotRepair %s alertInfo should return %s",
|
|
||||||
async (isRepair, skipVinNotRepair, expectedAlertInfo) => {
|
|
||||||
const { wrapper } = setupMocks({});
|
|
||||||
await wrapper.setData({
|
|
||||||
skipVinNotRepair: skipVinNotRepair,
|
|
||||||
});
|
|
||||||
|
|
||||||
store.commit(storeMutations.UPDATE_IS_REPAIR, isRepair);
|
|
||||||
|
|
||||||
expect(wrapper.vm.alertInfo).toEqual(expectedAlertInfo);
|
|
||||||
expect(wrapper.vm.isRepair).toEqual(isRepair);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function setupMocks({
|
function setupMocks({
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,423 @@
|
||||||
|
// Components
|
||||||
|
import serviceZip from "@/layouts/service-zip/service-zip";
|
||||||
|
|
||||||
|
// Supporting Files
|
||||||
|
import { shallowMount } from "@vue/test-utils";
|
||||||
|
import { getMountOptions } from "@/helpers/unit-test-helper";
|
||||||
|
import baseMixin from "@/mixins/base-mixin";
|
||||||
|
import store from "@/store";
|
||||||
|
import router from "@/router";
|
||||||
|
import { navigationScenarios } from "@/router/router-constants/navigation-scenarios";
|
||||||
|
import { saveSession } from "@/helpers/heritage-integration/order-helper.js";
|
||||||
|
import vinPagesMixin from "@/mixins/vin-pages-mixin";
|
||||||
|
|
||||||
|
// Constants
|
||||||
|
|
||||||
|
// Setup global mocks
|
||||||
|
let mockCmsContent = {
|
||||||
|
AlertNonServiceableZipWidget: {
|
||||||
|
HeadlineText: "Test",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
let mockStoreActionData = {};
|
||||||
|
|
||||||
|
let mockStoreData = {};
|
||||||
|
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyMockStoreDataToGetters() {
|
||||||
|
store.getters = {
|
||||||
|
order: mockStoreData,
|
||||||
|
damage: mockStoreData.damage,
|
||||||
|
payment: mockStoreData.payment,
|
||||||
|
policy: mockStoreData.policy,
|
||||||
|
};
|
||||||
|
store.state.order = mockStoreData;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function mockDispatchStoreAction(actionName) {
|
||||||
|
return mockStoreActionData[actionName];
|
||||||
|
}
|
||||||
|
|
||||||
|
jest.mock("@/mixins/base-mixin.js", () => ({
|
||||||
|
methods: {
|
||||||
|
dispatchStoreAction: jest.fn().mockImplementation(mockDispatchStoreAction),
|
||||||
|
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(),
|
||||||
|
}));
|
||||||
|
|
||||||
|
router.navigateWithoutSaving = jest.fn();
|
||||||
|
router.navigateWithSaving = jest.fn();
|
||||||
|
|
||||||
|
// Tests
|
||||||
|
describe("service-zip.vue", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
resetMockStoreData();
|
||||||
|
jest.clearAllMocks();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Pre-existing fields", () => {
|
||||||
|
test("No existing fields -> serviceZip & emailAdress undefined", () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.serviceZipCode).toBeFalsy();
|
||||||
|
expect(wrapper.vm.emailAddress).toBeFalsy();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Fields in store -> autofilled to data", () => {
|
||||||
|
// Arrange
|
||||||
|
mockStoreData.serviceLocation.zipCode = "11111";
|
||||||
|
mockStoreData.customer.emailAddress = "builddigitaltest@safelite.com";
|
||||||
|
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.serviceZipCode).toEqual("11111");
|
||||||
|
expect(wrapper.vm.emailAddress).toEqual("builddigitaltest@safelite.com");
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Zip in querystring -> pushed to data", () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({
|
||||||
|
customZipQuery: "11111",
|
||||||
|
});
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.serviceZipCode).toEqual("11111")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Navigation", () => {
|
||||||
|
describe("Back Nav", () => {
|
||||||
|
test("If skipvin eligable, go back to vehicle-damage", async () => {
|
||||||
|
// Arrange
|
||||||
|
mockStoreData.damage.isRepair = true;
|
||||||
|
mockStoreData.damage.numberOfChips = 1;
|
||||||
|
mockStoreData.damage.glassToReplace = null;
|
||||||
|
mockStoreData.lineItems.glassParts = null;
|
||||||
|
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
await wrapper.vm.backButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith(navigationScenarios.CLICKED_BACK_WITH_SKIP_VIN, wrapper.vm.$route);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("If not skipvin eligable, go back to estimate", async () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
await wrapper.vm.backButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.$router.navigateWithoutSaving).toBeCalledWith(navigationScenarios.CLICKED_BACK, wrapper.vm.$route);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Forward Nav", () => {
|
||||||
|
test("Repair skips questions flow", async () => {
|
||||||
|
// Arrange
|
||||||
|
mockStoreData.damage.isRepair = true;
|
||||||
|
mockStoreData.damage.numberOfChips = 1;
|
||||||
|
mockStoreData.damage.glassToReplace = null;
|
||||||
|
mockStoreData.lineItems.glassParts = null;
|
||||||
|
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
|
||||||
|
jest.spyOn(wrapper.vm, "navigateForwardWithSingleCarMatch").mockImplementation();
|
||||||
|
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.$router.navigateWithSaving).toBeCalledWith(navigationScenarios.CLICKED_FORWARD_WITH_NO_QUESTIONS, wrapper.vm.$route);
|
||||||
|
expect(wrapper.vm.navigateForwardWithSingleCarMatch).not.toBeCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Non-repair enters questions flow", async () => {
|
||||||
|
// Arrange
|
||||||
|
mockStoreData.damage.isRepair = false;
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
|
||||||
|
jest.spyOn(wrapper.vm, "navigateForwardWithSingleCarMatch").mockImplementation();
|
||||||
|
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.$router.navigateWithSaving).not.toBeCalled();
|
||||||
|
expect(wrapper.vm.navigateForwardWithSingleCarMatch).toBeCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("Alerts", () => {
|
||||||
|
test("Invalid zip alert shown if indicated by endpoint", async () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
const invalidZipResponse = {
|
||||||
|
state: "OH",
|
||||||
|
zipCodeCtu: "TESTCTU",
|
||||||
|
isValid: false,
|
||||||
|
isServiceable: true,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({customZipDataResponse: invalidZipResponse});
|
||||||
|
|
||||||
|
wrapper.vm.$refs.navbar.removeLoader = jest.fn();
|
||||||
|
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.displayInvalidZipAlert).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Non-serviceable zip alert shown if indicated by endpoint", async () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
const invalidZipResponse = {
|
||||||
|
state: "OH",
|
||||||
|
zipCodeCtu: "TESTCTU",
|
||||||
|
isValid: true,
|
||||||
|
isServiceable: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({customZipDataResponse: invalidZipResponse});
|
||||||
|
|
||||||
|
wrapper.vm.$refs.navbar.removeLoader = jest.fn();
|
||||||
|
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.displayNonServiceableZipAlert).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("Alerts cleared when valid zip is submitted", async () => {
|
||||||
|
// Arrange
|
||||||
|
// no changes to store
|
||||||
|
applyMockStoreDataToGetters();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
const wrapper = setupMocks({});
|
||||||
|
|
||||||
|
wrapper.vm.displayInvalidZipAlert = true;
|
||||||
|
wrapper.vm.displayNonServiceableZipAlert = true;
|
||||||
|
|
||||||
|
jest.spyOn(wrapper.vm, "navigateForwardWithSingleCarMatch").mockImplementation();
|
||||||
|
|
||||||
|
await wrapper.vm.forwardButtonAction();
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
expect(wrapper.vm.displayInvalidZipAlert).toBe(false);
|
||||||
|
expect(wrapper.vm.displayNonServiceableZipAlert).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function setupMocks({ customMountOptions, customZipQuery, customZipDataResponse }) {
|
||||||
|
const route = { query: { fmgPage: "service-zip" }, params: {} };
|
||||||
|
if(customZipQuery) {
|
||||||
|
route.query.zipcode = customZipQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
const mountOptions = getMountOptions({
|
||||||
|
...customMountOptions,
|
||||||
|
route: route,
|
||||||
|
});
|
||||||
|
|
||||||
|
mountOptions.global.mocks["$store"] = store;
|
||||||
|
mountOptions.global.mocks["$router"] = router;
|
||||||
|
mountOptions.mixins = [
|
||||||
|
{
|
||||||
|
methods: {
|
||||||
|
getCmsContent: jest.fn().mockImplementation((widgetName, fieldName) => {
|
||||||
|
if (mockCmsContent[widgetName] && mockCmsContent[widgetName][fieldName])
|
||||||
|
return mockCmsContent[widgetName][fieldName];
|
||||||
|
}),
|
||||||
|
setCmsContent: jest.fn(),
|
||||||
|
navigateForwardWithSingleCarMatch: jest.fn(),
|
||||||
|
getZipCodeData: jest.fn().mockImplementation(() => {
|
||||||
|
if(customZipDataResponse) {
|
||||||
|
return customZipDataResponse;
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
state: "OH",
|
||||||
|
zipCodeCtu: "TESTCTU",
|
||||||
|
isValid: true,
|
||||||
|
isServiceable: true,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const wrapper = shallowMount(serviceZip, mountOptions);
|
||||||
|
|
||||||
|
return wrapper;
|
||||||
|
}
|
||||||
|
|
@ -52,6 +52,20 @@ jest.mock("@/store", () => ({
|
||||||
damage: {
|
damage: {
|
||||||
glassToReplace: [],
|
glassToReplace: [],
|
||||||
},
|
},
|
||||||
|
order: {
|
||||||
|
vehicle: {
|
||||||
|
carId: "C00000000",
|
||||||
|
image: "test.jpg",
|
||||||
|
payment: {
|
||||||
|
insuranceCoverage: {
|
||||||
|
isVerified: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
damage: {
|
||||||
|
glassToReplace: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue