+
0;
},
- setupInitialData(glass, i, alreadyAnsweredQuestions, vm) {
- glass.key = glass.glassLocation + "-" + glass.glassName;
+ setupInitialData(glass, index, alreadyAnsweredQuestions, vm) {
const self = vm ?? this;
+
// clear answerData if no questions are already answered
if (!alreadyAnsweredQuestions) {
glass.answerData = null;
@@ -100,33 +99,39 @@ export default {
let answerString = "";
// loop through answeredQuestions for matches
- answeredGlass.answeredQuestions.forEach((aq) => {
- if (!aq.questionNum || !aq.selectedAnswerText) {
+ answeredGlass.answeredQuestions.forEach((answeredQuestion) => {
+ if (!answeredQuestion.questionNum || !answeredQuestion.selectedAnswerText) {
return;
}
// determine which answer was previously chosen
- const chosenAns = glass.questions[aq.questionNum - 1].answers.find((a) => {
+ const chosenAns = glass.questions[
+ answeredQuestion.questionNum - 1
+ ].answers.find((a) => {
return (
- a.answerText.toUpperCase() === aq.selectedAnswerText.toUpperCase()
+ a.answerText.toUpperCase() ===
+ answeredQuestion.selectedAnswerText.toUpperCase()
);
});
// set the answerString to use for answerSelected
if (chosenAns.nextQuestionSequence) {
- answerString = `${aq.questionNum}|nextQuestion|${chosenAns.nextQuestionSequence}|${chosenAns.answerText}`;
+ answerString = `${answeredQuestion.questionNum}|nextQuestion|${chosenAns.nextQuestionSequence}|${chosenAns.answerText}`;
} else {
- answerString = `${aq.questionNum}|answer|${chosenAns.answerResult}|${chosenAns.answerText}`;
+ answerString = `${answeredQuestion.questionNum}|answer|${chosenAns.answerResult}|${chosenAns.answerText}`;
}
// mark this question as answered (question-chain will read this)
- glass.questions[aq.questionNum - 1].answerSelected = answerString;
+ glass.questions[answeredQuestion.questionNum - 1].answerSelected =
+ answerString;
// mark this question as suppressed if needed (question-chain uses this)
- if (aq.suppressQuestion) {
- glass.questions[aq.questionNum - 1].suppressQuestion = true;
+ if (answeredQuestion.suppressThisQuestion) {
+ glass.questions[
+ answeredQuestion.questionNum - 1
+ ].suppressThisQuestion = true;
}
});
// advance the currentGlassIndex
- self.currentGlassIndex = i;
+ self.currentGlassIndex = index;
const answerResult = answeredGlass.partNum
? answeredGlass.partNum
@@ -141,20 +146,221 @@ export default {
}
});
- // Set up watch for each set of glass questions
- // (updated when all questions for a glass have been answered in question-chain)
- self.$watch(
- "selectedAnswers." + glass.glassLocation + "-" + glass.glassName,
- (newValue) => {
- if (newValue) {
- self.handleAnswerUpdates(newValue);
- }
- },
- { deep: true }
- );
-
return glass;
},
+ handleAnswerUpdates(answer, glassKey, vm) {
+ // only runs when all questions in a question-chain have been answered
+ // when selectedAnswers updates, user has completed this part's question chain and has a final answer
+ // (does not get run for each invididual question's answer, only when
+ // all relevant questions for the current part have been answered)
+
+ /* answer example format:
+ {
+ "answerResult": "DD11132",
+ "answeredQuestions": [
+ {
+ "questionText": "Is your Grand Cherokee the Laredo model?",
+ "selectedAnswerText": "Yes",
+ "questionNum": 1,
+ }
+ ],
+ "index": 0
+ }
+ */
+
+ const self = vm ?? this;
+
+ // clear out any preloaded answers
+ self.selectedAnswers = {};
+
+ // loop through every answered question on the currently answered glass part
+ answer.answeredQuestions?.forEach((answeredQuestion) => {
+ /* answeredQuestion example format:
+ {
+ "questionText": "Is your Grand Cherokee the Laredo model?",
+ "selectedAnswerText": "Yes",
+ "questionNum": 1,
+ }
+ */
+
+ const answeredQuestionText = answeredQuestion.questionText.toUpperCase();
+ const answeredQuestionAnswer = answeredQuestion.selectedAnswerText.toUpperCase();
+
+ // HANDLE DUPLICATE QUESTIONS
+
+ // loop through all glass data
+ self.questionsData.forEach((glass, glassIndex) => {
+ /* glass example format:
+ {
+ "glassName": "Single",
+ "glassLocation": "Windshield",
+ "parts": null,
+ "questions": [
+ {
+ "questionSequence": 1,
+ "questionText": "Is your vehicle equipped with a black dotted pattern behind the rear view mirror, known as a third visor frit?",
+ "answers": [
+ {
+ "answerResult": "DW01537",
+ "answerText": "Yes",
+ "nextQuestionSequence": null
+ },
+ {
+ "answerResult": "DW01537b",
+ "answerText": "No",
+ "nextQuestionSequence": null
+ }
+ ]
+ }
+ ],
+ "answerKey": "Windshield-Single",
+ "answerData": null
+ }
+ */
+
+ // limit duplicate search to glass pieces that follow after the currently being answered glass piece
+ if (glassIndex > answer.index) {
+ let indexToSuppressTo;
+ // reset this glass piece, in case user is changing their previous answers
+ glass.answerData = null;
+ glass.isSuppressedPart = null;
+
+ // loop through this glass piece's questions, looking for a questionText match
+ glass.questions.forEach((question, questionIndex) => {
+ // clear out any previously set answers
+ question.answerSelected = null;
+
+ // clear or set suppressThisQuestion property for each question
+ if (indexToSuppressTo && questionIndex + 1 < indexToSuppressTo) {
+ question.suppressThisQuestion = true;
+ } else {
+ question.suppressThisQuestion = null;
+ }
+
+ // handle duplicate questions
+ if (question.questionText.toUpperCase() === answeredQuestionText) {
+ let matchedAnswer;
+
+ // handle matching answer in duplicated question
+ question.answers.forEach((ans) => {
+ if (ans.answerText.toUpperCase() === answeredQuestionAnswer) {
+ matchedAnswer = ans;
+ ans.selected = true;
+ } else {
+ ans.selected = null;
+ }
+ });
+
+ // handle duplicate's nextQuestion logic on other related questions
+ if (matchedAnswer.nextQuestionSequence) {
+ // clear any suppression on the nextQuestion
+ glass.questions[
+ matchedAnswer.nextQuestionSequence - 1
+ ].suppressThisQuestion = null;
+ // if the duplicate is 1ST question in array, set indexToSuppressTo
+ if (questionIndex === 0) {
+ if (
+ !indexToSuppressTo ||
+ matchedAnswer.nextQuestionSequence < indexToSuppressTo
+ ) {
+ indexToSuppressTo = matchedAnswer.nextQuestionSequence;
+ }
+ }
+ }
+
+ // update answers in this glass piece's questions with duplication logic modifications
+ glass.questions.forEach((q) => {
+ q.answers.forEach((a) => {
+ // revert any previously set nextQuestion logic modifications
+ if (
+ a.originalNextQuestionSequence ===
+ question.questionSequence
+ ) {
+ // restore original nextQuestionSequence
+ a.nextQuestionSequence = a.originalNextQuestionSequence;
+ self.originalNextQuestionSequence = null;
+ // restore original answerResult
+ if (a.originalAnswerResult) {
+ a.answerResult = a.originalAnswerResult;
+ a.originalAnswerResult = null;
+ }
+ }
+ // modify logic on any related questions
+ if (a.nextQuestionSequence === question.questionSequence) {
+ // update either nextQuestionSequence or answerResult
+
+ // update questions that lead to duplicated question
+ if (matchedAnswer.nextQuestionSequence) {
+ a.originalNextQuestionSequence =
+ a.nextQuestionSequence;
+ a.nextQuestionSequence =
+ matchedAnswer.nextQuestionSequence;
+ } else {
+ a.originalNextQuestionSequence =
+ a.nextQuestionSequence;
+ a.nextQuestionSequence = null;
+ a.originalAnswerResult =
+ a.originalAnswerResult || a.answerResult;
+ a.answerResult = matchedAnswer.answerResult;
+ }
+ }
+ });
+ });
+
+ // suppress current question
+ question.suppressThisQuestion = true;
+
+ // are there any questions left that are not suppressed?
+ const remainingQuestions = glass.questions.filter((q) => {
+ return !q.suppressThisQuestion;
+ });
+
+ if (remainingQuestions.length < 1) {
+ // this is the final answer for this glass piece
+
+ // mark this glass piece as completely answered by adding answerData
+ const answeredQuestionObj = {
+ questionText: question.questionText,
+ selectedAnswerText: matchedAnswer.answerText,
+ questionNum: question.questionSequence,
+ suppressThisQuestion: question.suppressThisQuestion,
+ };
+ // set the answerData (used as indicator that it has been already answered)
+ glass.answerData = {
+ answerResult: matchedAnswer.nextQuestionSequence
+ ? matchedAnswer.nextQuestionSequence
+ : matchedAnswer.answerResult,
+ answeredQuestions: [answeredQuestionObj],
+ };
+
+ // suppress this glass piece because it has an answer
+ glass.isSuppressedPart = true;
+ }
+ }
+ });
+
+ // Update key to force re-render of glass piece with duplicate question in case user changes previous related answer in the chain
+ self.questionsData[glassIndex].key =
+ self.questionsData[glassIndex].key + Date.now().toString();
+ }
+ });
+ });
+
+ // set final answer data for the current answered glass part
+ self.questionsData[answer.index].answerData = {
+ answerResult: answer.answerResult,
+ answeredQuestions: answer.answeredQuestions,
+ };
+
+ // this part has been fully answered, so advance to next part's question chain
+ for (let i = answer.index + 1; i < this.questionsData.length; i++) {
+ // if this part has not yet been fully answered, then make it the current part
+ if (!this.questionsData[i].answerData?.answerResult) {
+ this.currentGlassIndex = i;
+ break;
+ }
+ }
+ },
// TODO KO Delete `shouldGoToHeritageQuote`
// Can't use `this` because navigateForward is also called from vin-pages-mixin
async navigateForward(partsOrQuestions, vm, shouldGoToHeritageQuote) {
@@ -247,6 +453,7 @@ export default {
} else {
// if single parts only
const collectedGlassParts = this.reducedGlassPartsArray(partsOrQuestions);
+
// save to store lineItems.glassParts
self.$store.commit(storeMutations.UPDATE_GLASS_PARTS, collectedGlassParts);
diff --git a/src/mixins/vehicle-questions-mixin.spec.js b/src/mixins/vehicle-questions-mixin.spec.js
index cabee328d..a156a0c66 100644
--- a/src/mixins/vehicle-questions-mixin.spec.js
+++ b/src/mixins/vehicle-questions-mixin.spec.js
@@ -335,24 +335,6 @@ describe("vehicle-questions-mixin", () => {
});
describe("setupInitialData", () => {
- describe("should always", () => {
- test("return glass with new key attribute", async () => {
- // Arrange
- const { wrapper } = setupMocks({});
- const glass = {
- glassName: "Single",
- glassLocation: "Windshield",
- };
- const i = 0;
-
- // Act
- const returnedGlass = await wrapper.vm.setupInitialData(glass, i);
-
- // Assert
- expect(returnedGlass).toMatchObject({ key: "Windshield-Single" });
- });
- });
-
describe("if no alreadyAnsweredQuestions", () => {
test("should return glass with answerData of null", async () => {
// Arrange
@@ -428,6 +410,816 @@ describe("vehicle-questions-mixin", () => {
});
});
+ describe("handleAnswerUpdates", () => {
+ describe("selectedAnswers", () => {
+ test("should be cleared to be empty", () => {
+ // Arrange
+ const answer = {
+ answerResult: "DD11132",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "Yes",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.selectedAnswers = { test: "mockSelectedAnswers" };
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [],
+ answerData: "testAnswerData1",
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answer, "", wrapper.vm);
+
+ // Assert
+ expect(wrapper.vm.selectedAnswers).toMatchObject({});
+ });
+ });
+
+ describe("questions in glass parts that are after the answered glass", () => {
+ test("should have answerData cleared", () => {
+ // Arrange
+ const answer = {
+ answerResult: "DD11132",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "Yes",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [],
+ answerData: "testAnswerData1",
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [],
+ answerData: "testAnswerData2",
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answer, "", wrapper.vm);
+
+ // Assert
+ expect(wrapper.vm.questionsData[1].answerData).toEqual(null);
+ });
+ test("should have isSuppressedPart cleared", () => {
+ // Arrange
+ const answer = {
+ answerResult: "DD11132",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "Yes",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [],
+ answerData: "testAnswerData1",
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [],
+ answerData: "testAnswerData2",
+ isSuppressedPart: true,
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answer, "", wrapper.vm);
+
+ // Assert
+ expect(wrapper.vm.questionsData[1].isSuppressedPart).toEqual(null);
+ });
+ test("should set answerSelected for each glass part question to null ", () => {
+ // Arrange
+ const answer = {
+ answerResult: "DD11132",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "Yes",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [],
+ answerData: "testAnswerData1",
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText:
+ "Is your vehicle equipped with the Panoramic Sunroof which can be identified by having a glass panel over the rear seats?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 2,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 3,
+ },
+ ],
+ answerSelected: "456",
+ },
+ {
+ questionSequence: 2,
+ questionText:
+ "Is your vehicle equipped with a heated windshield that melts snow and ice from underneath the windshield wiper blades?",
+ answers: [
+ {
+ answerResult: "FW04848",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "FW04846",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ answerSelected: "789",
+ },
+ ],
+ answerData: "testAnswerData2",
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answer, "", wrapper.vm);
+
+ // Assert
+ expect(wrapper.vm.questionsData[1].questions[0].answerSelected).toEqual(null);
+ expect(wrapper.vm.questionsData[1].questions[1].answerSelected).toEqual(null);
+ });
+ });
+
+ describe("if there is a duplicate question", () => {
+ test("then the glass piece's key should be updated", () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ key: "testkey1",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ key: "testkey2",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+ const glassWithDuplicate = wrapper.vm.questionsData[1];
+
+ // Assert
+ expect(glassWithDuplicate.key).not.toBe("testkey2");
+ });
+
+ test("then that question should be supressed", () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+ const duplicateQuestion = wrapper.vm.questionsData[1].questions[0];
+
+ // Assert
+ expect(duplicateQuestion.suppressThisQuestion).toBeTruthy();
+ });
+
+ describe("and the duplicate has a nextQuestionSequence value", () => {
+ test("then the question set as nextQuestionSequence should not be suppressed", () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "ZZZTest duplicate question 1?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 2,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 3,
+ },
+ ],
+ },
+ {
+ questionSequence: 2,
+ questionText: "Test question 2?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ {
+ questionSequence: 3,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "345",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ suppressThisQuestion: true,
+ },
+ ],
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+ const nextQuestionAfterDuplicate = wrapper.vm.questionsData[1].questions[2];
+
+ // Assert
+ expect(nextQuestionAfterDuplicate.suppressThisQuestion).not.toBeTruthy();
+ });
+
+ test("then the nextQuestionSequence should be updated and the original value saved", () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test question 3?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test question 1?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 2,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 3,
+ },
+ ],
+ },
+ {
+ questionSequence: 2,
+ questionText: "Test question 2?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ {
+ questionSequence: 3,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 4,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 5,
+ },
+ ],
+ },
+ {
+ questionSequence: 4,
+ questionText: "Test question 4?",
+ answers: [
+ {
+ answerResult: "567",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "678",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ {
+ questionSequence: 5,
+ questionText: "Test question 5?",
+ answers: [
+ {
+ answerResult: "789",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "890",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+ const duplicatedQuestion = wrapper.vm.questionsData[1].questions[2];
+ const duplicatedQuestionAnswer = duplicatedQuestion.answers.filter((a) => {
+ return a.selected;
+ });
+ const answerToTest = wrapper.vm.questionsData[1].questions[0].answers.filter(
+ (a) => {
+ return a.originalNextQuestionSequence;
+ }
+ );
+
+ // Assert
+ expect(answerToTest[0].originalNextQuestionSequence).toEqual(
+ duplicatedQuestion.questionSequence
+ );
+ expect(answerToTest[0].nextQuestionSequence).toEqual(
+ duplicatedQuestionAnswer[0].nextQuestionSequence
+ );
+ });
+
+ describe("and the duplicate was the first question for that part", () => {
+ test("then any questions up to the nextQuestionSequence value should be marked as suppressed", () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test duplicate question 1?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test duplicate question 1?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 2,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 3,
+ },
+ ],
+ },
+ {
+ questionSequence: 2,
+ questionText: "Test question 2?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ {
+ questionSequence: 3,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "345",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ // Act
+ wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+
+ // Assert
+ expect(
+ wrapper.vm.questionsData[1].questions[0].suppressThisQuestion
+ ).toBeTruthy();
+ expect(
+ wrapper.vm.questionsData[1].questions[1].suppressThisQuestion
+ ).toBeTruthy();
+ expect(
+ wrapper.vm.questionsData[1].questions[2].suppressThisQuestion
+ ).toBeFalsy();
+ });
+ });
+ });
+
+ describe("and the duplicate has an answerResult", () => {
+ test("then any questions in the same glass piece that lead to the duplicate should be modified to just provide the duplicate's answerResult", async () => {
+ // Arrange
+ const answerNo = {
+ answerResult: "456",
+ answeredQuestions: [
+ {
+ questionText: "Test question 3?",
+ selectedAnswerText: "No",
+ questionNum: 1,
+ },
+ ],
+ index: 0,
+ };
+ const { wrapper } = setupMocks({});
+
+ wrapper.vm.questionsData = [
+ {
+ glassLocation: "Windshield",
+ glassName: "Single",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ glassLocation: "Driver",
+ glassName: "Front",
+ questions: [
+ {
+ questionSequence: 1,
+ questionText: "Test question 1?",
+ answers: [
+ {
+ answerResult: "",
+ answerText: "Yes",
+ nextQuestionSequence: 2,
+ },
+ {
+ answerResult: "",
+ answerText: "No",
+ nextQuestionSequence: 3,
+ },
+ ],
+ },
+ {
+ questionSequence: 2,
+ questionText: "Test question 2?",
+ answers: [
+ {
+ answerResult: "123",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "234",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ {
+ questionSequence: 3,
+ questionText: "Test question 3?",
+ answers: [
+ {
+ answerResult: "345",
+ answerText: "Yes",
+ nextQuestionSequence: null,
+ },
+ {
+ answerResult: "456",
+ answerText: "No",
+ nextQuestionSequence: null,
+ },
+ ],
+ },
+ ],
+ },
+ ];
+
+ // Act
+ await wrapper.vm.handleAnswerUpdates(answerNo, "", wrapper.vm);
+
+ const questionsToTest = wrapper.vm.questionsData[1].questions;
+ const answerLeadingToDuplicate = questionsToTest[0].answers[1];
+ const duplicateQuestion = questionsToTest[2];
+ const answerInDuplicateQuestion = duplicateQuestion.answers.filter((a) => {
+ return a.selected;
+ });
+
+ // Assert
+ expect(answerLeadingToDuplicate.answerResult).toEqual(
+ answerInDuplicateQuestion[0].answerResult
+ );
+ expect(answerLeadingToDuplicate.originalAnswerResult).toBeFalsy();
+ expect(answerLeadingToDuplicate.nextQuestionSequence).toEqual(null);
+ expect(answerLeadingToDuplicate.originalNextQuestionSequence).toEqual(
+ duplicateQuestion.questionSequence
+ );
+ });
+ });
+ });
+ });
+
describe("navigateForward", () => {
describe("should go to parts-questions", () => {
test("single glass location has part question => go to parts-questions", async () => {