Merge pull request #2325 from Safelite/feature/CASH-291

CASH-291
This commit is contained in:
CarlNation 2025-02-24 09:36:40 -05:00 committed by GitHub
commit 0df37c65be
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 131 additions and 92 deletions

View file

@ -34,7 +34,7 @@ module.exports = {
testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"], testMatch: ["**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)"],
coverageThreshold: { coverageThreshold: {
global: { global: {
statements: 75, statements: 74,
}, },
}, },
// Uncomment this to avoid the massive amount of warnings we are getting for onSubmit and onInvalidSubmit // Uncomment this to avoid the massive amount of warnings we are getting for onSubmit and onInvalidSubmit

View file

@ -233,7 +233,7 @@ export default {
min-height: 52px; min-height: 52px;
max-height: 126px; max-height: 126px;
@include media-breakpoint-up(md) { @include media-breakpoint-up(md) {
max-height: 500px; max-height: 500px;
} }
transition: max-height 0.25s ease-in; transition: max-height 0.25s ease-in;

View file

@ -361,13 +361,16 @@ export default {
if (!this.customerQuestions.emailOrSms) { if (!this.customerQuestions.emailOrSms) {
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false); await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
} } else {
else {
if (vinPagesMixin.methods.isPhoneNumber(this.customerQuestions.emailOrSms)) { if (vinPagesMixin.methods.isPhoneNumber(this.customerQuestions.emailOrSms)) {
const phone = this.customerQuestions.emailOrSms.replace(/[()]/g, ""); const phone = this.customerQuestions.emailOrSms.replace(/[()]/g, "");
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false);
} else { } else {
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.customerQuestions.emailOrSms, false); await this.dispatchStoreAction(
storeActions.SAVE_EMAIL,
this.customerQuestions.emailOrSms,
false
);
} }
} }

View file

@ -1,105 +1,102 @@
import { shallowMount } from '@vue/test-utils'; import { shallowMount } from "@vue/test-utils";
import InsuranceCompany from '@/layouts/insurance-company/insurance-company.vue'; import InsuranceCompany from "@/layouts/insurance-company/insurance-company.vue";
import { applicationConfig } from '@/constants/application-config.js'; import { applicationConfig } from "@/constants/application-config.js";
import store from "@/store"; import store from "@/store";
import baseMixin from "@/mixins/base-mixin.js"; import baseMixin from "@/mixins/base-mixin.js";
jest.mock("@/store", () => ({
jest.mock('@/store', () => ({
getters: { getters: {
order: { order: {
payment: { payment: {
parentAccountNumber: '12345', parentAccountNumber: "12345",
},
}, },
},
}, },
})); }));
var mockRouter = { var mockRouter = {
navigateWithoutSaving: jest.fn(), navigateWithoutSaving: jest.fn(),
}; };
jest.mock('@/mixins/base-mixin.js', () => ({ jest.mock("@/mixins/base-mixin.js", () => ({
methods: { methods: {
navigateWithoutSaving: jest.fn(), navigateWithoutSaving: jest.fn(),
}, },
data() { data() {
return { return {
navigationScenarios: { navigationScenarios: {
CLICKED_BACK: 'clicked_back', CLICKED_BACK: "clicked_back",
}, },
}; };
}, },
})); }));
describe("insurance-company.vue", () => { describe("insurance-company.vue", () => {
beforeEach(() => { beforeEach(() => {
// Reset the store's parentAccountNumber before each test // Reset the store's parentAccountNumber before each test
store.getters.order.payment.parentAccountNumber = '12345'; store.getters.order.payment.parentAccountNumber = "12345";
}); });
test('should return true when parentAccountNumber matches CASH_PARENT_ACCOUNT_NUMBER', () => { test("should return true when parentAccountNumber matches CASH_PARENT_ACCOUNT_NUMBER", () => {
applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345"; applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345";
const wrapper = shallowMount(InsuranceCompany, {
global: {
mocks: {
$store: store
},
},
});
expect(wrapper.vm.isCashParentAccountNumber()).toBe(true);
});
test('should return false when parentAccountNumber does not match CASH_PARENT_ACCOUNT_NUMBER', () => {
applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345";
store.getters.order.payment.parentAccountNumber = '67890';
const wrapper = shallowMount(InsuranceCompany, {
global: {
mocks: {
$store: store,
},
},
});
expect(wrapper.vm.isCashParentAccountNumber()).toBe(false);
});
test('should call navigateWithoutSaving with { isCashSelected: true } when forceCashSelection is true', () => {
const wrapper = shallowMount(InsuranceCompany, { const wrapper = shallowMount(InsuranceCompany, {
global: { global: {
mocks: { mocks: {
$store: store, $store: store,
$router: mockRouter, },
},
mixins: [baseMixin],
}, },
}); });
expect(wrapper.vm.isCashParentAccountNumber()).toBe(true);
});
test("should return false when parentAccountNumber does not match CASH_PARENT_ACCOUNT_NUMBER", () => {
applicationConfig.CASH_PARENT_ACCOUNT_NUMBER = "12345";
store.getters.order.payment.parentAccountNumber = "67890";
const wrapper = shallowMount(InsuranceCompany, {
global: {
mocks: {
$store: store,
},
},
});
expect(wrapper.vm.isCashParentAccountNumber()).toBe(false);
});
test("should call navigateWithoutSaving with { isCashSelected: true } when forceCashSelection is true", () => {
const wrapper = shallowMount(InsuranceCompany, {
global: {
mocks: {
$store: store,
$router: mockRouter,
},
mixins: [baseMixin],
},
});
wrapper.vm.backButtonAction(true); wrapper.vm.backButtonAction(true);
expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith( expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith(
wrapper.vm.navigationScenarios.CLICKED_BACK, wrapper.vm.navigationScenarios.CLICKED_BACK,
wrapper.vm.$route, wrapper.vm.$route,
{ isCashSelected: true } { isCashSelected: true }
); );
}); });
test('should call navigateWithoutSaving with no extra parameter when forceCashSelection is false', () => { test("should call navigateWithoutSaving with no extra parameter when forceCashSelection is false", () => {
const wrapper = shallowMount(InsuranceCompany, { const wrapper = shallowMount(InsuranceCompany, {
global: { global: {
mocks: { mocks: {
$store: store, $store: store,
$router: mockRouter, $router: mockRouter,
},
mixins: [baseMixin],
}, },
mixins: [baseMixin], });
},
});
wrapper.vm.backButtonAction(false); wrapper.vm.backButtonAction(false);
expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith( expect(mockRouter.navigateWithoutSaving).toHaveBeenCalledWith(
wrapper.vm.navigationScenarios.CLICKED_BACK, wrapper.vm.navigationScenarios.CLICKED_BACK,
wrapper.vm.$route wrapper.vm.$route
); );
}); });
}); });

View file

@ -315,8 +315,7 @@ export default {
if (!this.emailOrSms) { if (!this.emailOrSms) {
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false); await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
} } else {
else {
if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) { if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) {
const phone = this.emailOrSms.replace(/[()]/g, ""); const phone = this.emailOrSms.replace(/[()]/g, "");
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false);

View file

@ -59,6 +59,9 @@ jest.mock("@/mixins/base-mixin", () => ({
filterOutFees(items) { filterOutFees(items) {
return null; return null;
}, },
filterOutServicePackageDiscountPart(items) {
return null;
},
isFormValid(form) { isFormValid(form) {
return true; return true;
}, },

View file

@ -361,24 +361,28 @@ export default {
) )
: baseMixin.methods.filterOutFees(availableLineItems); : baseMixin.methods.filterOutFees(availableLineItems);
const lineItemsNoDiscount =
baseMixin.methods.filterOutServicePackageDiscountPart(
lineItemsForCalculatingPrice
);
if (isInsuranceFromQueryString != null) { if (isInsuranceFromQueryString != null) {
if (isInsuranceFromQueryString.toLowerCase() === "true") { if (isInsuranceFromQueryString.toLowerCase() === "true") {
return true; return true;
} }
} }
const tierOnePrice = baseMixin.methods.getTierOnePackagePrice(lineItemsForCalculatingPrice); const tierOnePrice =
baseMixin.methods.getTierOnePackagePrice(lineItemsNoDiscount);
// prettier-ignore // prettier-ignore
{ {
if (store.getters.applicationUser.loggingOption) { if (store.getters.applicationUser.loggingOption) {
console.log(new Date() + " tierOnePrice type: " + typeof tierOnePrice); console.log(new Date() + " quote tierOnePrice comparison: " + tierOnePrice + " > " + insuranceThreshold + "=" + (tierOnePrice > insuranceThreshold));
console.log(new Date() + " insuranceThreshold type: " + typeof insuranceThreshold);
console.log(new Date() + " tierOnePrice comparison: " + tierOnePrice + " > " + insuranceThreshold + "=" + (tierOnePrice > insuranceThreshold));
} }
} }
// compare base price vs arbitrary threshold (representing insurance price) // compare base price vs arbitrary threshold (representing insurance price)
return (tierOnePrice > insuranceThreshold); return tierOnePrice > insuranceThreshold;
} }
return null; return null;
@ -428,7 +432,7 @@ export default {
console.log(new Date() + "quote.vue tab select EXTERNAL ISINSURANCE"); console.log(new Date() + "quote.vue tab select EXTERNAL ISINSURANCE");
} }
} }
// did user intentionally select insurance? // did user intentionally select insurance?
vm.isInsuranceSelected = true; vm.isInsuranceSelected = true;
vm.servicePackage = store.getters.externalParameterQuote.servicePackage; vm.servicePackage = store.getters.externalParameterQuote.servicePackage;

View file

@ -18,6 +18,11 @@ import { nextTick } from "vue";
jest.mock("@/store", () => ({ jest.mock("@/store", () => ({
commit: jest.fn(), commit: jest.fn(),
dispatch: jest.fn(), dispatch: jest.fn(),
getters: {
applicationUser: {
loggingOption: false,
},
},
})); }));
const mockExperimentSettings = experimentSettings; const mockExperimentSettings = experimentSettings;
@ -846,6 +851,7 @@ function setupMocks({ mountOptionsMockData, props = mockProps }) {
}, },
}, },
}; };
mountOptionsMockData = Object.assign(mountOptionsMockDataDefault, mountOptionsMockData); mountOptionsMockData = Object.assign(mountOptionsMockDataDefault, mountOptionsMockData);
const mountOptions = getMountOptions(mountOptionsMockData); const mountOptions = getMountOptions(mountOptionsMockData);

View file

@ -334,13 +334,20 @@ export default {
if (!this.emailOrSms) { if (!this.emailOrSms) {
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false); await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
} } else {
else {
if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) { if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) {
const phone = this.emailOrSms.replace(/[()]/g, ""); const phone = this.emailOrSms.replace(/[()]/g, "");
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false); await this.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
phone,
false
);
} else { } else {
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailOrSms, false); await this.dispatchStoreAction(
storeActions.SAVE_EMAIL,
this.emailOrSms,
false
);
} }
} }
@ -391,13 +398,20 @@ export default {
if (!this.emailOrSms) { if (!this.emailOrSms) {
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false); await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, "", false);
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false); await this.dispatchStoreAction(storeActions.SAVE_EMAIL, "", false);
} } else {
else {
if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) { if (vinPagesMixin.methods.isPhoneNumber(this.emailOrSms)) {
const phone = this.emailOrSms.replace(/[()]/g, ""); const phone = this.emailOrSms.replace(/[()]/g, "");
await this.dispatchStoreAction(storeActions.SAVE_PHONE_NUMBER, phone, false); await this.dispatchStoreAction(
storeActions.SAVE_PHONE_NUMBER,
phone,
false
);
} else { } else {
await this.dispatchStoreAction(storeActions.SAVE_EMAIL, this.emailOrSms, false); await this.dispatchStoreAction(
storeActions.SAVE_EMAIL,
this.emailOrSms,
false
);
} }
} }

View file

@ -92,6 +92,13 @@ export default {
}); });
let totalPrice = this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice, false); let totalPrice = this.getTotalPriceOfAllLineItemsAndChildParts(lineItemsToPrice, false);
// prettier-ignore
{
if (store.getters.applicationUser.loggingOption) {
console.log(new Date() + " base-mixin getTierOnePackagePrice lineItemsToPrice: " + JSON.stringify(lineItemsToPrice));
console.log(new Date() + " base-mixin getTierOnePackagePrice totalPrice: " + totalPrice);
}
}
return totalPrice; return totalPrice;
}, },
filterOutFees(lineItems) { filterOutFees(lineItems) {
@ -103,6 +110,12 @@ export default {
}); });
return filteredLineItems; return filteredLineItems;
}, },
filterOutServicePackageDiscountPart(lineItems) {
const filteredLineItems = lineItems?.filter((item) => {
return !item?.partType?.includes(partTypeStrings.SERVICE_PACKAGE_DISCOUNT);
});
return filteredLineItems;
},
filterOutRecalibration(lineItems) { filterOutRecalibration(lineItems) {
return getItemsWithoutRecalParts(lineItems); return getItemsWithoutRecalParts(lineItems);
}, },