diff --git a/src/layouts/payment-method/payment-method.vue b/src/layouts/payment-method/payment-method.vue index ee0eee749..3bde800bf 100644 --- a/src/layouts/payment-method/payment-method.vue +++ b/src/layouts/payment-method/payment-method.vue @@ -33,7 +33,6 @@ class="small mt-4" v-model="lineItems" :availableVaps="availableVaps" - pageName="payment-method" modalWidgetName="PromoModalWidget" />
diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.spec.js b/src/layouts/payment-method/promo-modal-question/promo-modal-question.spec.js index 1dcc2ac70..16d170e82 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.spec.js +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.spec.js @@ -1,25 +1,5 @@ import { mount, shallowMount } from "@vue/test-utils"; import promoModalQuestion from "./promo-modal-question"; -import { storeActions } from "@/constants/store-actions"; -import baseMixin from "@/mixins/base-mixin.js"; - -let mockReturnsForStoreActions = {}; - -jest.mock("@/mixins/base-mixin", () => ({ - ...jest.requireActual("@/mixins/base-mixin"), - methods: { - dispatchStoreActionWithLogging: jest.fn( - (action, { promoCode, addableVaps }, pageNameToLog, someBool) => { - return mockReturnsForStoreActions[action]; - } - ), - }, -})); - -afterEach(() => { - // reset store action returns - mockReturnsForStoreActions = {}; -}); jest.mock("@/digital-components/textbox-question/textbox-question", () => ({ getCmsContent: jest.fn((widgetName, cmsFieldName) => { @@ -99,127 +79,4 @@ describe("promo-modal-question.vue", () => { // Assert expect(wrapper.emitted("update:modelValue")).toEqual([[lineItems]]); }); - it("focuses on the input element when focusOnPromoInput is called", async () => { - // Arrange - const lineItems = { - glassParts: [], - supportingItems: [], - vaps: [], - promos: [], - }; - - const wrapper = mount(promoModalQuestion, { - mixins: [mockMixin], - props: { - modelValue: lineItems, - modalWidgetName: modalWidgetName, - }, - attachTo: document.body, - }); - const focusMock = jest.fn(); - const inputMock = { focus: focusMock }; - - // Mock document.getElementById to return the inputMock - jest.spyOn(document, "getElementById").mockReturnValue(inputMock); - - //Act - - wrapper.vm.focusOnPromoInput(); - await wrapper.vm.$nextTick(); - - //Assert - expect(focusMock).toHaveBeenCalled(); - }); - it("returns a validate response on applying promo", async () => { - // Arrange - const newPromo = "testPromo"; - const pageNameToLog = "testPage"; - const validateResponse = { orderPromos: [] }; - const addableVaps = []; - mockReturnsForStoreActions[storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA] = - validateResponse; - const lineItems = { - glassParts: [], - supportingItems: [], - vaps: [], - promos: [], - }; - - const wrapper = mount(promoModalQuestion, { - mixins: [mockMixin], - props: { - modelValue: lineItems, - modalWidgetName: modalWidgetName, - }, - attachTo: document.body, - }); - // Act - - wrapper.vm.getPromoCodeData(); - - const promoValidationResponse = await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.VALIDATE_ORDER_PROMO_AND_SAVE_SERVER_DATA, - { - newPromo, - lineItems, - addableVaps, - }, - pageNameToLog, - false - ); - - // Assert - expect(promoValidationResponse).toEqual(validateResponse); - }); - test("If promocode is valid return taxed lineItems", async () => { - //Arrange - const taxedlineItems = {}; - - mockReturnsForStoreActions[storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA] = - taxedlineItems; - - const lineItems = { - glassParts: [], - supportingItems: [], - vaps: [], - promos: [], - }; - - let promoCode = "1wiper0"; - const pricedLineItemsToTax = []; - - pricedLineItemsToTax.push(promoCode); - const wrapper = mount(promoModalQuestion, { - mixins: [mockMixin], - - props: { - modelValue: lineItems, - modalWidgetName: modalWidgetName, - }, - - attachTo: document.body, - }); - wrapper.vm.addPromoCode(); - - const taxedLineItems = await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA, - { - billToAccountNumber: "87291", - providerNumber: 2, - appointmentType: "IN_SHOP", - serviceLocationCity: "city", - serviceLocationState: "state", - serviceLocationZipCode: "12345", - pricedLineItems: pricedLineItemsToTax, - }, - - "payment-method", - - false - ); - - // Assert - - expect(taxedLineItems).toEqual(taxedlineItems); - }); }); diff --git a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue index 589148ae3..b4b02b3ed 100644 --- a/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue +++ b/src/layouts/payment-method/promo-modal-question/promo-modal-question.vue @@ -100,12 +100,6 @@ export default { modelValue: Object, modalWidgetName: String, availableVaps: Object, - pageName: String, - taxPromos: { - type: Boolean, - required: false, - default: true, - }, }, computed: { promoLinkText() { @@ -259,51 +253,44 @@ export default { this.promoCode, this.lineItems, this.availableVaps, - this.pageName + "payment-method" ); if (promoCodeData.isValid) { - if (this.taxPromos) { - const pricedLineItemsToTax = []; - pricedLineItemsToTax.push(...promoCodeData.promoCode); - const taxedLineItems = - await baseMixin.methods.dispatchStoreActionWithLogging( - storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA, - { - billToAccountNumber: "87291", - providerNumber: - store.getters.order.serviceLocation.provider.providerNumber, - appointmentType: - store.getters.order.serviceLocation.appointmentType, - serviceLocationCity: store.getters.order.serviceLocation.city, - serviceLocationState: store.getters.order.serviceLocation.state, - serviceLocationZipCode: - store.getters.order.serviceLocation.zipCode, - pricedLineItems: pricedLineItemsToTax, - }, - "payment-method", - false - ); + const pricedLineItemsToTax = []; + pricedLineItemsToTax.push(...promoCodeData.promoCode); + const taxedLineItems = await baseMixin.methods.dispatchStoreActionWithLogging( + storeActions.TAX_ORDER_ITEMS_AND_SAVE_SERVER_DATA, + { + billToAccountNumber: "87291", + providerNumber: + store.getters.order.serviceLocation.provider.providerNumber, + appointmentType: store.getters.order.serviceLocation.appointmentType, + serviceLocationCity: store.getters.order.serviceLocation.city, + serviceLocationState: store.getters.order.serviceLocation.state, + serviceLocationZipCode: store.getters.order.serviceLocation.zipCode, + pricedLineItems: pricedLineItemsToTax, + }, + "payment-method", + false + ); - // Match all line items to the line items as they are in the store - // and rebuild the original structure. - this.lineItems = mapTaxedLineItemsToStoreFormat( - taxedLineItems, - this.lineItems - ); - const taxedVaps = mapTaxedLineItemsToStoreFormat( - taxedLineItems, - this.availableVaps - ); + // Match all line items to the line items as they are in the store + // and rebuild the original structure. + this.lineItems = mapTaxedLineItemsToStoreFormat(taxedLineItems, this.lineItems); + const taxedVaps = mapTaxedLineItemsToStoreFormat( + taxedLineItems, + this.availableVaps + ); + + const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( + promoCodeData.promoCode, + taxedVaps, + this.lineItems + ); - const getVaps = getVapsThatNeedToBeAddedToSatisfyPromos( - promoCodeData.promoCode, - taxedVaps, - this.lineItems - ); - this.lineItems?.vaps.push(...getVaps); - } this.lineItems?.promos.push(...promoCodeData.promoCode); + this.lineItems.vaps?.push(...getVaps); this.closeModal(); } else { this.getErrorMessage(promoCodeData.errorCode, promoCodeData.additionalInfo); diff --git a/src/layouts/quote/quote.spec.js b/src/layouts/quote/quote.spec.js index 4a0814acd..fc9b4c4eb 100644 --- a/src/layouts/quote/quote.spec.js +++ b/src/layouts/quote/quote.spec.js @@ -4,8 +4,6 @@ import { applicationConfig } from "@/constants/application-config"; import { storeActions } from "@/constants/store-actions"; import quote from "@/layouts/quote/quote.vue"; import store from "@/store"; -import promotionsHelper from "@/helpers/promotions-helper"; -import baseMixin from "@/mixins/base-mixin.js"; import * as navigateToHeritage from "@/helpers/heritage-integration/navigation-helper"; import { nextTick } from "vue"; @@ -135,6 +133,8 @@ describe("quote.vue", () => { }; }); + wrapper.vm.pricedGlassParts = []; + //Act await wrapper.vm.forwardButtonAction(); @@ -250,8 +250,9 @@ describe("quote.vue", () => { ); //Assert + expect(wrapper.vm.pricedGlassParts !== null).toBe(true); + expect(wrapper.vm.supportingItems !== null).toBe(true); expect(wrapper.vm.availableLineItems !== null).toBe(true); - expect(wrapper.vm.availableVaps !== null).toBe(true); // This should have its own test //expect(vm.isInsuranceSelected !== null).toBe(true); }); @@ -509,31 +510,6 @@ describe("quote.vue", () => { //Assert expect(wrapper.vm.isInsuranceSelected).toBe(true); }); - test("On forward button action save promos", async () => { - //Arrange - store.getters.payment = { - insuranceCoverage: {}, - isInsurance: false, - }; - store.getters.order = { - lineItems: [], - payment: { - parentAccountNumber: 167132, - }, - }; - const { wrapper } = setupMocks({ - customMountOptions: { - router: { - navigateWithSaving: jest.fn(), - }, - route: { quote }, - }, - }); - - wrapper.vm.forwardButtonAction(); - - expect(wrapper.vm.lineItems.promos !== null).toBe(true); - }); }); function setupMocks({ customMountOptions }) { diff --git a/src/layouts/quote/quote.vue b/src/layouts/quote/quote.vue index d1640700f..f26d24cf7 100644 --- a/src/layouts/quote/quote.vue +++ b/src/layouts/quote/quote.vue @@ -39,15 +39,6 @@ cmsWidgetName="AfterpayModalWidget" :lineItems="availableLineItems" /> - - { vm.setCmsContent(resultMap.cmsContent); + vm.pricedGlassParts = nullSafeGlassParts; + vm.supportingItems = resultMap.supportingItems; vm.availableLineItems = pricingResults; - vm.availableVaps = availableVaps; - vm.lineItems = lineItems; vm.isInsuranceSelected = vm.getDefaultIsInsuranceSelectedValue(vm.availableLineItems); if (revalidatePromoResponse) { @@ -224,17 +208,15 @@ export default { data() { return { isInsuranceSelected: null, + selectedVaps: null, availableLineItems: null, - availableVaps: [], - lineItems: [], + supportingItems: null, + pricedGlassParts: null, }; }, computed: { allActivePromos() { - return this.lineItems.promos ?? []; - }, - lineItemsCloneForWatcher() { - return Object.assign({}, this.lineItems); + return this.$store.getters.order.lineItems.promos ?? []; }, }, methods: { @@ -276,7 +258,7 @@ export default { } }, vapsItemsSelectedAction(vapsItemsSelected) { - this.lineItems.vaps = vapsItemsSelected; + this.selectedVaps = vapsItemsSelected; }, backButtonAction() { vehicleQuestionsMixin.methods.navigateBack(this); @@ -300,26 +282,18 @@ export default { this.$store.getters.order.payment.parentAccountNumber != applicationConfig.CASH_PARENT_ACCOUNT_NUMBER ) { - this.lineItems.supportingItems = this.filterOutFees(this.lineItems.supportingItems); + this.supportingItems = this.filterOutFees(this.supportingItems); } - if (this.lineItems.glassParts?.length > 0) { + if (this.pricedGlassParts.length > 0) { this.dispatchStoreAction( this.storeActions.SAVE_GLASS_PARTS_SUPPRESSING_STATE_RESETTING, - this.lineItems.glassParts, + this.pricedGlassParts, false ); } - this.dispatchStoreAction(this.storeActions.SAVE_VAPS, this.lineItems.vaps, false); - this.dispatchStoreAction( - storeActions.SAVE_ACTIVE_AND_OR_INACTIVE_PROMOS, - { - activePromos: this.lineItems.promos, - inactivePromos: this.$store.getters.order.payment.inactivePromos, - }, - false - ); + this.dispatchStoreAction(this.storeActions.SAVE_VAPS, this.selectedVaps, false); const payment = this.$store.getters.payment; if (payment.isInsurance) { @@ -335,32 +309,6 @@ export default { } }, }, - watch: { - lineItemsCloneForWatcher: { - handler(newValue, oldValue) { - if ( - !oldValue || - oldValue.length == 0 || - !oldValue.vaps || - !newValue || - newValue.length == 0 - ) { - return; - } - if (oldValue.promos.length < newValue.promos.length) { - const oldPromoCodes = oldValue.promos.map( - (promoObject) => promoObject.promoCode - ); - const newlyActivatedPromoCodes = newValue.promos.filter( - (newPromo) => !oldPromoCodes.includes(newPromo.promoCode) - ); - const alert = createPromoSuccessAlert(newlyActivatedPromoCodes[0].promoCode); - this.$refs.funnelHeader.pushGlobalAlert(alert, alert.shouldAutoFade); - } - }, - deep: true, - }, - }, components: { funnelHeader, navbar, @@ -373,7 +321,6 @@ export default { contentGroupModal, loadingModal, afterpayModalBanner, - promoModalQuestion, }, }; diff --git a/src/layouts/quote/service-package-question/service-package-question.spec.js b/src/layouts/quote/service-package-question/service-package-question.spec.js index 8163c6324..c156ef34c 100644 --- a/src/layouts/quote/service-package-question/service-package-question.spec.js +++ b/src/layouts/quote/service-package-question/service-package-question.spec.js @@ -256,57 +256,6 @@ describe("service-package-question.vue", () => { // Assert expect(wrapper.vm.selectedPackageName).toBe("TierThree"); }); - it("should select default package if promos are added", async () => { - //Arrange - mockProps.activePromos != null; - const wrapper = setupMocks({ - mountOptionsMockData: { - store: { - getters: { - order: { - damage: { - isRepair: false, - glassToReplace: [{ glassLocation: "Windshield" }], - }, - }, - lineItems: { - vaps: [], - }, - hasAnyNonWindshieldGlassParts: false, - payment: { - isInsurance: false, - }, - }, - }, - }, - }); - - //Act - wrapper.setProps({ - activePromos: [ - { - discountedLineItemIds: [ - { - 0: "428ec73c-38e4-4e14-8703-a987b0391898", - 1: "79db94d7-163c-4408-a1ec-f83e58c11992", - }, - ], - partType: "PROMO_DISCOUNT", - promoCode: "1WIPER0", - partNumber: "WIPER DISCOUNT", - laborAmount: 0, - sellingPrice: -10, - kitPrice: 0, - salesTax: null, - }, - ], - }); - const selectDefaultPackageMock = jest.spyOn(wrapper.vm, "selectDefaultPackage"); - await nextTick(); - - //Assert - expect(selectDefaultPackageMock).toHaveBeenCalled(); - }); }); describe("service-package-question.vue, matching business rules for package display", () => { // mock scenarios in figma: diff --git a/src/layouts/quote/service-package-question/service-package-question.vue b/src/layouts/quote/service-package-question/service-package-question.vue index 6b84f3557..28727f155 100644 --- a/src/layouts/quote/service-package-question/service-package-question.vue +++ b/src/layouts/quote/service-package-question/service-package-question.vue @@ -63,9 +63,6 @@ export default { this.selectDefaultPackage(); } }, - activePromos() { - this.selectDefaultPackage(); - }, selectedPackageName(newValue) { const VapsProductsInSelectedPackage = this.getVapsLineItemsForSelectedPackage(newValue); this.$emit("vapsItemsSelected", VapsProductsInSelectedPackage);