diff --git a/src/layouts/capability-questions/capability-questions.spec.js b/src/layouts/capability-questions/capability-questions.spec.js index c09d07c0..7f970443 100644 --- a/src/layouts/capability-questions/capability-questions.spec.js +++ b/src/layouts/capability-questions/capability-questions.spec.js @@ -8,11 +8,10 @@ import { useMainStore } from '@/store'; import vehicleQuestionsMixin from '@/mixins/vehicle-questions-mixin'; import { nextTick } from 'vue'; import baseMixin from '@/mixins/base-mixin'; +import settleAllPromises from '@/helpers/layout-helper.js'; // Mock our module for promises. -jest.mock('@/helpers/layout-helper.js', () => ({ - settleAllPromises: jest.fn() -})); +jest.mock('@/helpers/layout-helper.js', () => jest.fn()); // Mock fetchCmsContentForPage jest.mock('@/helpers/cms-content-helper', () => ({ @@ -244,7 +243,8 @@ describe('capabilityQuestions.vue', () => { }); describe('forwardButtonAction', () => { - test('Should clear out answerData', () => { + settleAllPromises.mockImplementation(() => []); + test('Should clear out answerData', async () => { // Arrange const { wrapper } = setupMocks({}); @@ -269,7 +269,7 @@ describe('capabilityQuestions.vue', () => { })); // Act - wrapper.vm.forwardButtonAction(); + await wrapper.vm.forwardButtonAction(); // Assert expect(wrapper.vm.questionsData[0].answerData).toEqual({}); @@ -277,8 +277,7 @@ describe('capabilityQuestions.vue', () => { wrapper.unmount(); }); - // TODO: Add () to toHaveBeenCalled and ensure test passes. - test.skip('Should save to pinia store', async () => { + test('Should save to pinia store', async () => { // Arrange const { wrapper } = setupMocks({}); @@ -303,18 +302,17 @@ describe('capabilityQuestions.vue', () => { partsOrQuestions: [] } })); + const saveCapabilityQuestionAnswersSpy = jest.spyOn(useMainStore(), 'saveCapabilityQuestionAnswers'); // Act - wrapper.vm.forwardButtonAction(); - - await nextTick(); + await wrapper.vm.forwardButtonAction(); // Assert - expect(wrapper.vm.saveCapabilityQuestionAnswers).toHaveBeenCalled; + expect(saveCapabilityQuestionAnswersSpy).toHaveBeenCalled(); wrapper.unmount(); }); - // TODO: Add () to toHaveBeenCalled and ensure test passes. - test.skip('Should call GET_PART_FROM_CAPABILITY_QUESTION_ANSWER API', async () => { + + test('Should call updatePartFromCapabilityQuestionAnswer', async () => { // Arrange const { wrapper } = setupMocks({}); @@ -334,18 +332,19 @@ describe('capabilityQuestions.vue', () => { ] } ]; - wrapper.vm.dispatchStoreAction = jest.fn(() => ({ - data: [] + useMainStore().getPartsOrQuestions = jest.fn(() => ({ + data: { + partsOrQuestions: [] + } })); + const updatePartFromCapabilityQuestionAnswerSpy = jest.spyOn(useMainStore(), 'updatePartFromCapabilityQuestionAnswer'); + updatePartFromCapabilityQuestionAnswerSpy.mockClear(); // Act - wrapper.vm.forwardButtonAction(); - - await nextTick(); + await wrapper.vm.forwardButtonAction(); // Assert - expect(wrapper.vm.getPartFromCapabilityQuestionAnswer).toHaveBeenCalled; - + expect(updatePartFromCapabilityQuestionAnswerSpy).toHaveBeenCalledTimes(1); wrapper.unmount(); }); diff --git a/src/layouts/capability-questions/capability-questions.vue b/src/layouts/capability-questions/capability-questions.vue index 65d6f41a..494fcacd 100644 --- a/src/layouts/capability-questions/capability-questions.vue +++ b/src/layouts/capability-questions/capability-questions.vue @@ -131,22 +131,18 @@ export default { }, async forwardButtonAction() { const questionAnswersArray = this.questionsData.map((glass) => { - // get answerResult2 of returned answer - let selectedAnswerResult2; - glass.questions.forEach((q) => { - const idx = q.answers.findIndex((a) => a.answerResult === glass.answerData.answerResult); - if (idx !== -1) { - selectedAnswerResult2 = q.answers[idx].answerResult2; - } - }); + const { glassLocation, glassName, isSuppressedPart, answerData, questions } = glass; + const { answerResult, answeredQuestions } = answerData return { - glassLocation: glass.glassLocation, - glassName: glass.glassName, - result: glass.answerData.answerResult, - result1: glass.answerData.answerResult, - result2: selectedAnswerResult2, - answeredQuestions: glass.answerData.answeredQuestions, - isSuppressedPart: glass.isSuppressedPart + glassLocation, + glassName, + result: answerResult, + result1: answerResult, + result2: questions + .flatMap(q => q.answers) + .find(a => a.answerResult === answerData.answerResult)?.answerResult2, + answeredQuestions, + isSuppressedPart }; }); // clear out answerData for future page loads; must occur prior to store save @@ -155,7 +151,21 @@ export default { }); // save to store as order.damage.moldingQuestionArrays (array) await this.mainStore.saveCapabilityQuestionAnswers(questionAnswersArray); - // TODO call get parts from the capabilityQuestionAnswers endpoint + + // set recalibration properties of parts based on capability question answers + const promiseResultMap = questionAnswersArray.map((answer, i) => { + const partData = this.partsOrQuestionsData.find(x => x.glassLocation === answer.glassLocation); + return { + resultKey: i, + promise: useMainStore().updatePartFromCapabilityQuestionAnswer(partData.parts[0], answer) + }; + }); + const resultMap = await settleAllPromises(promiseResultMap); + questionAnswersArray.forEach((answer, i) => { + const partData = this.partsOrQuestionsData.find((x) => x.glassLocation === answer.glassLocation); + partData.parts[0] = resultMap[i]; + }); + this.navigateForward(this.partsOrQuestionsData, null); } } diff --git a/src/mixins/vehicle-questions-mixin.js b/src/mixins/vehicle-questions-mixin.js index 88f6b2b6..c19984d3 100644 --- a/src/mixins/vehicle-questions-mixin.js +++ b/src/mixins/vehicle-questions-mixin.js @@ -11,10 +11,10 @@ export default { return partsOrQuestions?.some((pq) => pq.parts?.length > 1); }, hasChildPartQuestions(partsOrQuestions) { - return partsOrQuestions?.some((pq) => pq.parts?.some((part) => part.childPartQuestions?.length > 0)); + return partsOrQuestions?.some((pq) => pq.parts?.some((part) => part?.childPartQuestions?.length > 0)); }, hasCapabilityQuestions(partsOrQuestions) { - return partsOrQuestions?.some((pq) => pq.parts?.some((part) => part.requiresCapabilityQuestions === true)); + return partsOrQuestions?.some((pq) => pq.parts?.some((part) => part?.requiresCapabilityQuestions === true)); }, // method to only include keys listed for lineItems.glassParts in @@ -23,18 +23,20 @@ export default { glassParts.forEach((glass) => { if (Array.isArray(glass.parts) && glass.parts.length === 1) { const singlePart = glass.parts[0]; - reducedGlassParts.push({ - partNumber: singlePart.partNumber, - description: singlePart.description, - color: singlePart.color, - partType: singlePart.partType, - canSafeliteRecalibrate: singlePart.canSafeliteRecalibrate, - requiresRecalibration: singlePart.requiresRecalibration, - requiresCapabilityQuestions: singlePart.requiresCapabilityQuestions, - recalibrationType: singlePart.recalibrationType, - childParts: singlePart.childParts, - price: singlePart.price - }); + if (singlePart){ + reducedGlassParts.push({ + partNumber: singlePart.partNumber, + description: singlePart.description, + color: singlePart.color, + partType: singlePart.partType, + canSafeliteRecalibrate: singlePart.canSafeliteRecalibrate, + requiresRecalibration: singlePart.requiresRecalibration, + requiresCapabilityQuestions: singlePart.requiresCapabilityQuestions, + recalibrationType: singlePart.recalibrationType, + childParts: singlePart.childParts, + price: singlePart.price + }); + } } }); return reducedGlassParts; diff --git a/src/store/index.js b/src/store/index.js index d95c6a07..321d9285 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -813,22 +813,15 @@ export const useMainStore = defineStore({ }); }, - getPartFromCapabilityQuestionAnswer(glassLocation) { - const pageData = this.pageData(issPageValues.CAPABILITY_QUESTIONS); - - const part = pageData.partsOrQuestions.find((x) => x.glassLocation === glassLocation) - .parts[0]; - const { capabilityQuestionAnswers } = this.order.damage; - const capabilityQuestionAnswersForPart = capabilityQuestionAnswers.find((x) => x.glassLocation === glassLocation); - - return globalMethods.callHttpClient({ + async updatePartFromCapabilityQuestionAnswer(part, capabilityQuestionAnswersForPart) { + return (await globalMethods.callHttpClient({ method: endpoints.GetPartFromCapabilityAnswer.method, endpoint: endpoints.GetPartFromCapabilityAnswer.url, payload: { part, capabilityAnswerResults: capabilityQuestionAnswersForPart } - }); + })).data[0]; }, getMobilePremiumFee() { const damageType = this.damage.isRepair ? 'Repair' : 'Replace';