diff --git a/src/layouts/schedule-page/schedule-page.spec.js b/src/layouts/schedule-page/schedule-page.spec.js new file mode 100644 index 00000000..1e348080 --- /dev/null +++ b/src/layouts/schedule-page/schedule-page.spec.js @@ -0,0 +1,184 @@ +// Components +import schedule from '@/layouts/schedule-page/schedule-page.vue'; + +// Supporting Files +import { createTestingPinia } from '@pinia/testing'; +import { shallowMount } from '@vue/test-utils'; +import { getMountOptions } from '@/helpers/unit-test-helper.js'; +import { useMainStore } from '@/store/index.js'; + +const mockMixin = { + methods: { + getCmsContent: jest.fn().mockImplementation(() => ''), + setCmsContent: jest.fn() + } +}; + +const footerStub = { + render: () => {}, + methods: { + updateButtonText: jest.fn() + } +}; + +const loadingModalStub = { + render: () => {}, + methods: { + showModal: jest.fn(), + hideModal: jest.fn() + } +}; + +function getShallowMountedComponent(initialData = {}, methodToRun = () => {}) { + const mountOptions = getMountOptions({ + router: { + navigate: jest.fn() + } + }); + + // mountOptions.global.mocks["$store"] = store; + + mountOptions.global.stubs = { + siteFooter: footerStub, + siteHeader: true, + recalModal: true, + contentGroupModal: true, + alert: true, + loadingModal: loadingModalStub + }; + + methodToRun(); + + mountOptions.mixins = [mockMixin]; + mountOptions.data = () => ( + initialData + ); + + const wrapper = shallowMount(schedule, mountOptions); + return { wrapper }; +} + +beforeEach(() => { + const testingPinia = createTestingPinia({ + initialState: { + main: { + order: { + schedule: { + date: '2019-01-01', + startTime: '09:00', + endTime: '10:00', + routeCode: '000' + }, + lineItems: { + glassParts: [ + { + partNumber: 'ABC123' + } + ], + supportingItems: [] + }, + serviceLocation: { + appointmentType: 'Inshop', + zipCode: '12345', + zipCodeCtu: '01234', + provider: { + providerNumber: '123' + } + }, + damage: { + isRepair: false + }, + referralNumber: '1234567' + }, + payment: { + isInsurance: true + }, + lineItems: { + glassParts: [], + supportingItems: [] + } + } + } + }); + useMainStore(testingPinia); +}); + +describe('schedule-page.vue', () => { + describe('Initial Load', () => { + test('Should pass arePagePrerequisitesValid with a mobile order and no providerNumber', () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + wrapper.vm.mainStore.order.serviceLocation.appointmentType = 'Mobile'; + wrapper.vm.mainStore.order.serviceLocation.provider = null; + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBe(true); + }); + test('Should pass arePagePrerequisitesValid with an inshop order and providerNumber', () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBe(true); + }); + test('Should fail arePagePrerequisitesValid with an inshop order and no providerNumber', () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + wrapper.vm.mainStore.order.serviceLocation.provider.providerNumber = null; + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBeFalsy(); + }); + test('Should fail arePagePrerequisitesValid without isInsurance', () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + wrapper.vm.mainStore.payment.isInsurance = null; + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBe(false); + }); + test('Should fail arePagePrerequisitesValid if supportingItems is null', async () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + wrapper.vm.mainStore.order.lineItems.supportingItems = null; + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBe(false); + }); + test('Should fail arePagePrerequisitesValid with an replace with no glass parts', async () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + wrapper.vm.mainStore.order.lineItems.glassParts = []; + + // Act + const arePagePrerequisitesValid = wrapper.vm.arePagePrerequisitesValid(); + + // Assert + expect(arePagePrerequisitesValid).toBe(false); + }); + }); + describe('Rendering', () => { + test('Schedule page loads', () => { + // Arrange + const { wrapper } = getShallowMountedComponent(); + + // Assert + expect(wrapper).toBeTruthy(); + }); + }); +});