Merge pull request #1354 from Safelite/bug/chloeherd/analytics-mismatch

Bug/chloeherd/analytics mismatch
This commit is contained in:
chloeherdsafelite 2023-09-22 10:29:05 -04:00 committed by GitHub
commit e024258980
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
40 changed files with 703 additions and 224 deletions

View file

@ -12,8 +12,8 @@ export default {
method, method,
endpoint, endpoint,
payload, payload,
logApiCall = true, logApiCall = false,
isFormData = false, pageNameToLog = null,
additionalSuccessEventDataHandler, additionalSuccessEventDataHandler,
}) { }) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -37,13 +37,11 @@ export default {
if (additionalSuccessEventDataHandler) { if (additionalSuccessEventDataHandler) {
additionalEventData = "_" + additionalSuccessEventDataHandler(response); additionalEventData = "_" + additionalSuccessEventDataHandler(response);
} }
const pageName = analyticsMixIn.methods.getPageName();
const nextPageName = router.lastNavigationPage || pageName;
const endpointWithoutParams = const endpointWithoutParams =
analyticsMixIn.methods.removeParamsFromEndpoint(endpoint); analyticsMixIn.methods.removeParamsFromEndpoint(endpoint);
analyticsMixIn.methods.pushEventToGA( analyticsMixIn.methods.pushEventToGA(
GaCategories.API_RESPONSE, GaCategories.API_RESPONSE,
`${nextPageName}_${endpointWithoutParams}`, `${pageNameToLog}_${endpointWithoutParams}`,
`${GaLabels.SUCCESS}${additionalEventData}`, `${GaLabels.SUCCESS}${additionalEventData}`,
true true
); );

View file

@ -54,10 +54,11 @@ export function includesWindshieldReplacement() {
return windshieldMatches.length > 0; return windshieldMatches.length > 0;
} }
export async function isGlassAvailableForCarId(carId) { export async function isGlassAvailableForCarId(carId, pageNameToLog) {
const newGlassOptions = await baseMixin.methods.dispatchStoreAction( const newGlassOptions = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_DAMAGE_OPTIONS, storeActions.GET_DAMAGE_OPTIONS,
{ carId: carId } { carId: carId },
pageNameToLog
); );
const currentGlassOptions = store.getters.damage.glassToReplace; const currentGlassOptions = store.getters.damage.glassToReplace;

View file

@ -11,6 +11,13 @@ jest.mock("@/mixins/base-mixin.js", () => ({
}, },
}; };
}), }),
dispatchStoreActionWithLogging: jest.fn().mockImplementation(() => {
return {
data: {
windshieldOptions: { availableReplacementOptions: ["windshield"] },
},
};
}),
}, },
})); }));
@ -77,7 +84,7 @@ describe("damage-helper.js", () => {
]; ];
// Act // Act
const isGlassAvailable = await isGlassAvailableForCarId(); const isGlassAvailable = await isGlassAvailableForCarId("id", "testName");
// Assert // Assert
expect(isGlassAvailable).toEqual(true); expect(isGlassAvailable).toEqual(true);
@ -91,7 +98,7 @@ describe("damage-helper.js", () => {
{ glassLocation: "Windshield", glassName: "sideWindow" }, { glassLocation: "Windshield", glassName: "sideWindow" },
]; ];
const isGlassAvailable = await isGlassAvailableForCarId(); const isGlassAvailable = await isGlassAvailableForCarId("id", "testName");
// Assert // Assert
expect(isGlassAvailable).toEqual(false); expect(isGlassAvailable).toEqual(false);

View file

@ -45,10 +45,10 @@ export async function getPageToRouteExistingOrderTo(toRoute = {}) {
Used to navigate to the heritage funnel with the correct query string and url. Used to navigate to the heritage funnel with the correct query string and url.
*/ */
export async function navigateToHeritageFunnel({ shouldSaveSession, loadingModal }) { export async function navigateToHeritageFunnel({ shouldSaveSession, pageNameToLog, loadingModal }) {
// Create the order (or save existing order) when navigating to Heritage Funnel. // Create the order (or save existing order) when navigating to Heritage Funnel.
if (shouldSaveSession) { if (shouldSaveSession) {
await saveSession({ shouldAwaitSaveSessionQueue: true }); await saveSession({ pageNameToLog: pageNameToLog, shouldAwaitSaveSessionQueue: true });
} }
if (loadingModal && loadingModal.showModal) { if (loadingModal && loadingModal.showModal) {

View file

@ -14,7 +14,7 @@ import { storeMutations } from "@/constants/store-mutations";
it will reset the state and go back to the start of the funnel. it will reset the state and go back to the start of the funnel.
*/ */
export async function loadSessionIfPresent(isConceptInsurance) { export async function loadSessionIfPresent(isConceptInsurance, pageNameToLog) {
const funnelCookie = getFunnelCookie(); const funnelCookie = getFunnelCookie();
// Do nothing if there is no cookie or session to use for loading. // Do nothing if there is no cookie or session to use for loading.
@ -42,7 +42,8 @@ export async function loadSessionIfPresent(isConceptInsurance) {
funnelCookie.ReferralDate, funnelCookie.ReferralDate,
funnelCookie.ReferralParentAccountNumber, funnelCookie.ReferralParentAccountNumber,
funnelCookie.ReferralCorrelationId, funnelCookie.ReferralCorrelationId,
isConceptInsurance isConceptInsurance,
pageNameToLog
) )
)?.data; )?.data;
} }
@ -52,17 +53,17 @@ export async function loadSessionIfPresent(isConceptInsurance) {
This will also set Referral information in the store after saving, and then This will also set Referral information in the store after saving, and then
update the cookie. To force synchronous behavior pass in 'true' for shouldAwaitSaveSessionQueue update the cookie. To force synchronous behavior pass in 'true' for shouldAwaitSaveSessionQueue
*/ */
export async function saveSession({ shouldAwaitSaveSessionQueue = false }) { export async function saveSession({ pageNameToLog, shouldAwaitSaveSessionQueue = false }) {
var saveSessionPromise; var saveSessionPromise;
if (store.getters.applicationUser.saveSessionPromise) { if (store.getters.applicationUser.saveSessionPromise) {
// queue newest request after current saveSessionPromise resolves // queue newest request after current saveSessionPromise resolves
saveSessionPromise = store.getters.applicationUser.saveSessionPromise.then(() => { saveSessionPromise = store.getters.applicationUser.saveSessionPromise.then(() => {
// get a new saveSessionPromise // get a new saveSessionPromise
return saveSessionHelper(); return saveSessionHelper(pageNameToLog);
}); });
} else { } else {
// create an initial saveSessionPromise // create an initial saveSessionPromise
saveSessionPromise = saveSessionHelper(); saveSessionPromise = saveSessionHelper(pageNameToLog);
} }
store.commit(storeMutations.UPDATE_SAVE_SESSION_PROMISE, saveSessionPromise); store.commit(storeMutations.UPDATE_SAVE_SESSION_PROMISE, saveSessionPromise);
// await here to allow for a caller to await and make the function synchronous // await here to allow for a caller to await and make the function synchronous
@ -83,12 +84,13 @@ async function loadSession(
referralDate, referralDate,
parentAccountNumber, parentAccountNumber,
referralCorrelationId, referralCorrelationId,
isConceptInsurance isConceptInsurance,
pageNameToLog
) { ) {
// await the saveSessionPromise in the store to make sure we're loading up to date information // await the saveSessionPromise in the store to make sure we're loading up to date information
await store.getters.applicationUser.saveSessionPromise; await store.getters.applicationUser.saveSessionPromise;
const response = await baseMixin.methods.dispatchStoreAction( const response = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.LOAD_SESSION, storeActions.LOAD_SESSION,
{ {
savedSessionId: savedSessionId?.toString(), savedSessionId: savedSessionId?.toString(),
@ -98,6 +100,7 @@ async function loadSession(
parentAccountNumber, parentAccountNumber,
isConceptInsurance, isConceptInsurance,
}, },
pageNameToLog,
false false
); );
@ -107,8 +110,12 @@ async function loadSession(
/* /*
Encapsulates asynchronous Save Session logic inside a promise to allow for Save Session queuing Encapsulates asynchronous Save Session logic inside a promise to allow for Save Session queuing
*/ */
async function saveSessionHelper() { async function saveSessionHelper(pageNameToLog) {
const savedSessionInfo = await baseMixin.methods.dispatchStoreAction(storeActions.SAVE_SESSION); const savedSessionInfo = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.SAVE_SESSION,
null,
pageNameToLog
);
// Update the store with information received from the saveSession response // Update the store with information received from the saveSession response
await baseMixin.methods.dispatchStoreAction( await baseMixin.methods.dispatchStoreAction(
storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE, storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE,

View file

@ -170,11 +170,13 @@ describe("saveSession", () => {
const mocks = setupMocksForJsFiles(mockData); const mocks = setupMocksForJsFiles(mockData);
// Act // Act
await saveSession({}); await saveSession({ pageNameToLog: "test" });
// Assert // Assert
expect(mocks.baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith( expect(mocks.baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledWith(
storeActions.SAVE_SESSION storeActions.SAVE_SESSION,
null,
"test"
); );
expect(mocks.baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith( expect(mocks.baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith(
storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE, storeActions.UPDATE_STORE_WITH_SAVE_SESSION_RESPONSE,
@ -231,7 +233,7 @@ describe("saveSession", () => {
setupCookies({ funnelCookieValue: JSON.stringify(testCookieValue) }); setupCookies({ funnelCookieValue: JSON.stringify(testCookieValue) });
// Act // Act
await saveSession({}); await saveSession({ pageNameToLog: "test" });
// Assert // Assert
expect(cookieHelper.getFunnelCookie().DidHeritageFunnelUpdateLast).toEqual(false); expect(cookieHelper.getFunnelCookie().DidHeritageFunnelUpdateLast).toEqual(false);

View file

@ -44,6 +44,16 @@ export function getMountOptions(mockData) {
}); });
} }
}); });
mocks.dispatchStoreActionWithLogging = jest.fn();
mocks.dispatchStoreActionWithLogging.mockImplementation((actionName) => {
let actionFilterResult = mockData.actionList?.filter((x) => x.actionName == actionName);
if (actionFilterResult?.length === 1) {
return Promise.resolve({
data: actionFilterResult[0].data,
});
}
});
// Mock const files // Mock const files
mocks.storeActions = storeActions; mocks.storeActions = storeActions;
@ -141,5 +151,16 @@ function setupBaseMixinDispatchStoreAction(mockData) {
}); });
} }
}); });
baseMixin.methods.dispatchStoreActionWithLogging = jest.fn();
baseMixin.methods.dispatchStoreActionWithLogging.mockImplementation((actionName) => {
let actionFilterResult = mockData.actionList.filter((x) => x.actionName == actionName);
if (actionFilterResult.length > 0 && actionFilterResult.length === 1) {
return Promise.resolve({
data: actionFilterResult[0].data,
});
}
});
} }
} }

View file

@ -471,7 +471,7 @@ describe("address-lookup.vue", () => {
await wrapper.vm.forwardButtonAction(); await wrapper.vm.forwardButtonAction();
// Assert // Assert
expect(wrapper.vm.dispatchStoreAction).toHaveBeenCalledWith( expect(wrapper.vm.dispatchStoreActionWithLogging).toHaveBeenCalledWith(
"lookupVinByAddress", "lookupVinByAddress",
{ {
licenseLastName: undefined, licenseLastName: undefined,
@ -479,12 +479,17 @@ describe("address-lookup.vue", () => {
licenseStreetAddress: "1234 Main St", licenseStreetAddress: "1234 Main St",
licenseZip: "43215", licenseZip: "43215",
}, },
"address-lookup",
false false
); );
expect(wrapper.vm.dispatchStoreAction).toHaveBeenCalledWith("validateZip", { expect(wrapper.vm.dispatchStoreActionWithLogging).toHaveBeenCalledWith(
zip: "43215", "validateZip",
}); {
zip: "43215",
},
"address-lookup"
);
}); });
}); });

View file

@ -224,7 +224,7 @@ export default {
// Vehicle info change in the flow, use a variable to keep track and commit to state at the end. // Vehicle info change in the flow, use a variable to keep track and commit to state at the end.
let vehicleInfoToCommit = {}; let vehicleInfoToCommit = {};
const vinLookupResponse = this.dispatchStoreAction( const vinLookupResponse = this.dispatchStoreActionWithLogging(
storeActions.LOOKUP_VIN_BY_ADDRESS, storeActions.LOOKUP_VIN_BY_ADDRESS,
{ {
licenseLastName: this.customerQuestions.lastName, licenseLastName: this.customerQuestions.lastName,
@ -232,6 +232,7 @@ export default {
licenseZip: this.customerQuestions.addressQuestions.zipCode, licenseZip: this.customerQuestions.addressQuestions.zipCode,
licenseState: this.customerQuestions.addressQuestions.state, licenseState: this.customerQuestions.addressQuestions.state,
}, },
"address-lookup",
false false
); );
@ -244,12 +245,20 @@ export default {
{ {
resultKey: "serviceZipValidationResponse", resultKey: "serviceZipValidationResponse",
promise: this.serviceZipCode promise: this.serviceZipCode
? this.dispatchStoreAction(storeActions.VALIDATE_ZIP, { ? this.dispatchStoreActionWithLogging(
zip: this.serviceZipCode, storeActions.VALIDATE_ZIP,
}) {
: this.dispatchStoreAction(storeActions.VALIDATE_ZIP, { zip: this.serviceZipCode,
zip: this.customerQuestions.addressQuestions.zipCode, },
}), "address-lookup"
)
: this.dispatchStoreActionWithLogging(
storeActions.VALIDATE_ZIP,
{
zip: this.customerQuestions.addressQuestions.zipCode,
},
"address-lookup"
),
}, },
]; ];
@ -284,7 +293,8 @@ export default {
this.displayMatchedDifferentVehicleAlert = true; this.displayMatchedDifferentVehicleAlert = true;
this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId( this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId(
carFound.carId carFound.carId,
"address-lookup"
); );
// Update button "Continue with..." // Update button "Continue with..."

View file

@ -175,9 +175,13 @@ export default {
this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route); this.$router.navigateWithoutSaving(this.navigationScenarios.CLICKED_BACK, this.$route);
}, },
async forwardButtonAction() { async forwardButtonAction() {
const vinLookup = await this.dispatchStoreAction(storeActions.LOOKUP_VEHICLE_BY_VIN, { const vinLookup = await this.dispatchStoreActionWithLogging(
vin: this.selectedVehicle.vin, storeActions.LOOKUP_VEHICLE_BY_VIN,
}).catch(() => { {
vin: this.selectedVehicle.vin,
},
"address-vehicles"
).catch(() => {
this.$refs.navbar.removeLoader(); this.$refs.navbar.removeLoader();
}); });
@ -186,7 +190,8 @@ export default {
} }
this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId( this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId(
vinLookup.data.carId vinLookup.data.carId,
"address-vehicles"
); );
await this.dispatchStoreAction( await this.dispatchStoreAction(

View file

@ -237,6 +237,11 @@ describe("capabilityQuestions.vue", () => {
data: [], data: [],
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: [],
};
});
// Act // Act
wrapper.vm.forwardButtonAction(); wrapper.vm.forwardButtonAction();
@ -272,6 +277,11 @@ describe("capabilityQuestions.vue", () => {
data: [], data: [],
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: [],
};
});
const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction"); const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction");
// Act // Act
@ -325,7 +335,12 @@ describe("capabilityQuestions.vue", () => {
data: [], data: [],
}; };
}); });
const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction"); wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: [],
};
});
const spy = jest.spyOn(wrapper.vm, "dispatchStoreActionWithLogging");
// Act // Act
wrapper.vm.forwardButtonAction(); wrapper.vm.forwardButtonAction();
@ -334,9 +349,10 @@ describe("capabilityQuestions.vue", () => {
//Assert //Assert
expect(spy).toHaveBeenNthCalledWith( expect(spy).toHaveBeenNthCalledWith(
2, 1,
"getPartFromCapabilityQuestionAnswer", "getPartFromCapabilityQuestionAnswer",
"Windshield", "Windshield",
"capability-questions",
false false
); );
@ -368,6 +384,11 @@ describe("capabilityQuestions.vue", () => {
data: [], data: [],
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: [],
};
});
wrapper.vm.navigateForward = jest.fn(); wrapper.vm.navigateForward = jest.fn();
// Act // Act

View file

@ -162,9 +162,10 @@ export default {
const partsOrQuestions = this.partsOrQuestionsData; const partsOrQuestions = this.partsOrQuestionsData;
for (let answer of questionAnswersArray) { for (let answer of questionAnswersArray) {
const partFromCapabilityQuestionAnswer = ( const partFromCapabilityQuestionAnswer = (
await this.dispatchStoreAction( await this.dispatchStoreActionWithLogging(
this.storeActions.GET_PART_FROM_CAPABILITY_QUESTION_ANSWER, this.storeActions.GET_PART_FROM_CAPABILITY_QUESTION_ANSWER,
answer.glassLocation, answer.glassLocation,
"capability-questions",
false false
) )
).data; ).data;

View file

@ -162,9 +162,10 @@ export default {
var vinByAddressPromise; var vinByAddressPromise;
if (zip) { if (zip) {
vinByAddressPromise = baseMixin.methods.dispatchStoreAction( vinByAddressPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.IS_VIN_BY_ADDRESS_PERMISSIBLE, storeActions.IS_VIN_BY_ADDRESS_PERMISSIBLE,
zip, { zip: zip },
"estimate",
false false
); );
} }
@ -259,13 +260,16 @@ export default {
if (vehicleChangedDuringPolicyLookupInHeritage) { if (vehicleChangedDuringPolicyLookupInHeritage) {
navigateToHeritageFunnel({ navigateToHeritageFunnel({
shouldSaveSession: true, shouldSaveSession: true,
pageNameToLog: "estimate",
loadingModal: this.$refs.loadingModal, loadingModal: this.$refs.loadingModal,
}); });
} else if (this.$store.getters.order.referralNumber?.length === 6) { } else if (this.$store.getters.order.referralNumber?.length === 6) {
await this.navigateForwardWithSingleCarMatch(); await this.navigateForwardWithSingleCarMatch();
} else if (this.isRepair) { } else if (this.isRepair) {
const supportingItemsPromise = await this.dispatchStoreAction( const supportingItemsPromise = await this.dispatchStoreActionWithLogging(
storeActions.GET_SUPPORTING_ITEMS storeActions.GET_SUPPORTING_ITEMS,
null,
"estimate"
); );
const promiseResultMap = [ const promiseResultMap = [
@ -284,7 +288,7 @@ export default {
); );
// call saveSession here - navigateWithSaving saves too late in the flow // call saveSession here - navigateWithSaving saves too late in the flow
await saveSession({}); await saveSession({ pageNameToLog: "estimate" });
return this.$router.navigateWithSaving( return this.$router.navigateWithSaving(
this.navigationScenarios.CLICKED_FORWARD_WITH_NO_QUESTIONS, this.navigationScenarios.CLICKED_FORWARD_WITH_NO_QUESTIONS,
this.$route this.$route

View file

@ -120,7 +120,7 @@ describe("license-plate-lookup.vue", () => {
wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => ""); wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => "");
wrapper.vm.navigateForward = jest.fn(); wrapper.vm.navigateForward = jest.fn();
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {
@ -157,7 +157,7 @@ describe("license-plate-lookup.vue", () => {
}); });
// Mock store action call // Mock store action call
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {
@ -201,7 +201,7 @@ describe("license-plate-lookup.vue", () => {
wrapper.vm.navigateForward = jest.fn(); wrapper.vm.navigateForward = jest.fn();
// Mock store action call // Mock store action call
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {
@ -242,7 +242,7 @@ describe("license-plate-lookup.vue", () => {
wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => { wrapper.vm.getCmsContent = jest.fn().mockImplementation(() => {
return ""; return "";
}); });
wrapper.vm.dispatchStoreAction = jest.fn(); wrapper.vm.dispatchStoreActionWithLogging = jest.fn();
await wrapper.vm.navigateForward(); await wrapper.vm.navigateForward();
@ -379,7 +379,7 @@ describe("license-plate-lookup.vue", () => {
return { data: { vehicle: { carId: "C00000" } } }; return { data: { vehicle: { carId: "C00000" } } };
}); });
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {
@ -417,7 +417,7 @@ describe("license-plate-lookup.vue", () => {
await wrapper.setData({ registrationZip: "00000" }); await wrapper.setData({ registrationZip: "00000" });
navigateToHeritage.navigateToHeritageFunnel = jest.fn(); navigateToHeritage.navigateToHeritageFunnel = jest.fn();
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {
@ -449,7 +449,7 @@ describe("license-plate-lookup.vue", () => {
await wrapper.setData({ registrationZipCode: "00000" }); await wrapper.setData({ registrationZipCode: "00000" });
navigateToHeritage.navigateToHeritageFunnel = jest.fn(); navigateToHeritage.navigateToHeritageFunnel = jest.fn();
wrapper.vm.dispatchStoreAction = jest.fn().mockImplementation(() => wrapper.vm.dispatchStoreActionWithLogging = jest.fn().mockImplementation(() =>
Promise.resolve({ Promise.resolve({
data: { data: {
vehicle: { vehicle: {

View file

@ -200,9 +200,10 @@ export default {
async forwardButtonAction() { async forwardButtonAction() {
this.resetWarningsAndErrors(); this.resetWarningsAndErrors();
const registrationZipValidationResponse = this.dispatchStoreAction( const registrationZipValidationResponse = this.dispatchStoreActionWithLogging(
storeActions.VALIDATE_ZIP, storeActions.VALIDATE_ZIP,
{ zip: this.registrationZipCode } { zip: this.registrationZipCode },
"license-plate-lookup"
); );
// Settle promises and get results // Settle promises and get results
@ -215,9 +216,13 @@ export default {
// If serviceZipCode is not set, then sets the response to the registrationZipValidationResponse. Calls VALIDATE_ZIP if the serviceZipCode is set. // If serviceZipCode is not set, then sets the response to the registrationZipValidationResponse. Calls VALIDATE_ZIP if the serviceZipCode is set.
resultKey: "serviceZipValidationResponse", resultKey: "serviceZipValidationResponse",
promise: this.serviceZipCode promise: this.serviceZipCode
? this.dispatchStoreAction(storeActions.VALIDATE_ZIP, { ? this.dispatchStoreActionWithLogging(
zip: this.serviceZipCode, storeActions.VALIDATE_ZIP,
}) {
zip: this.serviceZipCode,
},
"license-plate-lookup"
)
: registrationZipValidationResponse, : registrationZipValidationResponse,
}, },
]; ];
@ -261,7 +266,8 @@ export default {
this.displayMatchedDifferentVehicleAlert = true; this.displayMatchedDifferentVehicleAlert = true;
this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId( this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId(
vinLookup.data.vehicle.carId vinLookup.data.vehicle.carId,
"license-plate-lookup"
); );
// Update button "Continue with..." // Update button "Continue with..."
@ -313,9 +319,10 @@ export default {
return await this.navigateForward(); return await this.navigateForward();
}, },
lookupVin(plate, state) { lookupVin(plate, state) {
return this.dispatchStoreAction( return this.dispatchStoreActionWithLogging(
storeActions.LOOKUP_VIN_BY_PLATE, storeActions.LOOKUP_VIN_BY_PLATE,
{ licensePlate: plate, licenseState: state }, { licensePlate: plate, licenseState: state },
"license-plate-lookup",
false false
); );
}, },

View file

@ -248,6 +248,13 @@ describe("partQuestions.vue...", () => {
}, },
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: {
glassPieceParts: [],
},
};
});
// Act // Act
wrapper.vm.forwardButtonAction(); wrapper.vm.forwardButtonAction();
@ -281,6 +288,13 @@ describe("partQuestions.vue...", () => {
}, },
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: {
glassPieceParts: [],
},
};
});
const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction"); const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction");
// Act // Act
@ -328,7 +342,14 @@ describe("partQuestions.vue...", () => {
}, },
}; };
}); });
const spy = jest.spyOn(wrapper.vm, "dispatchStoreAction"); wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: {
glassPieceParts: [],
},
};
});
const spy = jest.spyOn(wrapper.vm, "dispatchStoreActionWithLogging");
// Act // Act
wrapper.vm.forwardButtonAction(); wrapper.vm.forwardButtonAction();
@ -336,7 +357,7 @@ describe("partQuestions.vue...", () => {
await nextTick(); await nextTick();
//Assert //Assert
expect(spy).toHaveBeenNthCalledWith(2, "getParts"); expect(spy).toHaveBeenNthCalledWith(1, "getParts", null, "part-questions");
wrapper.unmount(); wrapper.unmount();
}); });
@ -362,6 +383,13 @@ describe("partQuestions.vue...", () => {
}, },
}; };
}); });
wrapper.vm.dispatchStoreActionWithLogging = jest.fn(() => {
return {
data: {
glassPieceParts: [],
},
};
});
wrapper.vm.navigateForward = jest.fn(); wrapper.vm.navigateForward = jest.fn();
// Act // Act

View file

@ -145,7 +145,11 @@ export default {
); );
// call API parts method // call API parts method
const partsLookup = await this.dispatchStoreAction(this.storeActions.GET_PARTS); const partsLookup = await this.dispatchStoreActionWithLogging(
this.storeActions.GET_PARTS,
null,
"part-questions"
);
const glassPartsForStore = partsLookup.data.glassPieceParts; const glassPartsForStore = partsLookup.data.glassPieceParts;

View file

@ -36,6 +36,10 @@ jest.mock("@/mixins/base-mixin", () => ({
if (action === mockPriceOrderStoreAction) return items; if (action === mockPriceOrderStoreAction) return items;
else return mockStoreActionResults[action]; else return mockStoreActionResults[action];
}, },
dispatchStoreActionWithLogging(action, items, pageName, encode) {
if (action === mockPriceOrderStoreAction) return items;
else return mockStoreActionResults[action];
},
getTierOnePackagePrice() { getTierOnePackagePrice() {
return mockTierOnePrice; return mockTierOnePrice;
}, },

View file

@ -86,12 +86,20 @@ export default {
async beforeRouteEnter(to, from, next) { async beforeRouteEnter(to, from, next) {
// Call APIs // Call APIs
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const wipersPromise = baseMixin.methods.dispatchStoreAction(storeActions.GET_WIPERS); const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
const rainDefensePromise = baseMixin.methods.dispatchStoreAction( storeActions.GET_WIPERS,
storeActions.GET_RAIN_DEFENSE null,
"quote"
); );
const supportingItemsPromise = baseMixin.methods.dispatchStoreAction( const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_SUPPORTING_ITEMS storeActions.GET_RAIN_DEFENSE,
null,
"quote"
);
const supportingItemsPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_SUPPORTING_ITEMS,
null,
"quote"
); );
const promiseResultMap = [ const promiseResultMap = [
@ -124,11 +132,12 @@ export default {
...clonedGlassParts, ...clonedGlassParts,
]; ];
const pricingResults = await baseMixin.methods.dispatchStoreAction( const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA,
{ {
availableLineItems: availableLineItems, availableLineItems: availableLineItems,
}, },
"quote",
false false
); );
@ -236,6 +245,7 @@ export default {
if (payment.isInsurance) { if (payment.isInsurance) {
navigateToHeritageFunnel({ navigateToHeritageFunnel({
shouldSaveSession: true, shouldSaveSession: true,
pageNameToLog: "quote",
loadingModal: this.$refs.loadingModal, loadingModal: this.$refs.loadingModal,
}); });
} else { } else {

View file

@ -31,9 +31,15 @@ export default {
}, },
methods: { methods: {
loadInitialData() { loadInitialData() {
const wipersPromise = baseMixin.methods.dispatchStoreAction(storeActions.GET_WIPERS); const wipersPromise = baseMixin.methods.dispatchStoreActionWithLogging(
const rainDefensePromise = baseMixin.methods.dispatchStoreAction( storeActions.GET_WIPERS,
storeActions.GET_RAIN_DEFENSE null,
"review"
);
const rainDefensePromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_RAIN_DEFENSE,
null,
"review"
); );
const promiseResultMap = [ const promiseResultMap = [

View file

@ -2,11 +2,12 @@ import { storeActions } from "@/constants/store-actions";
import baseMixin from "@/mixins/base-mixin.js"; import baseMixin from "@/mixins/base-mixin.js";
export async function getAlertReasons(ctu) { export async function getAlertReasons(ctu) {
const alertReasons = await baseMixin.methods.dispatchStoreAction( const alertReasons = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_ALERT_REASONS_BY_CTU, storeActions.GET_ALERT_REASONS_BY_CTU,
{ {
ctu: ctu, ctu: ctu,
} },
"schedule"
); );
return Promise.resolve(alertReasons); return Promise.resolve(alertReasons);

View file

@ -70,6 +70,65 @@ jest.mock("@/mixins/base-mixin.js", () => ({
]); ]);
} }
}), }),
dispatchStoreActionWithLogging: jest.fn().mockImplementation((storeAction) => {
if (storeAction === "getShopTimeSlots") {
return {
data: {
estimatedServiceMinutesMinimum: 90,
estimatedServiceMinutesMaximum: 120,
days: [
{
date: "2023-12-01",
timeSlots: [
{
id: "06747-01820-S-B*20424*7 AM",
startTime: "07:00",
endTime: "08:00",
offerPremium: false,
},
],
},
],
},
};
}
if (storeAction === "getMobilePremiumFee") {
return Promise.resolve({
data: {
partNumber: "EARLY BIRD",
description: null,
partType: "EARLY BIRD",
laborAmount: 0,
sellingPrice: 14.99,
kitPrice: 0,
},
});
}
if (storeAction === "priceOrderItemsAndSaveServerData") {
return Promise.resolve([
{
partNumber: "EARLY BIRD",
description: null,
partType: "EARLY BIRD",
laborAmount: 0,
sellingPrice: 14.99,
kitPrice: 0,
},
]);
}
if (storeAction === "saveSupportingItemsSuppressingStateResetting") {
return Promise.resolve([
{
partNumber: "EARLY BIRD",
description: null,
partType: "EARLY BIRD",
laborAmount: 0,
sellingPrice: 14.99,
kitPrice: 0,
},
]);
}
}),
}, },
})); }));
@ -226,10 +285,11 @@ describe("schedule.vue...", () => {
); );
// Assert // Assert
expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalledTimes(3); expect(baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledTimes(3);
expect(baseMixin.methods.dispatchStoreAction).toHaveBeenCalledWith( expect(baseMixin.methods.dispatchStoreActionWithLogging).toHaveBeenCalledWith(
"getShopTimeSlots", "getShopTimeSlots",
expect.anything(), expect.anything(),
expect.anything(),
expect.anything() expect.anything()
); );
}); });

View file

@ -168,9 +168,10 @@ const getAvailableDates = async (
const makeParallelCalls = async () => { const makeParallelCalls = async () => {
await Promise.all( await Promise.all(
storeActionConfigs.map(async (storeAction) => { storeActionConfigs.map(async (storeAction) => {
const timeSlotsResponse = await baseMixin.methods.dispatchStoreAction( const timeSlotsResponse = await baseMixin.methods.dispatchStoreActionWithLogging(
storeAction.storeAction, storeAction.storeAction,
storeAction.payload, storeAction.payload,
"schedule",
false false
); );
timeSlotsResponsesData.estimatedServiceMinutesMinimum = timeSlotsResponsesData.estimatedServiceMinutesMinimum =
@ -218,17 +219,20 @@ export default {
preSelectedDate: preSelectedDate, preSelectedDate: preSelectedDate,
}); });
const premiumFeePromise = baseMixin.methods.dispatchStoreAction( const premiumFeePromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_MOBILE_PREMIUM_FEE storeActions.GET_MOBILE_PREMIUM_FEE,
null,
"schedule"
); );
const premiumFeeWithPricePromise = premiumFeePromise.then((result) => { const premiumFeeWithPricePromise = premiumFeePromise.then((result) => {
if (result.data) { if (result.data) {
return baseMixin.methods.dispatchStoreAction( return baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA,
{ {
availableLineItems: [result.data], availableLineItems: [result.data],
}, },
"schedule",
false false
); );
} else { } else {

View file

@ -2,42 +2,45 @@ import { storeActions } from "@/constants/store-actions";
import store from "@/store"; import store from "@/store";
import baseMixin from "@/mixins/base-mixin.js"; import baseMixin from "@/mixins/base-mixin.js";
export async function getPricedMobileFeePart(serviceZipCode) { export async function getPricedMobileFeePart(serviceZipCode, pageNameToLog) {
if (!serviceZipCode) { if (!serviceZipCode) {
return Promise.resolve(null); return Promise.resolve(null);
} }
const zipCodeData = await baseMixin.methods.getZipCodeData(serviceZipCode); const zipCodeData = await baseMixin.methods.getZipCodeData(serviceZipCode, pageNameToLog);
// Get the Mobile Fee Part // Get the Mobile Fee Part
const mobileFeePart = await baseMixin.methods.dispatchStoreAction( const mobileFeePart = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_MOBILE_FEE_PART, storeActions.GET_MOBILE_FEE_PART,
null, null,
pageNameToLog,
false false
); );
// Get the Mobile Fee Part Price // Get the Mobile Fee Part Price
const pricingResults = await baseMixin.methods.dispatchStoreAction( const pricingResults = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA, storeActions.PRICE_ORDER_ITEMS_AND_SAVE_SERVER_DATA,
{ {
availableLineItems: [mobileFeePart.data], availableLineItems: [mobileFeePart.data],
serviceZipCode: serviceZipCode, serviceZipCode: serviceZipCode,
serviceZipCodeCtu: zipCodeData.zipCodeCtu, serviceZipCodeCtu: zipCodeData.zipCodeCtu,
}, },
pageNameToLog,
false false
); );
return Promise.resolve(pricingResults[0]); return Promise.resolve(pricingResults[0]);
} }
export async function getServiceabilityDetails(serviceZipCode, lineItems) { export async function getServiceabilityDetails(serviceZipCode, lineItems, pageNameToLog) {
// Get the Mobile Fee Part // Get the Mobile Fee Part
const serviceabilityDetails = await baseMixin.methods.dispatchStoreAction( const serviceabilityDetails = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_SERVICEABILITY_DETAILS, storeActions.GET_SERVICEABILITY_DETAILS,
{ {
serviceZipCode: serviceZipCode, serviceZipCode: serviceZipCode,
lineItems: lineItems, lineItems: lineItems,
}, },
pageNameToLog,
false false
); );
@ -51,7 +54,7 @@ export async function getAvailabilityRating(
providerNumber providerNumber
) { ) {
// For a given shop provider number and date range, get the appointment time slots available // For a given shop provider number and date range, get the appointment time slots available
const shopTimeSlots = await baseMixin.methods.dispatchStoreAction( const shopTimeSlots = await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_SHOP_TIME_SLOTS, storeActions.GET_SHOP_TIME_SLOTS,
{ {
providerNumber: providerNumber, providerNumber: providerNumber,
@ -59,6 +62,7 @@ export async function getAvailabilityRating(
endDate: endDate, endDate: endDate,
shopAppointmentType: shopAppointmentType, shopAppointmentType: shopAppointmentType,
}, },
"service-location",
false false
); );

View file

@ -188,6 +188,47 @@ jest.mock("@/mixins/base-mixin.js", () => ({
}); });
} }
if (actionName === mockStoreActionGetShopTimeSlots) {
if (request.providerNumber == "0000001") {
return Promise.resolve(mockGetShopTimeSlotsGoodAvailability);
}
return Promise.resolve(mockGetShopTimeSlotsLowAvailability);
}
}),
dispatchStoreActionWithLogging: jest.fn().mockImplementation((actionName, request) => {
if (actionName === mockStoreActionGetMobileFeePart) {
return Promise.resolve({
data: {
partNumber: "MOBILE FEE",
description: "MOBILE FEE",
partType: "FEE",
},
});
}
if (actionName === mockStoreActionPriceOrderItemsAndSaveServerData) {
return Promise.resolve([
{
partNumber: "MOBILE FEE",
description: "MOBILE FEE",
partType: "FEE",
laborAmount: 49.99,
sellingPrice: 0,
kitPrice: 0,
},
]);
}
if (actionName === mockStoreActionGetServiceabilityDetails) {
return Promise.resolve({
isGlassServiceableInshop: true,
isRecalibrationServiceableInshop: true,
isGlassServiceableMobile: true,
isRecalibrationServiceableMobile: true,
});
}
if (actionName === mockStoreActionGetShopTimeSlots) { if (actionName === mockStoreActionGetShopTimeSlots) {
if (request.providerNumber == "0000001") { if (request.providerNumber == "0000001") {
return Promise.resolve(mockGetShopTimeSlotsGoodAvailability); return Promise.resolve(mockGetShopTimeSlotsGoodAvailability);

View file

@ -229,7 +229,8 @@ export default {
) { ) {
// Validate the Zip Code // Validate the Zip Code
const zipCodeData = await this.getZipCodeData( const zipCodeData = await this.getZipCodeData(
this.internalModel.addressQuestions.zipCode this.internalModel.addressQuestions.zipCode,
"service-location"
); );
if (!zipCodeData.isValid) { if (!zipCodeData.isValid) {
@ -238,10 +239,17 @@ export default {
} else { } else {
// retrieve mobile fee part // retrieve mobile fee part
const serviceZipCode = this.internalModel.addressQuestions.zipCode; const serviceZipCode = this.internalModel.addressQuestions.zipCode;
const mobileFeePart = await getPricedMobileFeePart(serviceZipCode); const mobileFeePart = await getPricedMobileFeePart(
serviceZipCode,
"service-location"
);
// retrieve serviceability details // retrieve serviceability details
const serviceabilityDetails = await getServiceabilityDetails(serviceZipCode); const serviceabilityDetails = await getServiceabilityDetails(
serviceZipCode,
null,
"service-location"
);
// update content related to service zip code // update content related to service zip code
this.$emit("updated-mobile-fee-part", mobileFeePart); this.$emit("updated-mobile-fee-part", mobileFeePart);

View file

@ -177,11 +177,15 @@ export default {
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const serviceZipCode = store.getters.order.serviceLocation.zipCode; const serviceZipCode = store.getters.order.serviceLocation.zipCode;
const getZipCodeData = baseMixin.methods.getZipCodeData(serviceZipCode); const getZipCodeData = baseMixin.methods.getZipCodeData(serviceZipCode, "service-location");
const serviceabilityDetailsPromise = getServiceabilityDetails(serviceZipCode); const serviceabilityDetailsPromise = getServiceabilityDetails(
serviceZipCode,
null,
"service-location"
);
const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode); const mobileFeePartPromise = getPricedMobileFeePart(serviceZipCode, "service-location");
const shopQuestionInitialDataPromise = shopQuestion.methods.loadInitialData(serviceZipCode); const shopQuestionInitialDataPromise = shopQuestion.methods.loadInitialData(serviceZipCode);

View file

@ -133,7 +133,10 @@ export default {
if (this.internalModel.zipCode !== this.modelValue.zipCode) { if (this.internalModel.zipCode !== this.modelValue.zipCode) {
this.resetAlerts(); this.resetAlerts();
const zipCodeData = await this.getZipCodeData(this.internalModel.zipCode); const zipCodeData = await this.getZipCodeData(
this.internalModel.zipCode,
"service-location"
);
if (!zipCodeData.isValid) { if (!zipCodeData.isValid) {
this.displayInvalidZipAlert = true; this.displayInvalidZipAlert = true;
@ -144,10 +147,17 @@ export default {
// retrieve mobile fee part // retrieve mobile fee part
const serviceZipCode = this.internalModel.zipCode; const serviceZipCode = this.internalModel.zipCode;
const mobileFeePart = await getPricedMobileFeePart(serviceZipCode); const mobileFeePart = await getPricedMobileFeePart(
serviceZipCode,
"service-location"
);
// retrieve serviceability details // retrieve serviceability details
const serviceabilityDetails = await getServiceabilityDetails(serviceZipCode); const serviceabilityDetails = await getServiceabilityDetails(
serviceZipCode,
null,
"service-location"
);
// update content related to service zip code // update content related to service zip code
this.$emit("updated-mobile-fee-part", mobileFeePart); this.$emit("updated-mobile-fee-part", mobileFeePart);

View file

@ -126,9 +126,13 @@ export default {
return this.loadData(serviceZipCode); return this.loadData(serviceZipCode);
}, },
loadData(serviceZipCode) { loadData(serviceZipCode) {
return baseMixin.methods.dispatchStoreAction(storeActions.GET_PROVIDERS, { return baseMixin.methods.dispatchStoreActionWithLogging(
serviceZipCode: serviceZipCode, storeActions.GET_PROVIDERS,
}); {
serviceZipCode: serviceZipCode,
},
"service-location"
);
}, },
initializeComponent(shopQuestionInitialData) { initializeComponent(shopQuestionInitialData) {
this.shopProviders = shopQuestionInitialData.shopProviders; this.shopProviders = shopQuestionInitialData.shopProviders;

View file

@ -173,9 +173,10 @@ describe("vehicle-damage.vue", () => {
//Assert //Assert
expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled();
expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace); expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace);
expect(baseMixin.methods.dispatchStoreAction).toBeCalledWith( expect(baseMixin.methods.dispatchStoreActionWithLogging).toBeCalledWith(
storeActions.GET_DAMAGE_OPTIONS, storeActions.GET_DAMAGE_OPTIONS,
{ carId: "C00000000" } { carId: "C00000000" },
"vehicle-damage"
); );
}); });
@ -268,9 +269,10 @@ describe("vehicle-damage.vue", () => {
//Assert //Assert
expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled(); expect(wrapper.vm.$router.navigateWithSaving).toHaveBeenCalled();
expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace); expect(wrapper.vm.selectedGlassToReplace()).toEqual(expectedGlassToReplace);
expect(baseMixin.methods.dispatchStoreAction).toBeCalledWith( expect(baseMixin.methods.dispatchStoreActionWithLogging).toBeCalledWith(
storeActions.GET_DAMAGE_OPTIONS, storeActions.GET_DAMAGE_OPTIONS,
{ carId: "C00000000" } { carId: "C00000000" },
"vehicle-damage"
); );
}); });
}); });
@ -789,6 +791,7 @@ function setupMocks({ pageHeaderWidgetHeaderText, mountOptionsMockData, funnelCo
mountOptionsMockData = Object.assign(mountOptionsMockDataDefault, mountOptionsMockData); mountOptionsMockData = Object.assign(mountOptionsMockDataDefault, mountOptionsMockData);
//Mock api responses //Mock api responses
baseMixin.methods.dispatchStoreAction = jest.fn(); baseMixin.methods.dispatchStoreAction = jest.fn();
baseMixin.methods.dispatchStoreActionWithLogging = jest.fn();
const apiResponses = { const apiResponses = {
cmsContent: { cmsContent: {
FunnelSubHeaderWidget: pageHeaderWidgetHeaderText, FunnelSubHeaderWidget: pageHeaderWidgetHeaderText,

View file

@ -110,9 +110,10 @@ export default {
// Call APIs // Call APIs
const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage); const cmsContentPromise = fetchCmsContentForPage(to.query.fmgPage);
const damageOptionsPromise = baseMixin.methods.dispatchStoreAction( const damageOptionsPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_DAMAGE_OPTIONS, storeActions.GET_DAMAGE_OPTIONS,
{ carId: store.getters.vehicle.carId } { carId: store.getters.vehicle.carId },
"vehicle-damage"
); );
// Settle promises and get results // Settle promises and get results
@ -345,8 +346,10 @@ export default {
); );
if (this.isWindshieldRepair) { if (this.isWindshieldRepair) {
const supportingItems = await this.dispatchStoreAction( const supportingItems = await this.dispatchStoreActionWithLogging(
storeActions.GET_SUPPORTING_ITEMS storeActions.GET_SUPPORTING_ITEMS,
null,
"vehicle-damage"
); );
this.dispatchStoreAction( this.dispatchStoreAction(
this.storeActions.SAVE_SUPPORTING_ITEMS, this.storeActions.SAVE_SUPPORTING_ITEMS,

View file

@ -122,9 +122,10 @@ export default {
const experimentForLogging = store.getters.applicationUser.experiments.find( const experimentForLogging = store.getters.applicationUser.experiments.find(
(e) => e.universeName === experimentUniverses.CONCEPT_FUNNEL (e) => e.universeName === experimentUniverses.CONCEPT_FUNNEL
); );
const yearQuestionInitialDataPromise = baseMixin.methods.dispatchStoreAction( const yearQuestionInitialDataPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_VEHICLE_YEARS, storeActions.GET_VEHICLE_YEARS,
{} {},
"vehicle"
); );
var makeQuestionInitialDataPromise = null; var makeQuestionInitialDataPromise = null;
var modelQuestionInitialDataPromise = null; var modelQuestionInitialDataPromise = null;
@ -135,35 +136,38 @@ export default {
store.getters.order.vehicle.model && store.getters.order.vehicle.model &&
store.getters.order.vehicle.style store.getters.order.vehicle.style
) { ) {
makeQuestionInitialDataPromise = baseMixin.methods.dispatchStoreAction( makeQuestionInitialDataPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_VEHICLE_MAKES, storeActions.GET_VEHICLE_MAKES,
{ {
year: store.getters.order.vehicle.year, year: store.getters.order.vehicle.year,
} },
"vehicle"
); );
modelQuestionInitialDataPromise = baseMixin.methods.dispatchStoreAction( modelQuestionInitialDataPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_VEHICLE_MODELS, storeActions.GET_VEHICLE_MODELS,
{ {
year: store.getters.order.vehicle.year, year: store.getters.order.vehicle.year,
make: store.getters.order.vehicle.make, make: store.getters.order.vehicle.make,
} },
"vehicle"
); );
styleQuestionInitialDataPromise = baseMixin.methods.dispatchStoreAction( styleQuestionInitialDataPromise = baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_VEHICLE_STYLES, storeActions.GET_VEHICLE_STYLES,
{ {
year: store.getters.order.vehicle.year, year: store.getters.order.vehicle.year,
make: store.getters.order.vehicle.make, make: store.getters.order.vehicle.make,
model: store.getters.order.vehicle.model, model: store.getters.order.vehicle.model,
} },
"vehicle"
); );
} }
// If the concept funnel experiment is found, as it should be when coming from safelite.com, then log the experiment exposure. // If the concept funnel experiment is found, as it should be when coming from safelite.com, then log the experiment exposure.
if (experimentForLogging !== undefined) { if (experimentForLogging !== undefined) {
// Log experiment exposure // Log experiment exposure
baseMixin.methods.dispatchStoreAction( baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.LOG_EXPERIMENT_EXPOSURE, storeActions.LOG_EXPERIMENT_EXPOSURE,
{ {
userId: getDeviceIdValue(), userId: getDeviceIdValue(),
@ -171,6 +175,7 @@ export default {
pageName: to.query.fmgPage, pageName: to.query.fmgPage,
experiment: experimentForLogging, experiment: experimentForLogging,
}, },
"vehicle",
false false
); );
} }
@ -299,12 +304,16 @@ export default {
}, },
methods: { methods: {
getVehicle(year, make, model, style) { getVehicle(year, make, model, style) {
return this.dispatchStoreAction(this.storeActions.GET_VEHICLE, { return this.dispatchStoreActionWithLogging(
year: year, this.storeActions.GET_VEHICLE,
make: make, {
model: model, year: year,
style: style, make: make,
}); model: model,
style: style,
},
"vehicle"
);
}, },
arePagePrerequisitesValid() { arePagePrerequisitesValid() {
return true; return true;
@ -349,24 +358,36 @@ export default {
return store.getters.vehicle.style; return store.getters.vehicle.style;
}, },
async getMakeOptions(year) { async getMakeOptions(year) {
return await baseMixin.methods.dispatchStoreAction(storeActions.GET_VEHICLE_MAKES, { return await baseMixin.methods.dispatchStoreActionWithLogging(
year: year, storeActions.GET_VEHICLE_MAKES,
}); {
year: year,
},
"vehicle"
);
}, },
async getModelOptions(year, make) { async getModelOptions(year, make) {
return await baseMixin.methods.dispatchStoreAction(storeActions.GET_VEHICLE_MODELS, { return await baseMixin.methods.dispatchStoreActionWithLogging(
year: year, storeActions.GET_VEHICLE_MODELS,
make: make, {
}); year: year,
make: make,
},
"vehicle"
);
}, },
async getStyleOptions(year, make, model) { async getStyleOptions(year, make, model) {
return await baseMixin.methods.dispatchStoreAction(storeActions.GET_VEHICLE_STYLES, { return await baseMixin.methods.dispatchStoreActionWithLogging(
year: year, storeActions.GET_VEHICLE_STYLES,
make: make, {
model: model, year: year,
}); make: make,
model: model,
},
"vehicle"
);
}, },
getImagefromStore() { getImagefromStore() {
return store.getters.vehicle.imageUrl; return store.getters.vehicle.imageUrl;

View file

@ -249,9 +249,10 @@ export default {
// If this is a new VIN Lookup, do both a Vehicle Lookup and a Zip Validation // If this is a new VIN Lookup, do both a Vehicle Lookup and a Zip Validation
if (!this.vinPopulatedOnPageLoad) { if (!this.vinPopulatedOnPageLoad) {
const vehicleLookupResponse = this.dispatchStoreAction( const vehicleLookupResponse = this.dispatchStoreActionWithLogging(
storeActions.LOOKUP_VEHICLE_BY_VIN, storeActions.LOOKUP_VEHICLE_BY_VIN,
{ vin: this.vin } { vin: this.vin },
"vin-lookup"
); );
// Settle promises and get results // Settle promises and get results
@ -305,7 +306,8 @@ export default {
this.displayMatchedDifferentVehicleAlert = true; this.displayMatchedDifferentVehicleAlert = true;
this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId( this.isSelectedGlassAvailableForVehicle = await isGlassAvailableForCarId(
resultMap.vehicleLookupResponse.carId resultMap.vehicleLookupResponse.carId,
"vin-lookup"
); );
// Update button "Continue with..." // Update button "Continue with..."
@ -393,7 +395,11 @@ export default {
}, },
getVinFromImage(image) { getVinFromImage(image) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
this.dispatchStoreAction(storeActions.LOOKUP_VIN_BY_IMAGE, image) this.dispatchStoreActionWithLogging(
storeActions.LOOKUP_VIN_BY_IMAGE,
image,
"vin-lookup"
)
.then((response) => { .then((response) => {
if (response.data.length > 0) { if (response.data.length > 0) {
resolve(response.data[0]); resolve(response.data[0]);

View file

@ -31,6 +31,19 @@ export default {
return store.dispatch(type, payload); return store.dispatch(type, payload);
}, },
dispatchStoreActionWithLogging(type, payload, pageNameToLog, encodePayload = true) {
// Encode the payload if required
if (encodePayload) {
encodeUriData(payload);
}
const wrappedParams = {
payload: payload,
pageNameToLog: pageNameToLog,
};
return store.dispatch(type, wrappedParams);
},
savePageDataToStore(page, data) { savePageDataToStore(page, data) {
store.commit(storeMutations.UPDATE_PAGE_DATA, { page: page, data: data }); store.commit(storeMutations.UPDATE_PAGE_DATA, { page: page, data: data });
}, },
@ -50,10 +63,16 @@ export default {
const footerInfoBox = document.querySelector(".footer#infoBox"); const footerInfoBox = document.querySelector(".footer#infoBox");
return footerInfoBox ? footerInfoBox.offsetHeight : 0; return footerInfoBox ? footerInfoBox.offsetHeight : 0;
}, },
async getZipCodeData(zipCode) { async getZipCodeData(zipCode, pageNameToLog = null) {
const serviceZipValidationResponse = await this.dispatchStoreAction( const pageName = pageNameToLog ?? this.$options?.name;
if (pageName == null) {
console.log("Missed a spot.");
}
const serviceZipValidationResponse = await this.dispatchStoreActionWithLogging(
storeActions.VALIDATE_ZIP, storeActions.VALIDATE_ZIP,
{ zip: zipCode } { zip: zipCode },
pageName
); );
return { return {

View file

@ -101,8 +101,8 @@ describe("baseMixin.js", () => {
test("getZipCodeData calls dispatch", () => { test("getZipCodeData calls dispatch", () => {
const mixIn = getMixInInstance({}); const mixIn = getMixInInstance({});
mixIn.methods.dispatchStoreAction = jest.fn(); mixIn.methods.dispatchStoreActionWithLogging = jest.fn();
mixIn.methods.dispatchStoreAction.mockReturnValue({ mixIn.methods.dispatchStoreActionWithLogging.mockReturnValue({
data: { isValid: true, isServiceable: true, state: "OH" }, data: { isValid: true, isServiceable: true, state: "OH" },
}); });
const type = ""; const type = "";
@ -118,7 +118,7 @@ describe("baseMixin.js", () => {
mixIn.methods.getZipCodeData(type, payload); mixIn.methods.getZipCodeData(type, payload);
expect(mixIn.methods.dispatchStoreAction).toBeCalled(); expect(mixIn.methods.dispatchStoreActionWithLogging).toBeCalled();
}); });
}); });

View file

@ -408,12 +408,13 @@ export default {
for (let partOrQuestion of partsOrQuestions) { for (let partOrQuestion of partsOrQuestions) {
if (this.hasCapabilityQuestions([partOrQuestion])) { if (this.hasCapabilityQuestions([partOrQuestion])) {
let capabilityQuestionsForGlassLocation = ( let capabilityQuestionsForGlassLocation = (
await baseMixin.methods.dispatchStoreAction( await baseMixin.methods.dispatchStoreActionWithLogging(
storeActions.GET_CAPABILITY_QUESTIONS, storeActions.GET_CAPABILITY_QUESTIONS,
{ {
carId: store.getters.vehicle.carId, carId: store.getters.vehicle.carId,
partNumber: partOrQuestion.parts[0].partNumber, partNumber: partOrQuestion.parts[0].partNumber,
} },
currentPage
) )
).data; ).data;
@ -449,11 +450,13 @@ export default {
if (store.getters.order.referralNumber?.length === 6) { if (store.getters.order.referralNumber?.length === 6) {
navigateToHeritageFunnel({ navigateToHeritageFunnel({
shouldSaveSession: true, shouldSaveSession: true,
pageNameToLog: currentPage,
loadingModal: self.$refs.loadingModal, loadingModal: self.$refs.loadingModal,
}); });
} else if (payment.isInsurance && payment.insuranceCoverage.isVerified) { } else if (payment.isInsurance && payment.insuranceCoverage.isVerified) {
navigateToHeritageFunnel({ navigateToHeritageFunnel({
shouldSaveSession: true, shouldSaveSession: true,
pageNameToLog: currentPage,
loadingModal: self.$refs.loadingModal, loadingModal: self.$refs.loadingModal,
}); });
} else { } else {

View file

@ -6,12 +6,16 @@ import { saveSession } from "@/helpers/heritage-integration/order-helper.js";
export default { export default {
methods: { methods: {
async navigateForwardWithSingleCarMatch() { async navigateForwardWithSingleCarMatch() {
const pageName = this.$options?.name;
// If we have not already saved a session, we need to save one now before the lengthy call to getPartsOrQuestions // If we have not already saved a session, we need to save one now before the lengthy call to getPartsOrQuestions
if (!store.getters.applicationUser.savedSessionId) { if (!store.getters.applicationUser.savedSessionId) {
await saveSession({}); await saveSession({ pageNameToLog: pageName });
} }
const result = await this.dispatchStoreAction(storeActions.GET_PARTS_OR_QUESTIONS); const result = await this.dispatchStoreAction(storeActions.GET_PARTS_OR_QUESTIONS, {
pageNameToLog: pageName,
});
const partsOrQuestions = result.data.partsOrQuestions; const partsOrQuestions = result.data.partsOrQuestions;
vehicleQuestionsMixin.methods.navigateForward(partsOrQuestions, this); vehicleQuestionsMixin.methods.navigateForward(partsOrQuestions, this);

View file

@ -72,7 +72,8 @@ const routes = [
? to.query.isInsurance == "true" ? to.query.isInsurance == "true"
? true ? true
: false : false
: null : null,
to.query.fmgPage
); );
const pageToRedirectTo = await getPageToRouteExistingOrderTo(to); const pageToRedirectTo = await getPageToRouteExistingOrderTo(to);
@ -172,7 +173,7 @@ router.afterEach(async (to, from) => {
store.getters.applicationUser.savedSessionId || store.getters.applicationUser.savedSessionId ||
store.getters.order.customer?.emailAddress store.getters.order.customer?.emailAddress
) { ) {
await saveSession({}); await saveSession({ pageNameToLog: to.query.fmgPage });
} }
} }
@ -384,18 +385,26 @@ function arePagePrerequisitesValid(component) {
// Run SiteEntry and PageEntry triggers for experiments // Run SiteEntry and PageEntry triggers for experiments
async function runExperiments(nextPage) { async function runExperiments(nextPage) {
if (!store.getters.applicationUser.triggeredSiteEntry) { if (!store.getters.applicationUser.triggeredSiteEntry) {
await baseMixin.methods.dispatchStoreAction(storeActions.RUN_EXPERIMENTS_FOR_TRIGGER, { await baseMixin.methods.dispatchStoreActionWithLogging(
userId: getDeviceIdValue(), storeActions.RUN_EXPERIMENTS_FOR_TRIGGER,
triggerEvent: experimentTriggers.SITE_ENTRY, {
triggerValue: applicationConfig.SITE_ENTRY_TRIGGER_VALUE, userId: getDeviceIdValue(),
}); triggerEvent: experimentTriggers.SITE_ENTRY,
triggerValue: applicationConfig.SITE_ENTRY_TRIGGER_VALUE,
},
nextPage
);
} }
await baseMixin.methods.dispatchStoreAction(storeActions.RUN_EXPERIMENTS_FOR_TRIGGER, { await baseMixin.methods.dispatchStoreActionWithLogging(
userId: getDeviceIdValue(), storeActions.RUN_EXPERIMENTS_FOR_TRIGGER,
triggerEvent: experimentTriggers.PAGE_ENTRY, {
triggerValue: nextPage, userId: getDeviceIdValue(),
}); triggerEvent: experimentTriggers.PAGE_ENTRY,
triggerValue: nextPage,
},
nextPage
);
} }
export default router; export default router;

View file

@ -658,33 +658,39 @@ function getTimeSlotsAdditionalEventData(
// Export Actions // Export Actions
export const actions = { export const actions = {
// Vehicle API Actions // Vehicle API Actions
getVehicleYears(context) { getVehicleYears(context, { pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetVehicleYears.method, method: endpoints.GetVehicleYears.method,
endpoint: endpoints.GetVehicleYears.url, endpoint: endpoints.GetVehicleYears.url,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
lookupVehicleByYmms(context, { year, make, model, style }) { lookupVehicleByYmms(context, { payload: { year, make, model, style }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LookupVehicleByYmms.method, method: endpoints.LookupVehicleByYmms.method,
endpoint: `${endpoints.LookupVehicleByYmms.url}/${year}/${make}/${model}/${style}`, endpoint: `${endpoints.LookupVehicleByYmms.url}/${year}/${make}/${model}/${style}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
lookupVehicleByVin(context, { vin }) { lookupVehicleByVin(context, { payload: { vin }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LookupVehicleByVin.method, method: endpoints.LookupVehicleByVin.method,
endpoint: endpoints.LookupVehicleByVin.url, endpoint: endpoints.LookupVehicleByVin.url,
payload: { payload: {
vin: vin, // EX "1J4GW58S4XC541166" vin: vin, // EX "1J4GW58S4XC541166"
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
lookupVinByPlate(context, { licensePlate, licenseState }) { lookupVinByPlate(context, { payload: { licensePlate, licenseState }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LookupVinByPlate.method, method: endpoints.LookupVinByPlate.method,
endpoint: endpoints.LookupVinByPlate.url, endpoint: endpoints.LookupVinByPlate.url,
@ -692,12 +698,17 @@ export const actions = {
licensePlate: licensePlate, licensePlate: licensePlate,
licenseState: licenseState, licenseState: licenseState,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
lookupVinByAddress( lookupVinByAddress(
context, context,
{ licenseLastName, licenseStreetAddress, licenseZip, licenseState } {
payload: { licenseLastName, licenseStreetAddress, licenseZip, licenseState },
pageNameToLog,
}
) { ) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LookupVinByAddress.method, method: endpoints.LookupVinByAddress.method,
@ -708,10 +719,14 @@ export const actions = {
licenseZip: licenseZip, licenseZip: licenseZip,
licenseState: licenseState, licenseState: licenseState,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
lookupVinByImage(context, image) { lookupVinByImage(context, { payload, pageNameToLog }) {
const image = payload;
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let reader = new FileReader(); let reader = new FileReader();
reader.onload = (e) => { reader.onload = (e) => {
@ -733,68 +748,84 @@ export const actions = {
method: endpoints.LookupVinByImage.method, method: endpoints.LookupVinByImage.method,
endpoint: endpoints.LookupVinByImage.url, endpoint: endpoints.LookupVinByImage.url,
payload: data, payload: data,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}); });
}, },
isVinByAddressPermissible(context, zip) { isVinByAddressPermissible(context, { payload: { zip }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.IsVinByAddressPermissible.method, method: endpoints.IsVinByAddressPermissible.method,
endpoint: `${endpoints.IsVinByAddressPermissible.url}?zipcode=${zip}`, endpoint: `${endpoints.IsVinByAddressPermissible.url}?zipcode=${zip}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getVehicleMakes(context, { year }) { getVehicleMakes(context, { payload: { year }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetVehicleMakes.method, method: endpoints.GetVehicleMakes.method,
endpoint: `${endpoints.GetVehicleMakes.url}/${year}`, endpoint: `${endpoints.GetVehicleMakes.url}/${year}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getVehicleModels(context, { year, make }) { getVehicleModels(context, { payload: { year, make }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetVehicleModels.method, method: endpoints.GetVehicleModels.method,
endpoint: `${endpoints.GetVehicleModels.url}/${year}/${make}`, endpoint: `${endpoints.GetVehicleModels.url}/${year}/${make}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getVehicleStyles(context, { year, make, model }) { getVehicleStyles(context, { payload: { year, make, model }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetVehicleStyles.method, method: endpoints.GetVehicleStyles.method,
endpoint: `${endpoints.GetVehicleStyles.url}/${year}/${make}/${model}`, endpoint: `${endpoints.GetVehicleStyles.url}/${year}/${make}/${model}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getVehicle(context, { year, make, model, style }) { getVehicle(context, { payload: { year, make, model, style }, pageNameToLog }) {
return globalMethods return globalMethods
.callHttpClient({ .callHttpClient({
methods: endpoints.GetVehicle.method, methods: endpoints.GetVehicle.method,
endpoint: `${endpoints.GetVehicle.url}/${year}/${make}/${model}/${style}`, endpoint: `${endpoints.GetVehicle.url}/${year}/${make}/${model}/${style}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}) })
.then((response) => { .then((response) => {
return response; return response;
}); });
}, },
getDamageOptions(context, { carId }) { getDamageOptions(context, { payload: { carId }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
methods: endpoints.GetDamageOptions.method, methods: endpoints.GetDamageOptions.method,
endpoint: `${endpoints.GetDamageOptions.url}/${carId}`, endpoint: `${endpoints.GetDamageOptions.url}/${carId}`,
payload: {}, payload: {},
additionalSuccessEventDataHandler: (response) => additionalSuccessEventDataHandler: (response) =>
"QueryStringZip: " + getQuerystringParameter(queryStrings.ZIP_CODE), "QueryStringZip: " + getQuerystringParameter(queryStrings.ZIP_CODE),
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
validateZip(context, { zip }) { validateZip(context, { payload: { zip }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
methods: endpoints.ValidateZip.method, methods: endpoints.ValidateZip.method,
endpoint: `${endpoints.ValidateZip.url}/${zip}`, endpoint: `${endpoints.ValidateZip.url}/${zip}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
@ -843,6 +874,8 @@ export const actions = {
payload: { payload: {
pageName: pageName, pageName: pageName,
}, },
logApiCall: true,
pageNameToLog: pageName,
}); });
}, },
@ -861,11 +894,16 @@ export const actions = {
pageName pageName
), ),
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageName,
}); });
}, },
// Analytics Actions // Analytics Actions
logExperimentExposure(context, { userId, sessionKey, pageName, experiment }) { logExperimentExposure(
context,
{ payload: { userId, sessionKey, pageName, experiment }, pageNameToLog }
) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.LogExperimentExposureIfAssigned.method, method: endpoints.LogExperimentExposureIfAssigned.method,
endpoint: endpoints.LogExperimentExposureIfAssigned.url, endpoint: endpoints.LogExperimentExposureIfAssigned.url,
@ -886,15 +924,19 @@ export const actions = {
pageName: pageName, pageName: pageName,
}, },
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
// Location API Actions // Location API Actions
getAlertReasonsByCtu(context, { ctu }) { getAlertReasonsByCtu(context, { payload: { ctu }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetAlertReasons.method, method: endpoints.GetAlertReasons.method,
endpoint: `${endpoints.GetAlertReasons.url}/${ctu}`, endpoint: `${endpoints.GetAlertReasons.url}/${ctu}`,
payload: {}, payload: {},
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
@ -1062,7 +1104,10 @@ export const actions = {
}); });
}, },
async runExperimentsForTrigger(context, { userId, triggerEvent, triggerValue }) { async runExperimentsForTrigger(
context,
{ payload: { userId, triggerEvent, triggerValue }, pageNameToLog }
) {
if (triggerEvent == experimentTriggers.SITE_ENTRY) { if (triggerEvent == experimentTriggers.SITE_ENTRY) {
context.commit(storeMutations.UPDATE_TRIGGERED_SITE_ENTRY, true); context.commit(storeMutations.UPDATE_TRIGGERED_SITE_ENTRY, true);
} }
@ -1079,6 +1124,8 @@ export const actions = {
method: endpoints.RunExperimentsForTrigger.method, method: endpoints.RunExperimentsForTrigger.method,
endpoint: endpoints.RunExperimentsForTrigger.url, endpoint: endpoints.RunExperimentsForTrigger.url,
payload: payload, payload: payload,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
context.commit(storeMutations.UPDATE_EXPERIMENTS, response.data.experiments); context.commit(storeMutations.UPDATE_EXPERIMENTS, response.data.experiments);
@ -1093,7 +1140,7 @@ export const actions = {
}, },
// PartsOrQuestions API Actions // PartsOrQuestions API Actions
async getPartsOrQuestions(context) { async getPartsOrQuestions(context, { pageNameToLog }) {
const vehicle = context.getters.vehicle; const vehicle = context.getters.vehicle;
const damage = context.getters.damage; const damage = context.getters.damage;
const order = context.state.order; const order = context.state.order;
@ -1115,6 +1162,8 @@ export const actions = {
zip: zipCode, zip: zipCode,
vin: vin, vin: vin,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
// Flatten location and name properties // Flatten location and name properties
@ -1126,7 +1175,7 @@ export const actions = {
}, },
// Parts API Actions // Parts API Actions
async getParts(context) { async getParts(context, { pageNameToLog }) {
const vehicle = context.getters.vehicle; const vehicle = context.getters.vehicle;
const damage = context.getters.damage; const damage = context.getters.damage;
const order = context.state.order; const order = context.state.order;
@ -1151,6 +1200,8 @@ export const actions = {
zip: zipCode, zip: zipCode,
vin: vin, vin: vin,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
// Flatten location and name properties // Flatten location and name properties
@ -1161,13 +1212,15 @@ export const actions = {
return response; return response;
}, },
getWipers(context) { getWipers(context, { pageNameToLog }) {
const carId = context.getters.vehicle.carId; const carId = context.getters.vehicle.carId;
const serviceZipCode = context.getters.order.serviceLocation.zipCode; const serviceZipCode = context.getters.order.serviceLocation.zipCode;
return globalMethods return globalMethods
.callHttpClient({ .callHttpClient({
method: endpoints.GetWipers.method, method: endpoints.GetWipers.method,
endpoint: `${endpoints.GetWipers.url}/${carId}/${serviceZipCode}`, endpoint: `${endpoints.GetWipers.url}/${carId}/${serviceZipCode}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}) })
.catch((error) => { .catch((error) => {
// The wiper service sometimes returns 500s on legitimate carId/zipCode combination - return empty array instead of breaking flow // The wiper service sometimes returns 500s on legitimate carId/zipCode combination - return empty array instead of breaking flow
@ -1175,14 +1228,16 @@ export const actions = {
}); });
}, },
getRainDefense(context) { getRainDefense(context, { pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetRainDefense.method, method: endpoints.GetRainDefense.method,
endpoint: endpoints.GetRainDefense.url, endpoint: endpoints.GetRainDefense.url,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getMobileFeePart(context) { getMobileFeePart(context, { pageNameToLog }) {
const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; const damageType = context.getters.damage.isRepair ? "Repair" : "Replace";
const parentAccountNumber = context.getters.payment.parentAccountNumber; const parentAccountNumber = context.getters.payment.parentAccountNumber;
const billToAccountNumber = 87291; // TODO: MAKE THIS REAL const billToAccountNumber = 87291; // TODO: MAKE THIS REAL
@ -1190,10 +1245,12 @@ export const actions = {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetMobileFeePart.method, method: endpoints.GetMobileFeePart.method,
endpoint: `${endpoints.GetMobileFeePart.url}/${damageType}/${parentAccountNumber}/${billToAccountNumber}`, endpoint: `${endpoints.GetMobileFeePart.url}/${damageType}/${parentAccountNumber}/${billToAccountNumber}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getServiceabilityDetails(context, { serviceZipCode }) { getServiceabilityDetails(context, { payload: { serviceZipCode }, pageNameToLog }) {
const lineItemsWithOnlyPartNumbers = context.getters.order.lineItems.supportingItems.map( const lineItemsWithOnlyPartNumbers = context.getters.order.lineItems.supportingItems.map(
(lineItem) => ({ (lineItem) => ({
partNumber: lineItem.partNumber, partNumber: lineItem.partNumber,
@ -1217,20 +1274,24 @@ export const actions = {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetServiceabilityDetails.method, method: endpoints.GetServiceabilityDetails.method,
endpoint: `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}&${lineItems}&${glassPieces}`, endpoint: `${endpoints.GetServiceabilityDetails.url}?zip=${serviceZipCode}&carId=${carId}&${lineItems}&${glassPieces}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getProviders(context, { serviceZipCode }) { getProviders(context, { payload: { serviceZipCode }, pageNameToLog }) {
const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; const damageType = context.getters.damage.isRepair ? "Repair" : "Replace";
const shopRadiusInMiles = 100; const shopRadiusInMiles = 100;
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetProviders.method, method: endpoints.GetProviders.method,
endpoint: `${endpoints.GetProviders.url}/${serviceZipCode}/${damageType}/${shopRadiusInMiles}`, endpoint: `${endpoints.GetProviders.url}/${serviceZipCode}/${damageType}/${shopRadiusInMiles}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getSupportingItems(context) { getSupportingItems(context, { pageNameToLog }) {
const glassPartsArray = context.getters.lineItems.glassParts ?? []; const glassPartsArray = context.getters.lineItems.glassParts ?? [];
const carId = context.getters.vehicle.carId; const carId = context.getters.vehicle.carId;
const isRepair = context.getters.damage.isRepair; const isRepair = context.getters.damage.isRepair;
@ -1246,17 +1307,22 @@ export const actions = {
parts: glassPartsArray, parts: glassPartsArray,
numberOfRepairChips: isRepair ? numberOfChips : 0, numberOfRepairChips: isRepair ? numberOfChips : 0,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getCapabilityQuestions(context, { carId, partNumber }) { getCapabilityQuestions(context, { payload: { carId, partNumber }, pageNameToLog }) {
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetCapabilityQuestions.method, method: endpoints.GetCapabilityQuestions.method,
endpoint: `${endpoints.GetCapabilityQuestions.url}/${carId}/${partNumber}`, endpoint: `${endpoints.GetCapabilityQuestions.url}/${carId}/${partNumber}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getPartFromCapabilityQuestionAnswer(context, glassLocation) { getPartFromCapabilityQuestionAnswer(context, { payload, pageNameToLog }) {
const glassLocation = payload;
const pageData = context.getters.pageData(fmgPageValues.CAPABILITY_QUESTIONS); const pageData = context.getters.pageData(fmgPageValues.CAPABILITY_QUESTIONS);
const part = pageData.partsOrQuestions.find((x) => x.glassLocation === glassLocation) const part = pageData.partsOrQuestions.find((x) => x.glassLocation === glassLocation)
@ -1273,10 +1339,15 @@ export const actions = {
part, part,
capabilityAnswerResults: capabilityQuestionAnswersForPart, capabilityAnswerResults: capabilityQuestionAnswersForPart,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
getShopTimeSlots(context, { startDate, endDate, shopAppointmentType, providerNumber }) { getShopTimeSlots(
context,
{ payload: { startDate, endDate, shopAppointmentType, providerNumber }, pageNameToLog }
) {
const order = context.state.order; const order = context.state.order;
const vehicle = context.state.order.vehicle; const vehicle = context.state.order.vehicle;
@ -1331,6 +1402,8 @@ export const actions = {
method: endpoints.GetShopTimeSlots.method, method: endpoints.GetShopTimeSlots.method,
endpoint: endpoints.GetShopTimeSlots.url, endpoint: endpoints.GetShopTimeSlots.url,
payload: payload, payload: payload,
logApiCall: true,
pageNameToLog: pageNameToLog,
additionalSuccessEventDataHandler: (response) => additionalSuccessEventDataHandler: (response) =>
getTimeSlotsAdditionalEventData( getTimeSlotsAdditionalEventData(
response.data.provisionalTriggers, response.data.provisionalTriggers,
@ -1341,7 +1414,7 @@ export const actions = {
}); });
}, },
getMobileTimeSlots(context, { startDate, endDate }) { getMobileTimeSlots(context, { payload: { startDate, endDate }, pageNameToLog }) {
const order = context.state.order; const order = context.state.order;
const vehicle = context.state.order.vehicle; const vehicle = context.state.order.vehicle;
let lineItems = [ let lineItems = [
@ -1393,6 +1466,8 @@ export const actions = {
method: endpoints.GetMobileTimeSlots.method, method: endpoints.GetMobileTimeSlots.method,
endpoint: endpoints.GetMobileTimeSlots.url, endpoint: endpoints.GetMobileTimeSlots.url,
payload: payload, payload: payload,
logApiCall: true,
pageNameToLog: pageNameToLog,
additionalSuccessEventDataHandler: (response) => additionalSuccessEventDataHandler: (response) =>
getTimeSlotsAdditionalEventData( getTimeSlotsAdditionalEventData(
response.data.provisionalTriggers, response.data.provisionalTriggers,
@ -1402,18 +1477,20 @@ export const actions = {
}); });
}, },
getMobilePremiumFee(context) { getMobilePremiumFee(context, { pageNameToLog }) {
const damageType = context.getters.damage.isRepair ? "Repair" : "Replace"; const damageType = context.getters.damage.isRepair ? "Repair" : "Replace";
const paymentType = context.getters.order.payment.isInsurance ? "Insurance" : "Cash"; const paymentType = context.getters.order.payment.isInsurance ? "Insurance" : "Cash";
return globalMethods.callHttpClient({ return globalMethods.callHttpClient({
method: endpoints.GetMobilePremiumFee.method, method: endpoints.GetMobilePremiumFee.method,
endpoint: `${endpoints.GetMobilePremiumFee.url}/${paymentType}/${damageType}`, endpoint: `${endpoints.GetMobilePremiumFee.url}/${paymentType}/${damageType}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
}, },
// Session API Actions // Session API Actions
saveSession(context) { saveSession(context, { pageNameToLog }) {
const vehicle = context.getters.vehicle; const vehicle = context.getters.vehicle;
const damage = context.getters.damage; const damage = context.getters.damage;
const order = context.state.order; const order = context.state.order;
@ -1519,6 +1596,8 @@ export const actions = {
eon: order.eon, eon: order.eon,
}, },
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
additionalSuccessEventDataHandler: (response) => additionalSuccessEventDataHandler: (response) =>
"Email provided: " + (order.customer.emailAddress ? "true" : "false"), "Email provided: " + (order.customer.emailAddress ? "true" : "false"),
}); });
@ -1527,12 +1606,15 @@ export const actions = {
loadSession( loadSession(
context, context,
{ {
savedSessionId, payload: {
referralNumber, savedSessionId,
referralDate, referralNumber,
parentAccountNumber, referralDate,
referralCorrelationId, parentAccountNumber,
isConceptInsurance, referralCorrelationId,
isConceptInsurance,
},
pageNameToLog,
} }
) { ) {
const order = context.state.order; const order = context.state.order;
@ -1548,6 +1630,8 @@ export const actions = {
parentAccountNumber: parentAccountNumber, parentAccountNumber: parentAccountNumber,
referralCorrelationId: referralCorrelationId, referralCorrelationId: referralCorrelationId,
}, },
logApiCall: true,
pageNameToLog: pageNameToLog,
}) })
.then( .then(
async (response) => { async (response) => {
@ -1905,7 +1989,7 @@ export const actions = {
// Price order actions // Price order actions
async priceOrderItemsAndSaveServerData( async priceOrderItemsAndSaveServerData(
context, context,
{ availableLineItems, serviceZipCode, serviceZipCodeCtu } { payload: { availableLineItems, serviceZipCode, serviceZipCodeCtu }, pageNameToLog }
) { ) {
const zipCodeToUse = serviceZipCode const zipCodeToUse = serviceZipCode
? serviceZipCode ? serviceZipCode
@ -1945,6 +2029,8 @@ export const actions = {
const response = await globalMethods.callHttpClient({ const response = await globalMethods.callHttpClient({
method: endpoints.PriceOrderItems.method, method: endpoints.PriceOrderItems.method,
endpoint: `${endpoints.PriceOrderItems.url}?${queryString}`, endpoint: `${endpoints.PriceOrderItems.url}?${queryString}`,
logApiCall: true,
pageNameToLog: pageNameToLog,
}); });
context.commit(storeMutations.UPDATE_LINE_ITEMS_SERVER_DATA, response.data.serverData); context.commit(storeMutations.UPDATE_LINE_ITEMS_SERVER_DATA, response.data.serverData);

View file

@ -370,7 +370,7 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.getVehicleYears(context); const response = await actions.getVehicleYears(context, { pageNameToLog: "test" });
expect(response.data).toEqual([2023, 2022, 2021]); expect(response.data).toEqual([2023, 2022, 2021]);
}); });
@ -385,13 +385,15 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.lookupVehicleByYmms( const response = await actions.lookupVehicleByYmms(context, {
context, payload: {
"2019", year: "2019",
"Acura", make: "Acura",
"ILX", model: "ILX",
"4 DOOR SEDAN" style: "4 DOOR SEDAN",
); },
pageNameToLog: "test",
});
expect(response.data).toEqual({ carId: "C00000001" }); expect(response.data).toEqual({ carId: "C00000001" });
}); });
@ -406,7 +408,12 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.lookupVehicleByVin(context, "12345678901234567"); const response = await actions.lookupVehicleByVin(context, {
payload: {
vin: "12345678901234567",
},
pageNameToLog: "test",
});
expect(response.data).toEqual({ carId: "C0000001" }); expect(response.data).toEqual({ carId: "C0000001" });
}); });
@ -421,7 +428,10 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.lookupVinByPlate(context, "12345678901234567"); const response = await actions.lookupVinByPlate(context, {
payload: { licensePlate: "12345678901234567", licenseState: "OH" },
pageNameToLog: "test",
});
expect(response.data).toEqual({ carId: "C00000001" }); expect(response.data).toEqual({ carId: "C00000001" });
}); });
@ -438,7 +448,10 @@ describe("Actions", () => {
}); });
// Act // Act
const response = await actions.lookupVinByImage(context, image); const response = await actions.lookupVinByImage(context, {
payload: image,
pageNameToLog: "test",
});
// Assert // Assert
expect(response.data).toEqual(["1C6JJTAG3NL134044"]); expect(response.data).toEqual(["1C6JJTAG3NL134044"]);
@ -458,7 +471,9 @@ describe("Actions", () => {
// Act // Act
// Assert // Assert
await expect(actions.lookupVinByImage(context, image)).rejects.toEqual("An error occurred"); await expect(
actions.lookupVinByImage(context, { payload: image, pageNameToLog: "test" })
).rejects.toEqual("An error occurred");
}); });
it("getVehicleMakes action, should return makes list", async () => { it("getVehicleMakes action, should return makes list", async () => {
@ -471,7 +486,10 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.getVehicleMakes(context, "2019"); const response = await actions.getVehicleMakes(context, {
payload: { year: "2019" },
pageNameToLog: "test",
});
expect(response.data).toEqual(["Acura", "Honda"]); expect(response.data).toEqual(["Acura", "Honda"]);
}); });
@ -486,7 +504,10 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.getVehicleModels(context, "2019", "Acura"); const response = await actions.getVehicleModels(context, {
payload: { year: "2019", make: "Acura" },
pageNameToLog: "test",
});
expect(response.data).toEqual(["ILX", "RDX"]); expect(response.data).toEqual(["ILX", "RDX"]);
}); });
@ -501,7 +522,10 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.getVehicleStyles(context, "2019", "Acura", "ILX"); const response = await actions.getVehicleStyles(context, {
payload: { year: "2019", make: "Acura", model: "ILX" },
pageNameToLog: "test",
});
expect(response.data).toEqual({ style: "4 DOOR SEDAN" }); expect(response.data).toEqual({ style: "4 DOOR SEDAN" });
}); });
@ -516,7 +540,10 @@ describe("Actions", () => {
}); });
// Assert // Assert
const response = await actions.getVehicle(context, "C00000000"); const response = await actions.getVehicle(context, {
payload: { year: "2019", make: "Acura", model: "IDX", style: "4-door sedan" },
pageNameToLog: "test",
});
expect(response.data).toEqual({ carId: "C00000000", category: "CAR" }); expect(response.data).toEqual({ carId: "C00000000", category: "CAR" });
}); });
@ -530,7 +557,10 @@ describe("Actions", () => {
return Promise.resolve({ data: ["Windshield", "DriversFrontDoor"] }); return Promise.resolve({ data: ["Windshield", "DriversFrontDoor"] });
}); });
const response = await actions.getDamageOptions(context, "C00000000"); const response = await actions.getDamageOptions(context, {
payload: { carId: "C00000000" },
pageNameToLog: "test",
});
// Assert // Assert
expect(response.data).toEqual(["Windshield", "DriversFrontDoor"]); expect(response.data).toEqual(["Windshield", "DriversFrontDoor"]);
@ -552,7 +582,10 @@ describe("Actions", () => {
}); });
}); });
const response = await actions.validateZip(context, "43212"); const response = await actions.validateZip(context, {
payload: { zip: "43212" },
pageNameToLog: "test",
});
// Assert // Assert
expect(response.data).toEqual({ expect(response.data).toEqual({
@ -730,7 +763,7 @@ describe("Actions", () => {
}); });
// Act // Act
const response = await actions.saveSession(context); const response = await actions.saveSession(context, { pageNameToLog: "test" });
// Assert // Assert
expect(response.data).toEqual({ referralNumber: 123 }); expect(response.data).toEqual({ referralNumber: 123 });
@ -750,7 +783,10 @@ describe("Actions", () => {
// Act // Act
const response = await actions.loadSession(context, { const response = await actions.loadSession(context, {
savedSessionId: "", payload: {
savedSessionId: "",
},
pageNameToLog: "test",
}); });
// Assert // Assert
@ -776,7 +812,10 @@ describe("Actions", () => {
// Act // Act
const response = await actions.loadSession(context, { const response = await actions.loadSession(context, {
savedSessionId: "", payload: {
savedSessionId: "",
},
pageNameToLog: "test",
}); });
// Assert // Assert
@ -801,7 +840,10 @@ describe("Actions", () => {
// Act // Act
const response = await actions.loadSession(context, { const response = await actions.loadSession(context, {
savedSessionId: "", payload: {
savedSessionId: "",
},
pageNameToLog: "test",
}); });
// Assert // Assert
@ -1718,7 +1760,10 @@ describe("Actions", () => {
// Act // Act
await actions.runExperimentsForTrigger(context, { await actions.runExperimentsForTrigger(context, {
triggerEvent: experimentTriggers.SITE_ENTRY, payload: {
triggerEvent: experimentTriggers.SITE_ENTRY,
},
pageNameToLog: "test",
}); });
// Assert // Assert
@ -1752,7 +1797,10 @@ describe("Actions", () => {
// Act // Act
await actions.runExperimentsForTrigger(context, { await actions.runExperimentsForTrigger(context, {
triggerEvent: "NotSiteEntry", payload: {
triggerEvent: "NotSiteEntry",
},
pageNameToLog: "test",
}); });
// Assert // Assert