Merge pull request #834 from Safelite/feature/CSR-944

CSR-944 optional vin vehicles
This commit is contained in:
CarlNation 2022-11-23 10:15:47 -05:00 committed by GitHub
commit 765f93b51a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 132 additions and 7 deletions

View file

@ -12,6 +12,7 @@ const storeActions = {
SET_VEHICLE: "setVehicle",
GET_DAMAGE_OPTIONS: "getDamageOptions",
GET_EVOX_IMAGE: "getEvoxImage",
IS_VIN_OPTIONAL_VEHICLE: "isVinOptionalVehicle",
// Lookup Actions
LOOKUP_VEHICLE_BY_YMMS: "lookupVehicleByYmms",

View file

@ -3,6 +3,8 @@ import { externalUrls } from "@/router/router-constants/externalUrl-values";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { saveOrder } from "@/helpers/heritage-integration/order-helper.js";
import { fmgPageValues } from "@/router/router-constants/fmgPage-values";
import { storeActions } from "@/constants/store-actions.js";
import { settleAllPromises } from "@/helpers/layout-helper";
import store from "@/store";
import router from "@/router";
@ -73,6 +75,17 @@ async function getLatestPageForRedirection() {
const moldingQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.MOLDING_QUESTIONS);
const capabilityQuestionsComponent = await getLazyLoadedComponent(fmgPageValues.CAPABILITY_QUESTIONS);
const vinOptionalVehiclePromise = store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE);
const promiseResultMap = [
{
resultKey: "vinOptionalOptions",
promise: vinOptionalVehiclePromise,
},
];
const resultMap = await settleAllPromises(promiseResultMap);
var isVinOptionalVehicle = resultMap.vinOptionalOptions;
if (!vehicleMakeComponent.methods.arePagePrerequisitesValid()) {
return fmgPageValues.VEHICLE_YEAR;
} else if (!vehicleModelComponent.methods.arePagePrerequisitesValid()) {
@ -96,7 +109,7 @@ async function getLatestPageForRedirection() {
else if (partQuestionsComponent.methods.arePagePrerequisitesValid()) {
return fmgPageValues.PART_QUESTIONS;
}
else if (vinLookupComponent.methods.arePagePrerequisitesValid() && !store.getters.damage.isRepair) {
else if (vinLookupComponent.methods.arePagePrerequisitesValid() && !store.getters.damage.isRepair && !isVinOptionalVehicle) {
return fmgPageValues.VIN_LOOKUP;
}
else {

View file

@ -2,6 +2,7 @@ import { getPageToRouteExistingOrderTo, navigateToHeritageFunnel } from "@/helpe
import * as orderHelper from "@/helpers/heritage-integration/order-helper";
import { lazyLoadComponent } from "@/router/dynamic-routing/component-loader.js";
import { storeActions } from "@/constants/store-actions";
import { storeMutations } from "@/constants/store-mutations";
import { setupMocksForJsFiles, getMockOrderInfo } from "@/helpers/unit-test-helper.js";
import { externalUrls } from "@/router/router-constants/externalUrl-values";
import { queryStrings } from "@/constants/query-strings";
@ -22,6 +23,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: false
@ -40,6 +44,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -59,6 +66,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -79,6 +89,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -100,6 +113,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -122,6 +138,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -149,6 +168,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -176,6 +198,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -203,6 +228,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -230,6 +258,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -257,6 +288,9 @@ describe("getPageToRouteExistingOrderTo", () => {
query: {}
};
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Mock out the lazy load calls for all components.
mockLazyLoadComponentReturnValues({
[fmgPageValues.VEHICLE_MAKE]: true,
@ -286,6 +320,9 @@ describe("getPageToRouteExistingOrderTo", () => {
}
}
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
// Act
const result = await getPageToRouteExistingOrderTo(toRoute, true);

View file

@ -87,6 +87,9 @@ describe("estimate.vue", () => {
selectedVinLookupMethod: vinLookupMethodSelections.HOMEADDRESS
})
store.commit( storeMutations.UPDATE_IS_REPAIR, false );
store.commit( storeMutations.UPDATE_MAKE, "acura" );
//Act
wrapper.vm.forwardButtonAction();
@ -162,8 +165,22 @@ describe("estimate.vue", () => {
});
describe("skipVinLookup", () => {
const skipOptions = [[true, true, true],
[true, false, true],
[false, true, true],
[false, false, false]];
test.each(skipOptions)("isRepair %s and isVinOptional %s should return %s", async (isRepair, isVinOptionalVehicle, expectedVinSkip) => {
const { wrapper } = setupMocks({ isVinOptionalVehicle: isVinOptionalVehicle});
store.commit( storeMutations.UPDATE_IS_REPAIR, isRepair);
expect(wrapper.vm.skipVinLookup).toEqual(expectedVinSkip);
});
});
function setupMocks({
groupName = "estimate",
isVinOptionalVehicle = false,
cmsQuestionText = "Let's get your VIN. Or we can look it up for you!",
cmsAnswers = [{ Name: "Provide my VIN manually Most specific to your vehicle" }, { Name: "Provide my license plate # Most accurate VIN match" }, { Name: "Provide my home address Most convenient VIN match" }],
funnelFooterWidget = { ForwardButtonText: "test txt" },
@ -187,12 +204,12 @@ function setupMocks({
const apiPromise = Promise.resolve({ cmsContent });
settleAllPromises.mockImplementation(() => apiPromise);
fetchCmsContentForPage.mockImplementation(() => Promise.resolve());
const mountOptions = getMountOptions({ ...mountOptionsMockData, mixins: [baseMixin] });
mountOptions['attachTo'] = document.body;
const wrapper = shallowMount(estimate, mountOptions);
wrapper.vm.isVinOptionalVehicle = isVinOptionalVehicle;
return { wrapper, apiPromise };

View file

@ -11,7 +11,7 @@
<vehicleBanner cmsWidgetName="VehicleBannerWidget" />
<funnelSubHeader cmsWidgetName="FunnelSubHeaderWidget" />
<div class="fade-on-route-transition sub-container make-tall">
<div v-if="!isRepair">
<div v-if="!skipVinLookup">
<alert
class="vinLookupMethodHeading"
cmsWidgetName="AlertVinLookupQuestion"
@ -27,7 +27,7 @@
validationRules="option-required"
/>
</div>
<div v-if="isRepair">
<div v-if="skipVinLookup">
<alert
class="my-4"
cmsWidgetName="AlertQuoteReady"
@ -136,25 +136,35 @@ export default {
emailAddress: this.getEmailFromStore(),
displayInvalidZipAlert: false,
displayNonServiceableZipAlert: false,
isVinOptionalVehicle: false,
};
},
async beforeRouteEnter(to, from, next) {
//Call APIs
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const vinOptionalVehiclePromise = store.dispatch(storeActions.IS_VIN_OPTIONAL_VEHICLE);
//Settle promises and get results
const promiseResultMap = [
{
resultKey: "cmsContent",
promise: cmsContentPromise,
},
{
resultKey: "vinOptionalOptions",
promise: vinOptionalVehiclePromise,
},
];
const resultMap = await settleAllPromises(promiseResultMap);
next((vm) => {
vm.isVinOptionalVehicle = resultMap.vinOptionalOptions;
if (resultMap.cmsContent.FunnelFooterWidget.ForwardButtonText.includes("|"))
{
const forwardTextOption = resultMap.cmsContent.FunnelFooterWidget.ForwardButtonText.split("|");
if (store.getters.damage.isRepair){
if (store.getters.damage.isRepair || vm.isVinOptionalVehicle){
resultMap.cmsContent.FunnelFooterWidget.ForwardButtonText = forwardTextOption[1]
}
else
@ -184,9 +194,9 @@ export default {
);
},
async forwardButtonAction() {
if (this.isRepair){
if (this.skipVinLookup){
const zipCodeData = await this.getZipCodeData(this.serviceZipCode);
//todo: validation
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailAddress, false);
await this.dispatchStoreAction(storeActions.SAVE_SERVICE_LOCATION, {
zipCode: this.serviceZipCode,
@ -246,6 +256,9 @@ export default {
isRepair() {
return store.getters.damage.isRepair;
},
skipVinLookup() {
return this.isRepair || this.isVinOptionalVehicle;
},
},
watch: {
serviceZipCode() {

View file

@ -1100,6 +1100,25 @@ export const actions = {
},
clearVin(context) {
context.commit(storeMutations.UPDATE_VEHICLE_VIN, null);
},
isVinOptionalVehicle(context){
switch((context.state.order.vehicle.make).toLowerCase()) {
case "mercedes benz":
case "volkswagen":
case "audi":
case "porsche":
return true;
default:
}
if ((context.state.order.vehicle.make).toLowerCase() === "ford" && context.state.order.vehicle.year >= 2018)
return true;
if ((context.state.order.vehicle.make).toLowerCase() === "bmw" && context.state.order.vehicle.year <= 2017)
return true;
return false;
}
}

View file

@ -1611,4 +1611,29 @@ describe("Getters", () => {
});
});
})
});
describe("isVinOptionalVehicle", () => {
const testVehicles = [["2017", "acura", false],
["2017", "ford", false],
["2018", "ford", true],
["2018", "bmw", false],
["2017", "bmw", true],
["2016", "bmw", true],
["2016", "mercedes benz", true],
["2016", "volkswagen", true],
["2016", "audi", true],
["2016", "porsche", true]];
test.each(testVehicles)("%s %s should skip vin lookup is %s", async (year, make, expectedVinSkip) => {
const context = state;
context.state = {
order: {
vehicle: { year: year, make: make}
}
};
var vinOptionalResult = actions.isVinOptionalVehicle(context);
expect(vinOptionalResult).toEqual(expectedVinSkip);
});
});