DigitalConsumer.ISS/src/digital-components/question-chain/question-chain.spec.js
2026-01-27 17:09:04 -05:00

299 lines
10 KiB
JavaScript

import { shallowMount } from '@vue/test-utils';
import questionChain from '@/digital-components/question-chain/question-chain.vue';
import { getMountOptions } from '@/helpers/unit-test-helper.js';
import { nextTick } from 'vue';
/** @ignore */
function setupMocks({
questionDataProp = [
{
questionSequence: 1,
questionText: 'Does only your center sliding piece need to be replaced?',
answers: [
{
answerResult: 'DB09410',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: 'DB10840',
answerText: 'No',
nextQuestionSequence: null
}
]
}
]
}) {
const mountOptions = getMountOptions({});
mountOptions.propsData = {
questionData: questionDataProp
};
mountOptions.attachTo = document.body;
const wrapper = shallowMount(questionChain, mountOptions);
return { wrapper };
}
describe('Question Chain component', () => {
describe('on create...', () => {
test('Should populate questions data array', async () => {
// Arrange
const { wrapper } = setupMocks({});
const expectedFirstQuestionAnswer = {
answerResult: 'DB09410',
buttonLabel: 'Yes',
nextQuestionSequence: null,
questionSequence: 1,
questionType: 'answer',
value: '1|answer|DB09410|Yes'
};
// Act
await nextTick();
// Assert
expect(wrapper.vm.questions[0].answers[0]).toMatchObject(expectedFirstQuestionAnswer);
});
test('Should not include suppressed questions on questions data array', async () => {
// Arrange
const { wrapper } = setupMocks({});
await wrapper.setData({
questionData: [
{
questionSequence: 1,
questionText: 'Question here?',
answers: [
{
answerResult: 'DB09410',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: 'DB10840',
answerText: 'No',
nextQuestionSequence: null
}
],
suppressThisQuestion: true
}
]
});
// Act
await nextTick();
// Assert
expect(wrapper.vm.questions[0]).toBeFalsy();
});
});
describe('method handleAnswer...', () => {
test('should run getQuestionChainAnswerIfComplete', () => {
// Arrange
const { wrapper } = setupMocks({});
const testQuestion = {};
const testReturnedAnswer = 'aReturnedAnswer';
wrapper.vm.getQuestionChainAnswerIfComplete = jest.fn();
// Act
wrapper.vm.handleAnswer(testQuestion, testReturnedAnswer);
// Assert
expect(wrapper.vm.getQuestionChainAnswerIfComplete).toBeCalled();
});
test("should emit update:modelValue if returnedAnswer contains 'answer'", () => {
// Arrange
const { wrapper } = setupMocks({});
const testQuestion = {};
const testReturnedAnswer = '1|answer|DB10840|No';
// Act
wrapper.vm.handleAnswer(testQuestion, testReturnedAnswer);
// Assert
expect(wrapper.emitted()).toHaveProperty('update:modelValue');
expect(wrapper.emitted()['update:modelValue'][0][0]).toMatchObject({
answerResult: 'DB10840'
});
});
test('should NOT emit update:modelValue if no returnedAnswer', () => {
// Arrange
const { wrapper } = setupMocks({});
const testQuestion = {};
// Act
wrapper.vm.handleAnswer(testQuestion);
// Assert
expect(wrapper.emitted()).not.toHaveProperty('update:modelValue');
});
test("should NOT emit update:modelValue if returnedAnswer contains 'nextQuestion'", () => {
// Arrange
const { wrapper } = setupMocks({});
const testQuestion = {};
const testReturnedAnswer = '1|nextQuestion|DB10840|No';
// Act
wrapper.vm.handleAnswer(testQuestion, testReturnedAnswer);
// Assert
expect(wrapper.emitted()).not.toHaveProperty('update:modelValue');
});
});
describe('method getQuestionChainAnswerIfComplete...', () => {
test('should return false if no returned answer', () => {
// Arrange
const { wrapper } = setupMocks({});
// Act
const result = wrapper.vm.getQuestionChainAnswerIfComplete();
// Assert
expect(result).toBeFalsy();
});
test('should set the answerSelected to match the answered one', async () => {
// Arrange
const { wrapper } = setupMocks({});
const testReturnedAnswer = '1|answer|DB10840|No';
await wrapper.setData({
questionData: [
{
questionSequence: 1,
questionText: 'Question here?',
answers: [
{
answerResult: 'DB09410',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: 'DB10840',
answerText: 'No',
nextQuestionSequence: null
}
]
}
]
});
// Act
wrapper.vm.getQuestionChainAnswerIfComplete(testReturnedAnswer);
// Assert
expect(wrapper.vm.questions[0].answerSelected).toBe('1|answer|DB10840|No');
});
test('should remove answers of questions after the answered one', async () => {
// Arrange
const { wrapper } = setupMocks({});
const testReturnedAnswer = '1|answer|DB10840|No';
await wrapper.setData({
questionData: [
{
questionSequence: 1,
questionText: 'Question here?',
answers: [
{
answerResult: 'DB09410',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: 'DB10840',
answerText: 'No',
nextQuestionSequence: null
}
]
},
{
questionSequence: 2,
questionText: 'Question 2',
answers: [
{
answerResult: '2-yes',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: '2-no',
answerText: 'No',
nextQuestionSequence: null
}
],
answerSelected: 'previously selected answer'
}
]
});
// Act
wrapper.vm.getQuestionChainAnswerIfComplete(testReturnedAnswer);
// Assert
expect(wrapper.vm.questions[1].answerSelected).toBeUndefined();
});
test('should return false if returnedAnswer is a nextQuestion (not a final answer)', async () => {
// Arrange
const { wrapper } = setupMocks({});
const testReturnedAnswer = '1|nextQuestion|DB10840|No';
// Act
const result = wrapper.vm.getQuestionChainAnswerIfComplete(testReturnedAnswer);
// Assert
expect(result).toBeFalsy();
});
test('should return answer object if returnedAnswer is a final matching answer', async () => {
// Arrange
const { wrapper } = setupMocks({});
const testReturnedAnswer = '1|answer|DB10840|No';
await wrapper.setData({
questions: [
{
questionSequence: 1,
questionText: 'Question here?',
answers: [
{
answerResult: 'DB09410',
answerText: 'Yes',
nextQuestionSequence: null
},
{
answerResult: 'DB10840',
answerText: 'No',
nextQuestionSequence: null
}
]
}
],
index: 0
});
// Act
const result = wrapper.vm.getQuestionChainAnswerIfComplete(testReturnedAnswer);
// Assert
expect(result).toMatchObject({
answerResult: 'DB10840',
answeredQuestions: [
{ questionNum: 1, questionText: 'Question here?', selectedAnswerText: 'No' },
{
questionNum: 1,
questionText: 'Does only your center sliding piece need to be replaced?',
selectedAnswerText: 'No'
}
],
index: 0
});
});
});
});