@instructure/quiz-interactions
Version:
A React UI component Library for quiz interaction types.
109 lines (101 loc) • 3.57 kB
JavaScript
import {vi} from 'vitest'
import React from 'react'
import {render} from '@testing-library/react'
import MatchingResult from '../index'
vi.mock('@instructure/quiz-results-feedback', () => ({
FeedbackWrapper: ({status, userResponse, correctAnswer, ...rest}) => (
<div data-testid="feedback-wrapper" data-status={status}>
{userResponse && <span>{userResponse}</span>}
{correctAnswer && <span>{correctAnswer}</span>}
</div>
),
NoResponse: ({status, ...rest}) => <div data-testid="no-response" data-status={status} />,
}))
describe('MatchingResult component', () => {
const defaultProps = {
itemBody: 'Match the name of the celestial body on the left with its correct classification.',
interactionData: {
questions: [
{id: 'quuid1', itemBody: 'Mars'},
{id: 'quuid2', itemBody: 'Phobos'},
{id: 'quuid3', itemBody: 'Alpha Centauri'},
{id: 'quuid4', itemBody: 'Andromeda'},
],
answers: ['Planet', 'Moon', 'Nebula', 'Star', 'Galaxy'],
},
scoredData: {
correct: false,
value: [
{
id: 'quuid1',
userResponded: 'Planet',
resultScore: 1,
value: 'Planet',
},
{
id: 'quuid2',
userResponded: 'Moon',
resultScore: 1,
value: 'Moon',
},
{
id: 'quuid3',
userResponded: 'Nebula',
resultScore: 0,
value: 'Star',
},
{
id: 'quuid4',
userResponded: 'Star',
resultScore: 0,
value: 'Galaxy',
},
],
},
}
it('displays all questions', () => {
const {container} = render(<MatchingResult {...defaultProps} />)
const questions = Array.from(container.querySelectorAll('[data-testid="question"]')).map(
elem => elem.textContent,
)
const expected = defaultProps.interactionData.questions.map(q => q.itemBody)
expect(questions).toEqual(expected)
})
it('displays the right result statuses', () => {
const {container} = render(<MatchingResult {...defaultProps} />)
const wrappers = container.querySelectorAll('[data-testid="feedback-wrapper"]')
const statuses = Array.from(wrappers).map(wrapper => wrapper.getAttribute('data-status'))
expect(statuses).toEqual(['correct', 'correct', 'incorrect', 'incorrect'])
})
it('renders with missing correct responses', () => {
const {container} = render(
<MatchingResult
{...defaultProps}
scoredData={{
value: [
{id: 'quuid1', userResponded: 'Planet'},
{id: 'quuid2', userResponded: 'Moon'},
{id: 'quuid3', userResponded: 'Star'},
{id: 'quuid4', userResponded: 'Nebula'},
],
}}
/>,
)
const wrappers = container.querySelectorAll('[data-testid="feedback-wrapper"]')
const statuses = Array.from(wrappers).map(wrapper => wrapper.getAttribute('data-status'))
expect(statuses).toEqual(['unknown', 'unknown', 'unknown', 'unknown'])
})
it('renders with no scoring info', () => {
const {container} = render(
<MatchingResult
{...defaultProps}
scoredData={{
value: [{id: 'quuid1'}, {id: 'quuid2'}, {id: 'quuid3'}, {id: 'quuid4'}],
}}
/>,
)
const wrappers = container.querySelectorAll('[data-testid="no-response"]')
const statuses = Array.from(wrappers).map(wrapper => wrapper.getAttribute('data-status'))
expect(statuses).toEqual(['unknown', 'unknown', 'unknown', 'unknown'])
})
})