299 lines
10 KiB
JavaScript
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
|
|
});
|
|
});
|
|
});
|
|
});
|