EvalueTonSavoir/client/src/__tests__/components/QuestionsDisplay/TrueFalseQuestionDisplay/TrueFalseQuestionDisplay.test.tsx

135 lines
4.7 KiB
TypeScript
Raw Normal View History

// TrueFalseQuestion.test.tsx
import React, { useState } from 'react';
import { render, fireEvent, screen, act } from '@testing-library/react';
2024-03-29 20:08:34 -04:00
import '@testing-library/jest-dom';
import { MemoryRouter } from 'react-router-dom';
2025-01-25 02:02:18 -05:00
import TrueFalseQuestionDisplay from 'src/components/QuestionsDisplay/TrueFalseQuestionDisplay/TrueFalseQuestionDisplay';
import { parse, TrueFalseQuestion } from 'gift-pegjs';
2025-03-08 11:05:25 -05:00
import { AnswerType } from 'src/pages/Student/JoinRoom/JoinRoom';
2024-03-29 20:08:34 -04:00
describe('TrueFalseQuestion Component', () => {
const mockHandleSubmitAnswer = jest.fn();
2025-01-25 02:02:18 -05:00
const sampleStem = 'Sample True False Question';
const trueFalseQuestion =
2025-01-25 02:02:18 -05:00
parse(`${sampleStem}{T}`)[0] as TrueFalseQuestion;
2024-03-29 20:08:34 -04:00
const TestWrapper = ({ showAnswer }: { showAnswer: boolean }) => {
const [showAnswerState, setShowAnswerState] = useState(showAnswer);
2025-03-08 11:05:25 -05:00
const handleOnSubmitAnswer = (answer: AnswerType) => {
mockHandleSubmitAnswer(answer);
setShowAnswerState(true);
};
return (
<MemoryRouter>
<TrueFalseQuestionDisplay
question={trueFalseQuestion}
handleOnSubmitAnswer={handleOnSubmitAnswer}
showAnswer={showAnswerState}
/>
</MemoryRouter>
);
2024-03-29 20:08:34 -04:00
};
beforeEach(() => {
render(<TestWrapper showAnswer={false} />);
2024-03-29 20:08:34 -04:00
});
it('renders correctly', () => {
expect(screen.getByText(sampleStem)).toBeInTheDocument();
2024-03-29 20:08:34 -04:00
expect(screen.getByText('Vrai')).toBeInTheDocument();
expect(screen.getByText('Faux')).toBeInTheDocument();
expect(screen.getByText('Répondre')).toBeInTheDocument();
});
it('Submit button should be disabled if no option is selected', () => {
const submitButton = screen.getByText('Répondre');
expect(submitButton).toBeDisabled();
});
it('not submit answer if no option is selected', () => {
const submitButton = screen.getByText('Répondre');
act(() => {
fireEvent.click(submitButton);
});
2024-03-29 20:08:34 -04:00
expect(mockHandleSubmitAnswer).not.toHaveBeenCalled();
});
it('submits answer correctly for True', () => {
const trueButton = screen.getByText('Vrai');
const submitButton = screen.getByText('Répondre');
act(() => {
fireEvent.click(trueButton);
});
2024-03-29 20:08:34 -04:00
act(() => {
fireEvent.click(submitButton);
});
2024-03-29 20:08:34 -04:00
expect(mockHandleSubmitAnswer).toHaveBeenCalledWith(true);
});
it('submits answer correctly for False', () => {
const falseButton = screen.getByText('Faux');
const submitButton = screen.getByText('Répondre');
act(() => {
fireEvent.click(falseButton);
});
act(() => {
fireEvent.click(submitButton);
});
2024-03-29 20:08:34 -04:00
expect(mockHandleSubmitAnswer).toHaveBeenCalledWith(false);
});
it('should show ✅ next to the correct answer and ❌ next to the wrong answers when showAnswer is true', async () => {
const choiceButton = screen.getByText('Vrai').closest('button');
if (!choiceButton) throw new Error('T button not found');
// Click on choiceButton
act(() => {
fireEvent.click(choiceButton);
});
const button = screen.getByText("Répondre");
act(() => {
fireEvent.click(button);
});
// Wait for the DOM to update
const correctAnswer = screen.getByText("Vrai").closest('button');
expect(correctAnswer).toBeInTheDocument();
expect(correctAnswer?.textContent).toContain('✅');
const wrongAnswer1 = screen.getByText("Faux").closest('button');
expect(wrongAnswer1).toBeInTheDocument();
expect(wrongAnswer1?.textContent).toContain('❌');
});
it('should not show ✅ or ❌ when repondre button is not clicked', async () => {
const choiceButton = screen.getByText('Vrai').closest('button');
if (!choiceButton) throw new Error('Choice button not found');
// Click on choiceButton
act(() => {
fireEvent.click(choiceButton);
});
// Check for correct answer
const correctAnswer = screen.getByText("Vrai").closest('button');
expect(correctAnswer).toBeInTheDocument();
expect(correctAnswer?.textContent).not.toContain('✅');
// Check for wrong answers
const wrongAnswer1 = screen.getByText("Faux");
expect(wrongAnswer1).toBeInTheDocument();
expect(wrongAnswer1?.textContent).not.toContain('❌');
});
});