Fixing tests

This commit is contained in:
Michaela Brydon 2024-04-09 15:17:43 -04:00
parent 93bc1520a2
commit 8d99f4fe9b
5 changed files with 312 additions and 246 deletions

View file

@ -0,0 +1,11 @@
const cartItemType = Object.freeze({
// FRONT_WIPERS: 'FRONT WIPERS',
// REAR_WIPERS: 'REAR WIPERS',
// RAIN_DEFENSE: 'RAIN DEFENSE',
RECYCLE_FEE: 'RECYCLE FEE',
// REPLACE_FEE: 'REPLACE FEE',
MOBILE_FEE: 'MOBILE FEE',
VAP: 'VAP'
});
export default cartItemType;

View file

@ -2,6 +2,11 @@
exports[`cart-dropdown component initial data rendered as expected 1`] = ` exports[`cart-dropdown component initial data rendered as expected 1`] = `
Object { Object {
"cartItemType": Object {
"MOBILE_FEE": "MOBILE FEE",
"RECYCLE_FEE": "RECYCLE FEE",
"VAP": "VAP",
},
"isExpanded": false, "isExpanded": false,
"widget": Object { "widget": Object {
"amountDue": "AmountDueTextWidget", "amountDue": "AmountDueTextWidget",

View file

@ -46,6 +46,14 @@ function getMountedComponent(mainInitialState = {}, initialData = {}, propsData
return { wrapper }; return { wrapper };
} }
beforeEach(() => {
const store = useMainStore();
const defaultState = getDefaultState();
Object.keys(defaultState).forEach((key) => {
store[key] = defaultState[key];
});
});
describe('cart-dropdown component', () => { describe('cart-dropdown component', () => {
test('initial data rendered as expected', () => { test('initial data rendered as expected', () => {
// Arrange // Arrange
@ -433,13 +441,57 @@ describe('cart-dropdown component', () => {
}); });
}); });
describe('subTotal', () => { describe('subTotal', () => {
test('when not no comp and not itac, includes deductible price', () => { const supportingItemPartNumber = 'supporter';
const glassPartNumber = 'glass part';
const otherPartNumber = 'other';
const vapPartNumber = 'vap';
const mobileFeePartNumber = 'mobile';
const supportingItems = [{ partNumber: supportingItemPartNumber }];
const glassParts = [{ partNumber: glassPartNumber }];
const otherParts = [{ partNumber: otherPartNumber }];
const vaps = [{ partNumber: vapPartNumber }];
const mobileFee = { partNumber: mobileFeePartNumber };
const includesPartNumber = (lineItems, partNumber) => lineItems.some((item) => item?.partNumber === partNumber);
const deductiblePrice = 100;
const supportingAndGlassAndOtherPrice = 30;
const feesAndVapsPrice = 50;
const allLineItemsPrice = 70;
getPriceOfLineItems.mockImplementation((lineItems) => {
const allPartNumbers = [
supportingItemPartNumber,
glassPartNumber,
otherPartNumber,
mobileFeePartNumber,
vapPartNumber
];
if (allPartNumbers.every((partNumber) => includesPartNumber(lineItems, partNumber))) {
return allLineItemsPrice;
}
const supportingAndGlassAndOtherPartNumbers = [
supportingItemPartNumber,
glassPartNumber,
otherPartNumber
];
if (supportingAndGlassAndOtherPartNumbers.every((partNumber) => includesPartNumber(lineItems, partNumber))) {
return supportingAndGlassAndOtherPrice;
}
if (includesPartNumber(lineItems, mobileFeePartNumber) && includesPartNumber(lineItems, vapPartNumber)) {
return feesAndVapsPrice;
}
return 1;
});
const lineItems = {
supportingItems,
glassParts,
otherParts,
vaps,
mobileFee
};
test('when not no comp and not itac, includes deductible price plus fee and vap price', () => {
// Arrange // Arrange
const deductiblePrice = 872;
const baseServicePrice = 43;
getPriceOfLineItems.mockImplementation(() => baseServicePrice);
const storeData = { const storeData = {
order: { order: {
lineItems,
policy: { policy: {
noCoverage: false, noCoverage: false,
isITAC: false isITAC: false
@ -448,20 +500,19 @@ describe('cart-dropdown component', () => {
} }
}; };
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
const expected = deductiblePrice + feesAndVapsPrice;
// Act // Act
const result = wrapper.vm.subTotal; const result = wrapper.vm.subTotal;
// Assert // Assert
expect(result).toBe(deductiblePrice); expect(result).toBe(expected);
}); });
test('when no comp, includes base service price', () => { test('when no comp, returns all line items price', () => {
// Arrange // Arrange
const deductiblePrice = 872;
const baseServicePrice = 43;
getPriceOfLineItems.mockImplementation(() => baseServicePrice);
const storeData = { const storeData = {
order: { order: {
lineItems,
policy: { policy: {
noCoverage: true, noCoverage: true,
isITAC: false isITAC: false
@ -470,20 +521,19 @@ describe('cart-dropdown component', () => {
} }
}; };
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
const expected = allLineItemsPrice;
// Act // Act
const result = wrapper.vm.subTotal; const result = wrapper.vm.subTotal;
// Assert // Assert
expect(result).toBe(baseServicePrice); expect(result).toBe(expected);
}); });
test('when ITAC, includes base service price', () => { test('when ITAC, returns all line items price', () => {
// Arrange // Arrange
const deductiblePrice = 872;
const baseServicePrice = 43;
getPriceOfLineItems.mockImplementation(() => baseServicePrice);
const storeData = { const storeData = {
order: { order: {
lineItems,
policy: { policy: {
noCoverage: false, noCoverage: false,
isITAC: true isITAC: true
@ -492,121 +542,28 @@ describe('cart-dropdown component', () => {
} }
}; };
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
const expected = allLineItemsPrice;
// Act // Act
const result = wrapper.vm.subTotal; const result = wrapper.vm.subTotal;
// Assert // Assert
expect(result).toBe(baseServicePrice); expect(result).toBe(expected);
});
test('when nonServicePackageCartItems non empty, sums appropriately', () => {
// Arrange
const deductiblePrice = 0;
const subTotal = 34;
getPriceOfLineItems.mockImplementation(() => subTotal);
const storeData = {
order: {
policy: {
noCoverage: false,
isITAC: false
},
currentDeductible: deductiblePrice,
lineItems: {
vaps: [
{
partType: partTypeStrings.FRONT_WIPER
},
{
partType: partTypeStrings.REAR_WIPER
}
]
}
}
};
const { wrapper } = getMountedComponent(storeData);
const expectedPrice = 68;
// Act
const result = wrapper.vm.subTotal;
// Assert
expect(result).toBe(expectedPrice);
});
test('when deductible included, sums all prices appropriately', () => {
// Arrange
const deductiblePrice = 54;
const subTotal = 34;
getPriceOfLineItems.mockImplementation(() => subTotal);
const storeData = {
order: {
policy: {
noCoverage: false,
isITAC: false
},
currentDeductible: deductiblePrice,
lineItems: {
vaps: [
{
partType: partTypeStrings.FRONT_WIPER
},
{
partType: partTypeStrings.REAR_WIPER
}
]
}
}
};
const { wrapper } = getMountedComponent(storeData);
const expectedPrice = 122;
// Act
const result = wrapper.vm.subTotal;
// Assert
expect(result).toBe(expectedPrice);
});
test('when base service price included, sums all prices appropriately', () => {
// Arrange
const deductiblePrice = 54;
const subTotal = 34;
getPriceOfLineItems.mockImplementation(() => subTotal);
const storeData = {
order: {
policy: {
noCoverage: true,
isITAC: false
},
currentDeductible: deductiblePrice,
lineItems: {
vaps: [
{
partType: partTypeStrings.FRONT_WIPER
},
{
partType: partTypeStrings.REAR_WIPER
}
]
}
}
};
const { wrapper } = getMountedComponent(storeData);
const expectedPrice = 102;
// Act
const result = wrapper.vm.subTotal;
// Assert
expect(result).toBe(expectedPrice);
}); });
}); });
describe('salesTax', () => { describe('salesTax', () => {
test('salesTax is treated as 0 when line items are null', () => { test('salesTax is treated as 0 when line items are null', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = {
storeData.order.lineItems.glassParts = null; order: {
storeData.order.lineItems.otherParts = null; lineItems: {
storeData.order.lineItems.supportingItems = null; glassParts: null,
storeData.order.lineItems.vaps = null; otherParts: null,
supportingItems: null,
vaps: null
}
}
};
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
@ -619,20 +576,24 @@ describe('cart-dropdown component', () => {
test("salesTax is treated as 0 when null or undefined is set as the line item's sales tax.", () => { test("salesTax is treated as 0 when null or undefined is set as the line item's sales tax.", () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = {
storeData.order.lineItems.glassParts = [ order: {
{ partType: 'mock', salesTax: null }, lineItems: {
{ partType: 'mock', salesTax: undefined } glassParts: [
]; { partType: 'mock', salesTax: null },
storeData.order.lineItems.supportingItems = [ { partType: 'mock', salesTax: undefined }
{ partType: 'mock', salesTax: null }, ],
{ partType: 'mock', salesTax: undefined } supportingItems: [
]; { partType: 'mock', salesTax: null },
storeData.order.lineItems.vaps = [ { partType: 'mock', salesTax: undefined }
{ partType: 'mock', salesTax: null }, ],
{ partType: 'mock', salesTax: undefined } vaps: [
]; { partType: 'mock', salesTax: null },
{ partType: 'mock', salesTax: undefined }
]
}
}
};
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
// Act // Act
@ -641,19 +602,29 @@ describe('cart-dropdown component', () => {
// Assert // Assert
expect(result).toBe(0); expect(result).toBe(0);
}); });
test('Returns 0 as sales tax when coverage is unverified and order does not contain vaps.', () => { test('Returns 0 as sales tax when coverage is unverified and order does not contain vaps.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = {
storeData.order.lineItems.glassParts = [ order: {
{ partType: 'mock', salesTax: 10 } lineItems: {
]; glassParts: [{ partType: 'mock', salesTax: 10 }],
storeData.order.lineItems.supportingItems = [ supportingItems: [
{ partNumber: partNumberStrings.RECYCLE_FEE, partType: 'mock', salesTax: 10, sellingPrice: 39.99 } {
]; partNumber: partNumberStrings.RECYCLE_FEE,
storeData.order.lineItems.vaps = []; partType: 'mock',
storeData.order.payment.insuranceCoverage.isVerified = false; salesTax: 10,
sellingPrice: 39.99
}
],
vaps: []
},
payment: {
insuranceCoverage: {
isVerified: false
}
}
}
};
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
// Act // Act
@ -665,7 +636,7 @@ describe('cart-dropdown component', () => {
test('Returns sum of vaps sales tax when coverage is unverified and order has vaps.', () => { test('Returns sum of vaps sales tax when coverage is unverified and order has vaps.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = useMainStore().$state;
storeData.order.lineItems.glassParts = [ storeData.order.lineItems.glassParts = [
{ partType: 'mock', salesTax: 10 } { partType: 'mock', salesTax: 10 }
]; ];
@ -686,7 +657,7 @@ describe('cart-dropdown component', () => {
test('Returns Recycle Fee tax when coverage is Verified-Deductible, replace service, and no vaps.', () => { test('Returns Recycle Fee tax when coverage is Verified-Deductible, replace service, and no vaps.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = useMainStore().$state;
storeData.order.currentDeductible = 250; storeData.order.currentDeductible = 250;
storeData.order.lineItems.glassParts = [ storeData.order.lineItems.glassParts = [
{ partType: 'mock', salesTax: 10, sellingPrice: 150 } { partType: 'mock', salesTax: 10, sellingPrice: 150 }
@ -708,7 +679,7 @@ describe('cart-dropdown component', () => {
test('Returns sum of vaps + recycle fee sales tax when Verified-Deductible, replace service, and has vaps.', () => { test('Returns sum of vaps + recycle fee sales tax when Verified-Deductible, replace service, and has vaps.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = useMainStore().$state;
storeData.order.currentDeductible = 250; storeData.order.currentDeductible = 250;
storeData.order.lineItems.glassParts = [ storeData.order.lineItems.glassParts = [
{ partType: 'mock', salesTax: 10, sellingPrice: 100 } { partType: 'mock', salesTax: 10, sellingPrice: 100 }
@ -737,7 +708,7 @@ describe('cart-dropdown component', () => {
test('Returns sum of sales tax when Verified-ITAC.', () => { test('Returns sum of sales tax when Verified-ITAC.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = useMainStore().$state;
storeData.order.currentDeductible = 0; storeData.order.currentDeductible = 0;
storeData.order.lineItems.glassParts = [ storeData.order.lineItems.glassParts = [
{ partType: 'mock', salesTax: 10, sellingPrice: 100 } { partType: 'mock', salesTax: 10, sellingPrice: 100 }
@ -765,7 +736,7 @@ describe('cart-dropdown component', () => {
test('Returns sum of sales tax when Verified-NoComp.', () => { test('Returns sum of sales tax when Verified-NoComp.', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = useMainStore().$state;
storeData.order.currentDeductible = 0; storeData.order.currentDeductible = 0;
storeData.order.lineItems.glassParts = [ storeData.order.lineItems.glassParts = [
{ partType: 'mock', salesTax: 10, sellingPrice: 100 } { partType: 'mock', salesTax: 10, sellingPrice: 100 }
@ -792,18 +763,10 @@ describe('cart-dropdown component', () => {
}); });
}); });
describe('availableLineItems', () => { describe('availableLineItems', () => {
test('returns expected when glassParts null', async () => { test('returns expected when all null', () => {
// Arrange // Arrange
const storeData = { const propsData = { availableVaps: null };
order: { const { wrapper } = getMountedComponent({}, {}, propsData);
lineItems: {
glassParts: null,
supportingItems: []
}
}
};
const propsData = { availableVaps: [] };
const { wrapper } = getMountedComponent(storeData, {}, propsData);
// Act // Act
const result = wrapper.vm.availableLineItems; const result = wrapper.vm.availableLineItems;
@ -811,58 +774,106 @@ describe('cart-dropdown component', () => {
// Assert // Assert
expect(result).toStrictEqual([]); expect(result).toStrictEqual([]);
}); });
test('returns expected when supportingItems null', async () => { test('returns expected when glassParts not null', async () => {
// Arrange // Arrange
const glassParts = [{ partNumber: 'glass' }];
const storeData = { const storeData = {
order: { order: {
lineItems: { lineItems: { glassParts }
glassParts: [],
supportingItems: null
}
} }
}; };
const propsData = { availableVaps: [] }; const propsData = { availableVaps: null };
const { wrapper } = getMountedComponent(storeData, {}, propsData); const { wrapper } = getMountedComponent(storeData, {}, propsData);
const expected = glassParts;
// Act // Act
const result = wrapper.vm.availableLineItems; const result = wrapper.vm.availableLineItems;
// Assert // Assert
expect(result).toStrictEqual([]); expect(result).toStrictEqual(expected);
});
test('returns expected when supportingItems not null', async () => {
// Arrange
const supportingItems = [{ partNumber: 'support' }];
const storeData = {
order: {
lineItems: { supportingItems }
}
};
const propsData = { availableVaps: null };
const { wrapper } = getMountedComponent(storeData, {}, propsData);
const expected = supportingItems;
// Act
const result = wrapper.vm.availableLineItems;
// Assert
expect(result).toStrictEqual(expected);
});
test('returns expected when otherParts not null', () => {
// Arrange
const otherParts = [{ partNumber: 'other' }];
const storeData = {
order: {
lineItems: { otherParts }
}
};
const propsData = { availableVaps: null };
const { wrapper } = getMountedComponent(storeData, {}, propsData);
const expected = otherParts;
// Act
const result = wrapper.vm.availableLineItems;
// Assert
expect(result).toStrictEqual(expected);
});
test('returns expected when mobileFee not null', () => {
// Arrange
const mobileFee = { partNumber: 'mobile' };
const storeData = {
order: {
lineItems: { mobileFee }
}
};
const propsData = { availableVaps: null };
const { wrapper } = getMountedComponent(storeData, {}, propsData);
const expected = [mobileFee];
// Act
const result = wrapper.vm.availableLineItems;
// Assert
expect(result).toStrictEqual(expected);
}); });
test('returns expected when availableVaps null', async () => { test('returns expected when availableVaps null', async () => {
// Arrange // Arrange
const storeData = { const availableVaps = [{ partNumber: 'vaps1' }];
order: { const propsData = { availableVaps };
lineItems: { const { wrapper } = getMountedComponent({}, {}, propsData);
glassParts: [], const expected = availableVaps;
supportingItems: []
}
}
};
const propsData = {
availableVaps: undefined
};
const { wrapper } = getMountedComponent(storeData, {}, propsData);
// Act // Act
const result = wrapper.vm.availableLineItems; const result = wrapper.vm.availableLineItems;
// Assert // Assert
expect(result).toStrictEqual([]); expect(result).toStrictEqual(expected);
}); });
test('returns expected when glassParts, supportingItems, and availableVaps have content', async () => { test('returns expected when glassParts, supportingItems, otherParts, mobileFee, and availableVaps have content', async () => {
// Arrange // Arrange
const part1 = { partType: 'apple' }; const part1 = { partType: 'apple' };
const part2 = { partType: 'banana' }; const part2 = { partType: 'banana' };
const part3 = { partType: 'orange' }; const part3 = { partType: 'orange' };
const part4 = { partType: 'grape' }; const part4 = { partType: 'grape' };
const part5 = { partType: 'raspberry' }; const part5 = { partType: 'raspberry' };
const mobileFee = { partType: 'mobile' };
const storeData = { const storeData = {
order: { order: {
lineItems: { lineItems: {
glassParts: [part1], glassParts: [part1],
supportingItems: [part2, part3] supportingItems: [part2, part3],
otherParts: [],
mobileFee
} }
} }
}; };
@ -870,13 +881,24 @@ describe('cart-dropdown component', () => {
availableVaps: [part4, part5] availableVaps: [part4, part5]
}; };
const { wrapper } = getMountedComponent(storeData, {}, propsData); const { wrapper } = getMountedComponent(storeData, {}, propsData);
const expected = [part1, part2, part3, part4, part5]; const sortByPartType = (a, b) => {
const typeA = a.partType.toUpperCase();
const typeB = b.partType.toUpperCase();
if (typeA < typeB) {
return -1;
}
if (typeA > typeB) {
return 1;
}
return 0;
};
const expected = [part1, part2, part3, part4, part5, mobileFee];
// Act // Act
const result = wrapper.vm.availableLineItems; const result = wrapper.vm.availableLineItems;
// Assert // Assert
expect(result).toStrictEqual(expected); expect(result.sort(sortByPartType)).toStrictEqual(expected.sort(sortByPartType));
}); });
}); });
describe('servicePackageCartItems', () => { describe('servicePackageCartItems', () => {
@ -1616,10 +1638,10 @@ describe('cart-dropdown component', () => {
const rearPrice = 101; const rearPrice = 101;
const frontPrice = 9; const frontPrice = 9;
getPriceOfLineItems.mockImplementation((lineItems) => { getPriceOfLineItems.mockImplementation((lineItems) => {
if (lineItems.some((item) => item.partType === partTypeStrings.FRONT_WIPER)) { if (lineItems.some((item) => item?.partType === partTypeStrings.FRONT_WIPER)) {
return frontPrice; return frontPrice;
} }
if (lineItems.some((item) => item.partType === partTypeStrings.REAR_WIPER)) { if (lineItems.some((item) => item?.partType === partTypeStrings.REAR_WIPER)) {
return rearPrice; return rearPrice;
} }
return 1; return 1;
@ -1648,7 +1670,7 @@ describe('cart-dropdown component', () => {
// Arrange // Arrange
const frontPrice = 9; const frontPrice = 9;
getPriceOfLineItems.mockImplementation((lineItems) => { getPriceOfLineItems.mockImplementation((lineItems) => {
if (lineItems.some((item) => item.partType === partTypeStrings.FRONT_WIPER)) { if (lineItems.some((item) => item?.partType === partTypeStrings.FRONT_WIPER)) {
return frontPrice; return frontPrice;
} }
return 1; return 1;
@ -1677,10 +1699,15 @@ describe('cart-dropdown component', () => {
describe('getDisplayed', () => { describe('getDisplayed', () => {
test('returns "Verifying coverage" when not no comp, not itac, and deductible null', () => { test('returns "Verifying coverage" when not no comp, not itac, and deductible null', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = {
storeData.order.policy.noCoverage = false; order: {
storeData.order.policy.isITAC = false; policy: {
storeData.order.currentDeductible = null; noCoverage: false,
isITAC: false
},
currentDeductible: null
}
};
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
const amount = 123; const amount = 123;
@ -1693,10 +1720,15 @@ describe('cart-dropdown component', () => {
}); });
test('returns "Verifying coverage" when not no comp, not itac, and coverage status PENDING', () => { test('returns "Verifying coverage" when not no comp, not itac, and coverage status PENDING', () => {
// Arrange // Arrange
const storeData = getDefaultState(); const storeData = {
storeData.order.policy.noCoverage = false; order: {
storeData.order.policy.isITAC = false; policy: {
storeData.order.currentDeductible = 321; noCoverage: false,
isITAC: false
},
currentDeductible: 321
}
};
const { wrapper } = getMountedComponent(storeData); const { wrapper } = getMountedComponent(storeData);
const amount = 123; const amount = 123;

View file

@ -81,7 +81,7 @@
class="px-5 py-1 non-packaged-cart-item"> class="px-5 py-1 non-packaged-cart-item">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<span <span
v-if="isRecycle(item.partType)" v-if="item.cartItemType === cartItemType.RECYCLE_FEE"
id="recycle-fee-label"> id="recycle-fee-label">
<textLink <textLink
linkType="text" linkType="text"
@ -90,10 +90,11 @@
@clickEvent="openModal(recyclingModalCmsWidgetName)" /> @clickEvent="openModal(recyclingModalCmsWidgetName)" />
</span> </span>
<span v-else>{{ item?.name ?? '' }}</span> <span v-else>{{ item?.name ?? '' }}</span>
<span>{{ getDisplayed(item?.subTotal ?? 0, false) }}</span> <span>{{ formatAmountInDollars(item?.subTotal ?? 0) }}</span>
</div> </div>
<textLink <textLink
v-if="isVap(item.partType) && (!readOnly || !showAsPaid)" v-if="item.cartItemType === cartItemType.VAP
&& (!readOnly || !showAsPaid)"
linkType="text" linkType="text"
text="Remove" text="Remove"
href="javascript:void(0)" href="javascript:void(0)"
@ -151,6 +152,7 @@ import { getHighestFullySatisfiedTier, getPackageContents } from '@/helpers/serv
// Constants // Constants
import partTypeStrings from '@/constants/part-type-strings.js'; import partTypeStrings from '@/constants/part-type-strings.js';
import cartItemType from '@/constants/cart-item-type.js';
import partNumberStrings from '@/constants/part-number-strings.js'; import partNumberStrings from '@/constants/part-number-strings.js';
import widgetFields from '@/constants/cms-widget-fields.js'; import widgetFields from '@/constants/cms-widget-fields.js';
@ -182,7 +184,8 @@ export default {
mobileFee: 'MobileServiceWidget', mobileFee: 'MobileServiceWidget',
servicePackage: 'ServicePackageTitle', servicePackage: 'ServicePackageTitle',
vapsItemDescriptions: 'VapsItemDescriptions' vapsItemDescriptions: 'VapsItemDescriptions'
} },
cartItemType
}; };
}, },
computed: { computed: {
@ -194,11 +197,13 @@ export default {
return useMainStore().order.currentDeductible; return useMainStore().order.currentDeductible;
}, },
baseServiceLineItems() { baseServiceLineItems() {
return [ const { supportingItems, glassParts, otherParts } = useMainStore().lineItems;
...(useMainStore().lineItems.supportingItems ?? []), const parts = [
...(useMainStore().lineItems.glassParts ?? []), ...(supportingItems ?? []),
...(useMainStore().lineItems.otherParts ?? []) ...(glassParts ?? []),
...(otherParts ?? [])
]; ];
return parts.filter((part) => part !== this.recycleFeeLineItem);
}, },
baseServicePrice() { baseServicePrice() {
return getPriceOfLineItems(this.baseServiceLineItems) ?? 0; return getPriceOfLineItems(this.baseServiceLineItems) ?? 0;
@ -208,14 +213,32 @@ export default {
&& (this.deductible == null || !useMainStore().isVerifiedCoverageStatus); && (this.deductible == null || !useMainStore().isVerifiedCoverageStatus);
}, },
subTotal() { subTotal() {
const basePrice = !useMainStore().isNoComp && !useMainStore().isITAC const { supportingItems, glassParts, otherParts, vaps, mobileFee } = useMainStore().lineItems;
? this.deductible const allLineItems = [
: this.baseServicePrice; ...(supportingItems ?? []),
const nonPackageCartItemsPrice = this.nonServicePackageCartItems?.reduce( ...(glassParts ?? []),
(accumulator, cartItem) => accumulator + (cartItem?.subTotal ?? 0), ...(otherParts ?? []),
0 ...(vaps ?? []),
) ?? 0; mobileFee
return basePrice + nonPackageCartItemsPrice + this.packagePrice; ];
return !useMainStore().isNoComp && !useMainStore().isITAC
? this.deductible + getPriceOfLineItems([...this.feeLineItems, ...(vaps ?? [])])
: getPriceOfLineItems(allLineItems);
},
recycleFeeLineItem() {
return useMainStore().lineItems.supportingItems
?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE);
},
feeLineItems() {
const { mobileFee } = useMainStore().lineItems;
const result = [];
if (mobileFee) {
result.push(mobileFee);
}
if (this.recycleFeeLineItem) {
result.push(this.recycleFeeLineItem);
}
return result;
}, },
salesTax() { salesTax() {
function sumTax(lineItems) { function sumTax(lineItems) {
@ -229,10 +252,7 @@ export default {
result += sumTax(this.baseServiceLineItems); result += sumTax(this.baseServiceLineItems);
} else { } else {
// deductible-case need to show tax for Recycle Fee // deductible-case need to show tax for Recycle Fee
const recycleFeeLineItem = useMainStore().lineItems.supportingItems result += this.recycleFeeLineItem != null ? this.recycleFeeLineItem.salesTax : 0;
?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE);
result += recycleFeeLineItem != null ? recycleFeeLineItem.salesTax : 0;
} }
} }
@ -246,26 +266,34 @@ export default {
: this.subTotal + this.salesTax; : this.subTotal + this.salesTax;
}, },
availableLineItems() { availableLineItems() {
const { glassParts, supportingItems } = useMainStore().lineItems; const { supportingItems, glassParts, otherParts, mobileFee } = useMainStore().lineItems;
return [ const result = [
...(glassParts ?? []),
...(supportingItems ?? []), ...(supportingItems ?? []),
...(glassParts ?? []),
...(otherParts ?? []),
...(this.availableVaps ?? []) ...(this.availableVaps ?? [])
]; ];
if (mobileFee) {
result.push(mobileFee);
}
return result;
}, },
servicePackageTier() { servicePackageTier() {
const { glassToReplace, isRepair } = useMainStore().damage;
const { vaps } = useMainStore().lineItems;
return getHighestFullySatisfiedTier( return getHighestFullySatisfiedTier(
useMainStore().damage.glassToReplace ?? [], glassToReplace ?? [],
this.availableLineItems, this.availableLineItems,
useMainStore().damage.isRepair, isRepair,
useMainStore().lineItems.vaps ?? [] vaps ?? []
); );
}, },
partTypesInServicePackage() { partTypesInServicePackage() {
const { glassToReplace, isRepair } = useMainStore().damage;
return getPackageContents( return getPackageContents(
useMainStore().damage.glassToReplace ?? [], glassToReplace ?? [],
this.availableLineItems, this.availableLineItems,
useMainStore().damage.isRepair, isRepair,
this.servicePackageTier this.servicePackageTier
) ?? []; ) ?? [];
}, },
@ -354,13 +382,12 @@ export default {
return currentPackage?.SubWidgetName ?? ''; return currentPackage?.SubWidgetName ?? '';
}, },
recycleFeeCartItem() { recycleFeeCartItem() {
const recycleFeeLineItem = useMainStore().lineItems.supportingItems return this.recycleFeeLineItem
?.find((lineItem) => lineItem.partNumber === partNumberStrings.RECYCLE_FEE);
return recycleFeeLineItem
? this.getCartItem( ? this.getCartItem(
this.getCmsContent(this.widget.recycleFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), this.getCmsContent(this.widget.recycleFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT),
[recycleFeeLineItem], [this.recycleFeeLineItem],
partTypeStrings.REPLACE_FEE // NOTE this is not a mistake cartItemType.RECYCLE_FEE,
partTypeStrings.REPLACE_FEE
) )
: null; : null;
}, },
@ -370,6 +397,7 @@ export default {
? this.getCartItem( ? this.getCartItem(
this.getCmsContent(this.widget.mobileFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT), this.getCmsContent(this.widget.mobileFee, widgetFields.TEXT_BLOCK_WIDGET.TEXT),
[mobileFeeLineItem], [mobileFeeLineItem],
cartItemType.MOBILE_FEE,
partTypeStrings.MOBILE_FEE partTypeStrings.MOBILE_FEE
) )
: null; : null;
@ -382,20 +410,20 @@ export default {
toggleIsExpanded() { toggleIsExpanded() {
this.isExpanded = !this.isExpanded; this.isExpanded = !this.isExpanded;
}, },
getDisplayed(amount, canBeVerifyingCoverage = true) { getDisplayed(amount) {
return canBeVerifyingCoverage return this.isUnverified
&& this.isUnverified
&& !useMainStore().isNoComp && !useMainStore().isNoComp
&& !useMainStore().isITAC && !useMainStore().isITAC
? VERIFYING_COVERAGE ? VERIFYING_COVERAGE
: formatAmountInDollars(amount); : formatAmountInDollars(amount);
}, },
getCartItem(label, lineItems, partType) { getCartItem(label, lineItems, cartItemTypeString, partType) {
let cartItem = null; let cartItem = null;
if (lineItems && lineItems.length > 0) { if (lineItems && lineItems.length > 0) {
cartItem = { cartItem = {
name: label, name: label,
cartItemType: cartItemTypeString,
partType, partType,
subTotal: getPriceOfLineItems(lineItems), subTotal: getPriceOfLineItems(lineItems),
salesTax: lineItems?.reduce( salesTax: lineItems?.reduce(
@ -411,13 +439,13 @@ export default {
const label = this.getCmsContentForVapsType(partType); const label = this.getCmsContentForVapsType(partType);
const lineItems = useMainStore().lineItems.vaps const lineItems = useMainStore().lineItems.vaps
?.filter((vapsLineItem) => vapsLineItem.partType === partType) ?? []; ?.filter((vapsLineItem) => vapsLineItem.partType === partType) ?? [];
return this.getCartItem(label, lineItems, partType); return this.getCartItem(label, lineItems, cartItemType.VAP, partType);
}, },
removeVap(partType) { removeVap(partType) {
const newVaps = useMainStore().lineItems.vaps?.filter((vap) => vap?.partType !== partType) ?? []; const newVaps = useMainStore().lineItems.vaps?.filter((vap) => vap?.partType !== partType) ?? [];
useMainStore().updateVaps(newVaps); useMainStore().updateVaps(newVaps);
}, },
getCmsContentForVapsType(vapsType) { getCmsContentForVapsType(vapsPartType) {
const vapsItemDescriptions = this.getCmsContent( const vapsItemDescriptions = this.getCmsContent(
this.widget.vapsItemDescriptions, this.widget.vapsItemDescriptions,
widgetFields.INPUT_QUESTION_WIDGET.ANSWERS widgetFields.INPUT_QUESTION_WIDGET.ANSWERS
@ -427,20 +455,9 @@ export default {
return ''; return '';
} }
const vapsTypeDescription = vapsItemDescriptions?.find((entry) => entry?.Name === vapsType); const vapsTypeDescription = vapsItemDescriptions?.find((entry) => entry?.Name === vapsPartType);
return vapsTypeDescription?.Text ?? ''; return vapsTypeDescription?.Text ?? '';
}, },
isVap(partType) {
const vapPartTypes = [
partTypeStrings.FRONT_WIPER,
partTypeStrings.REAR_WIPER,
partTypeStrings.RAIN_DEFENSE
];
return vapPartTypes.includes(partType);
},
isRecycle(partType) {
return partTypeStrings.REPLACE_FEE === partType;
},
formatAmountInDollars formatAmountInDollars
} }
}; };

View file

@ -1482,6 +1482,7 @@ export const useMainStore = defineStore({
resetState() { resetState() {
Object.assign(this, getDefaultState()); Object.assign(this, getDefaultState());
console.log(JSON.stringify(this.order.lineItems.glassParts));
}, },
resetRegistrationState() { resetRegistrationState() {