mirror of
https://github.com/ets-cfuhrman-pfe/EvalueTonSavoir.git
synced 2025-08-11 21:23:54 -04:00
new tests for ReturnButton
This commit is contained in:
parent
032325be66
commit
5cdf4abd92
1 changed files with 131 additions and 29 deletions
|
|
@ -1,46 +1,148 @@
|
||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { render, screen, fireEvent } from '@testing-library/react';
|
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
||||||
import '@testing-library/jest-dom';
|
import '@testing-library/jest-dom';
|
||||||
import ReturnButton from 'src/components/ReturnButton/ReturnButton';
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import ReturnButton from '../../../components/ReturnButton/ReturnButton.tsx'; // Adjust path as needed
|
||||||
|
import ApiService from '../../../services/ApiService';
|
||||||
|
|
||||||
|
// Mock react-router-dom's useNavigate
|
||||||
jest.mock('react-router-dom', () => ({
|
jest.mock('react-router-dom', () => ({
|
||||||
...jest.requireActual('react-router-dom'),
|
...jest.requireActual('react-router-dom'),
|
||||||
useNavigate: jest.fn()
|
useNavigate: jest.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
describe('ReturnButton', () => {
|
// Mock ApiService
|
||||||
test('navigates back when askConfirm is false', () => {
|
jest.mock('../../../services/ApiService', () => ({
|
||||||
const navigateMock = jest.fn();
|
createQuiz: jest.fn(),
|
||||||
(useNavigate as jest.Mock).mockReturnValue(navigateMock);
|
updateQuiz: jest.fn(),
|
||||||
render(<ReturnButton askConfirm={false} />);
|
}));
|
||||||
fireEvent.click(screen.getByText('Retour'));
|
|
||||||
expect(navigateMock).toHaveBeenCalledWith(-1);
|
describe('ReturnButton Component', () => {
|
||||||
|
const mockNavigate = jest.fn();
|
||||||
|
const mockOnReturn = jest.fn();
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
// Reset mocks before each test
|
||||||
|
jest.clearAllMocks();
|
||||||
|
(useNavigate as jest.Mock).mockReturnValue(mockNavigate);
|
||||||
|
(ApiService.createQuiz as jest.Mock).mockResolvedValue({});
|
||||||
|
(ApiService.updateQuiz as jest.Mock).mockResolvedValue({});
|
||||||
});
|
});
|
||||||
|
|
||||||
test('shows confirmation modal when askConfirm is true', () => {
|
test('renders the button with "Retour" text when not saving', () => {
|
||||||
render(<ReturnButton askConfirm={true} />);
|
render(<ReturnButton />);
|
||||||
fireEvent.click(screen.getByText('Retour'));
|
expect(screen.getByText('Retour')).toBeInTheDocument();
|
||||||
const confirmButton = screen.getByTestId('modal-confirm-button');
|
|
||||||
expect(confirmButton).toBeInTheDocument();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/*test('navigates back after confirming in the modal', () => {
|
test('renders "Enregistrement..." text when saving', async () => {
|
||||||
const navigateMock = jest.fn();
|
render(<ReturnButton quizTitle="Test Quiz" quizFolder="folder1" isNewQuiz />);
|
||||||
(useNavigate as jest.Mock).mockReturnValue(navigateMock);
|
|
||||||
render(<ReturnButton askConfirm={true} />);
|
|
||||||
fireEvent.click(screen.getByText('Retour'));
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
const confirmButton = screen.getByTestId('modal-confirm-button');
|
expect(screen.getByText('Enregistrement...')).toBeInTheDocument();
|
||||||
fireEvent.click(confirmButton);
|
await waitFor(() => expect(screen.queryByText('Enregistrement...')).not.toBeInTheDocument());
|
||||||
expect(navigateMock).toHaveBeenCalledWith(-1);
|
});
|
||||||
});*/
|
|
||||||
|
|
||||||
test('cancels navigation when canceling in the modal', () => {
|
test('navigates to /teacher/dashboard by default when clicked', async () => {
|
||||||
const navigateMock = jest.fn();
|
render(<ReturnButton />);
|
||||||
(useNavigate as jest.Mock).mockReturnValue(navigateMock);
|
|
||||||
render(<ReturnButton askConfirm={true} />);
|
|
||||||
fireEvent.click(screen.getByText('Retour'));
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
fireEvent.click(screen.getByText('Annuler'));
|
await waitFor(() => expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard'));
|
||||||
expect(navigateMock).not.toHaveBeenCalled();
|
});
|
||||||
|
|
||||||
|
test('calls onReturn prop instead of navigating when provided', async () => {
|
||||||
|
render(<ReturnButton onReturn={mockOnReturn} />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(mockOnReturn).toHaveBeenCalled();
|
||||||
|
expect(mockNavigate).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('disables button while saving', async () => {
|
||||||
|
render(<ReturnButton quizTitle="Test Quiz" quizFolder="folder1" isNewQuiz />);
|
||||||
|
const button = screen.getByText('Retour');
|
||||||
|
fireEvent.click(button);
|
||||||
|
expect(button).toBeDisabled();
|
||||||
|
await waitFor(() => expect(button).not.toBeDisabled());
|
||||||
|
});
|
||||||
|
|
||||||
|
test('calls ApiService.createQuiz for new quiz with valid data', async () => {
|
||||||
|
const props = {
|
||||||
|
quizTitle: 'New Quiz',
|
||||||
|
quizContent: ['Q1', 'Q2'],
|
||||||
|
quizFolder: 'folder1',
|
||||||
|
isNewQuiz: true,
|
||||||
|
};
|
||||||
|
render(<ReturnButton {...props} />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.createQuiz).toHaveBeenCalledWith('New Quiz', ['Q1', 'Q2'], 'folder1');
|
||||||
|
expect(ApiService.updateQuiz).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('calls ApiService.updateQuiz for existing quiz with valid data', async () => {
|
||||||
|
const props = {
|
||||||
|
quizId: 'quiz123',
|
||||||
|
quizTitle: 'Updated Quiz',
|
||||||
|
quizContent: ['Q1', 'Q2'],
|
||||||
|
isNewQuiz: false,
|
||||||
|
};
|
||||||
|
render(<ReturnButton {...props} />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.updateQuiz).toHaveBeenCalledWith('quiz123', 'Updated Quiz', ['Q1', 'Q2']);
|
||||||
|
expect(ApiService.createQuiz).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('does not call ApiService if quizTitle is missing for new quiz', async () => {
|
||||||
|
render(<ReturnButton quizFolder="folder1" isNewQuiz />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.createQuiz).not.toHaveBeenCalled();
|
||||||
|
expect(ApiService.updateQuiz).not.toHaveBeenCalled();
|
||||||
|
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('does not call ApiService if quizId and quizTitle are missing for update', async () => {
|
||||||
|
render(<ReturnButton />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.createQuiz).not.toHaveBeenCalled();
|
||||||
|
expect(ApiService.updateQuiz).not.toHaveBeenCalled();
|
||||||
|
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('navigates even if ApiService.createQuiz fails', async () => {
|
||||||
|
(ApiService.createQuiz as jest.Mock).mockRejectedValue(new Error('Save failed'));
|
||||||
|
const props = {
|
||||||
|
quizTitle: 'New Quiz',
|
||||||
|
quizContent: ['Q1'],
|
||||||
|
quizFolder: 'folder1',
|
||||||
|
isNewQuiz: true,
|
||||||
|
};
|
||||||
|
render(<ReturnButton {...props} />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.createQuiz).toHaveBeenCalled();
|
||||||
|
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('navigates even if ApiService.updateQuiz fails', async () => {
|
||||||
|
(ApiService.updateQuiz as jest.Mock).mockRejectedValue(new Error('Update failed'));
|
||||||
|
const props = {
|
||||||
|
quizId: 'quiz123',
|
||||||
|
quizTitle: 'Updated Quiz',
|
||||||
|
quizContent: ['Q1'],
|
||||||
|
isNewQuiz: false,
|
||||||
|
};
|
||||||
|
render(<ReturnButton {...props} />);
|
||||||
|
fireEvent.click(screen.getByText('Retour'));
|
||||||
|
await waitFor(() => {
|
||||||
|
expect(ApiService.updateQuiz).toHaveBeenCalled();
|
||||||
|
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue