DigitalConsumer.ISS/src/helpers/cart-helper.spec.js

595 lines
18 KiB
JavaScript

import {
getAllLineItems,
getCartTotal,
getDeductible,
getLineItems,
getMobileFeeLineItem, getNonServiceLineItems,
getRecycleFeeLineItem, getSalesTax,
getServiceLineItems, getSubtotal, isOrderITAC, isOrderNoComp,
isOrderUnverified
} from '@/helpers/cart-helper';
import partTypeStrings from '@/constants/part-type-strings';
import partNumberStrings from '@/constants/part-number-strings';
import coverageStatuses from '@/constants/coverage-statuses';
import coverageType from '@/constants/coverage-type';
import { getEnumName } from '@/helpers/unit-test-helper';
describe('cart-helper', () => {
function createDummyItem(partNumber, price, salesTax) {
return {
partNumber,
sellingPrice: price,
kitPrice: 0,
laborAmount: 0,
salesTax
};
}
function createDummyFeeItem(partNumber, partType, price, salesTax) {
return {
partNumber,
partType,
sellingPrice: price,
kitPrice: 0,
laborAmount: 0,
salesTax
};
}
const nullLineItems = {
supportingItems: null,
glassParts: null,
otherParts: null,
vaps: null,
feeItems: null
};
const emptyLineItems = {
supportingItems: [],
glassParts: [],
otherParts: [],
vaps: [],
feeItems: []
};
const supportingLineItem = createDummyItem('supporting', 30, 1);
const glassLineItem = createDummyItem('glass', 40, 2);
const otherLineItem = createDummyItem('other', 50, 3);
const vapsLineItem = createDummyItem('vaps', 60, 4);
const mobileFeeLineItem = createDummyFeeItem(null, partTypeStrings.MOBILE_FEE, 70, 5);
const recycleFeeLineItem = createDummyFeeItem(partNumberStrings.RECYCLE_FEE, null, 80, 6);
const defaultLineItems = {
supportingItems: [supportingLineItem],
glassParts: [glassLineItem],
otherParts: [otherLineItem],
vaps: [vapsLineItem],
feeItems: [mobileFeeLineItem, recycleFeeLineItem]
};
describe('getLineItems', () => {
test('Returns line items', () => {
// Arrange
const order = {
lineItems: emptyLineItems
};
// Act
const result = getLineItems(order);
// Assert
expect(result).toMatchObject(order.lineItems);
});
});
describe('getServiceLineItems', () => {
test('Returns only service line items', () => {
// Arrange
const order = {
lineItems: defaultLineItems
};
// Act
const result = getServiceLineItems(order);
// Assert
expect(result).toHaveLength(5);
expect(result).toContain(supportingLineItem);
expect(result).toContain(glassLineItem);
expect(result).toContain(otherLineItem);
expect(result).toContain(mobileFeeLineItem);
expect(result).toContain(recycleFeeLineItem);
});
test('Returns empty array when line items are null', () => {
// Arrange
const order = {
lineItems: nullLineItems
};
// Act
const result = getServiceLineItems(order);
// Assert
expect(result).toHaveLength(0);
});
});
describe('getNonServiceLineItems', () => {
test('Returns only service line items', () => {
// Arrange
const order = {
lineItems: defaultLineItems
};
// Act
const result = getNonServiceLineItems(order);
// Assert
expect(result).toHaveLength(1);
expect(result).toContain(vapsLineItem);
});
test('Returns empty array when line items are null', () => {
// Arrange
const order = {
lineItems: nullLineItems
};
// Act
const result = getNonServiceLineItems(order);
// Assert
expect(result).toHaveLength(0);
});
});
describe('getAllLineItems', () => {
test('Returns all line items', () => {
// Arrange
const order = {
lineItems: defaultLineItems
};
// Act
const result = getAllLineItems(order);
// Assert
expect(result).toHaveLength(6);
expect(result).toContain(supportingLineItem);
expect(result).toContain(glassLineItem);
expect(result).toContain(otherLineItem);
expect(result).toContain(vapsLineItem);
expect(result).toContain(mobileFeeLineItem);
expect(result).toContain(recycleFeeLineItem);
});
test('Returns empty array when line items are null', () => {
// Arrange
const order = {
lineItems: nullLineItems
};
// Act
const result = getAllLineItems(order);
// Assert
expect(result).toHaveLength(0);
});
});
describe('getRecycleFee', () => {
test('Returns recycle fee when present', () => {
// Arrange
const order = {
lineItems: defaultLineItems
};
// Act
const result = getRecycleFeeLineItem(order);
// Assert
expect(result).not.toBeNull();
expect(result).toMatchObject(recycleFeeLineItem);
});
test('Returns undefined recycle fee when not present', () => {
// Arrange
const order = {
lineItems: emptyLineItems
};
// Act
const result = getRecycleFeeLineItem(order);
// Assert
expect(result).toBeUndefined();
});
});
describe('getMobileFee', () => {
test('Returns mobile fee when present', () => {
// Arrange
const order = {
lineItems: defaultLineItems
};
// Act
const result = getMobileFeeLineItem(order);
// Assert
expect(result).not.toBeNull();
expect(result).toMatchObject(mobileFeeLineItem);
});
test('Returns undefined mobile fee when not present', () => {
// Arrange
const order = {
lineItems: emptyLineItems
};
// Act
const result = getMobileFeeLineItem(order);
// Assert
expect(result).toBeUndefined();
});
});
describe('getDeductible', () => {
test('Returns deductible on the order', () => {
// Arrange
const deductible = {
replace: 100
};
const order = {
damage: {
isRepair: false
},
currentDeductible: deductible
};
// Act
const result = getDeductible(order);
// Assert
expect(result).not.toBeNull();
expect(result).toBe(deductible.replace);
});
});
describe('isOrderUnverified', () => {
test.each([[false, false], [true, true]])('Returns %p when isUnverified is %p', (expected, isUnverified) => {
// Arrange
const order = {
isUnverified
};
// Act
const result = isOrderUnverified(order);
// Assert
expect(result).toBe(expected);
});
});
describe('isOrderNoComp', () => {
test('Returns false when insuranceCoverage is null', () => {
// Arrange
const order = {};
// Act
const result = isOrderNoComp(order);
// Assert
expect(result).toBeFalsy();
});
describe.each([
[false, coverageType.NONE],
[false, coverageType.ITAC],
[true, coverageType.NO_COMP],
[false, coverageType.Deductible]])('isOrderNoComp by coverageType', (expected, type) => {
test(`Returns ${expected} when insuranceCoverage.coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
insuranceCoverage: {
coverageType: type
}
};
// Act
const result = isOrderNoComp(order);
// Assert
expect(result).toBe(expected);
});
});
});
describe('isOrderITAC', () => {
test('Returns false when insuranceCoverage is null', () => {
// Arrange
const order = {};
// Act
const result = isOrderITAC(order);
// Assert
expect(result).toBeFalsy();
});
describe.each([
[false, coverageType.NONE],
[true, coverageType.ITAC],
[false, coverageType.NO_COMP],
[false, coverageType.Deductible]])('isOrderITAC by coverageType ', (expected, type) => {
test(`Returns ${expected} when insuranceCoverage.coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
insuranceCoverage: {
coverageType: type
}
};
// Act
const result = isOrderITAC(order);
// Assert
expect(result).toBe(expected);
});
});
});
describe('getSubtotal', () => {
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[100, coverageType.Deductible]])('getSubtotal null line items', (expected, type) => {
test(`Returns ${expected} when there are null items and verified ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: nullLineItems
};
// Act
const result = getSubtotal(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[100, coverageType.Deductible]])('getSubtotal no line items', (expected, type) => {
test(`Returns ${expected} when there are no items and verified ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: emptyLineItems
};
// Act
const result = getSubtotal(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[330, coverageType.ITAC],
[330, coverageType.NO_COMP],
[160, coverageType.Deductible]])('getSubtotal with line items', (expected, type) => {
test(`Returns ${expected} cart subtotal when verified ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: defaultLineItems
};
// Act
const result = getSubtotal(order);
// Assert
expect(result).toBe(expected);
});
});
});
describe('getSalesTax', () => {
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[0, coverageType.Deductible]])('getSalesTax null items', (expected, type) => {
test(`Returns ${expected} when there are null items and coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
lineItems: nullLineItems
};
// Act
const result = getSalesTax(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[0, coverageType.Deductible]])('getSalesTax with no items', (expected, type) => {
test(`Returns ${expected} when there are no items and coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
lineItems: emptyLineItems
};
// Act
const result = getSalesTax(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[21, coverageType.ITAC],
[21, coverageType.NO_COMP],
[4, coverageType.Deductible]])('getSalesTax with line items', (expected, type) => {
test(`Returns ${expected} when coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
lineItems: defaultLineItems
};
// Act
const result = getSalesTax(order);
// Assert
expect(result).toBe(expected);
});
});
});
describe('getCartTotal', () => {
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[100, coverageType.Deductible]
])('getCartTotal null items', (expected, type) => {
test(`Returns ${expected} when there are null items and coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: nullLineItems
};
// Act
const result = getCartTotal(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[0, coverageType.ITAC],
[0, coverageType.NO_COMP],
[100, coverageType.Deductible]
])('getCartTotal no items', (expected, type) => {
test(`Returns ${expected} when there are no items and coverageType is ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: emptyLineItems
};
// Act
const result = getCartTotal(order);
// Assert
expect(result).toBe(expected);
});
});
describe.each([
[351, coverageType.ITAC],
[351, coverageType.NO_COMP],
[164, coverageType.Deductible]
])('getCartTotal items', (expected, type) => {
test(`Returns ${expected} cart total when verified ${getEnumName(coverageType, type)}`, () => {
// Arrange
const order = {
isUnverified: false,
insuranceCoverage: {
coverageStatus: coverageStatuses.VERIFIED,
coverageType: type
},
damage: {
isRepair: false
},
currentDeductible: {
replace: 100
},
lineItems: defaultLineItems
};
// Act
const result = getCartTotal(order);
// Assert
expect(result).toBe(expected);
});
});
});
});