test for already existing quizzes trying to be imported

This commit is contained in:
Philippe 2025-03-24 16:56:46 -04:00
parent 95f914ce3e
commit a26ffa2880
2 changed files with 96 additions and 7 deletions

View file

@ -0,0 +1,95 @@
import React from 'react';
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { MemoryRouter, Route, Routes, useParams } from 'react-router-dom';
import Share from '../../../../pages/Teacher/Share/Share.tsx';
import ApiService from '../../../../services/ApiService';
import '@testing-library/jest-dom';
// Mock the ApiService and react-router-dom
jest.mock('../../../../services/ApiService');
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useParams: jest.fn(),
useNavigate: jest.fn(),
}));
describe('Share Component', () => {
const mockNavigate = jest.fn();
const mockUseParams = useParams as jest.Mock;
const mockApiService = ApiService as jest.Mocked<typeof ApiService>;
beforeEach(() => {
jest.clearAllMocks();
mockUseParams.mockReturnValue({ id: 'quiz123' });
require('react-router-dom').useNavigate.mockReturnValue(mockNavigate);
});
const renderComponent = (initialEntries = ['/share/quiz123']) => {
return render(
<MemoryRouter initialEntries={initialEntries}>
<Routes>
<Route path="/share/:id" element={<Share />} />
<Route path="/teacher/dashboard" element={<div>Dashboard</div>} />
<Route path="/login" element={<div>Login</div>} />
</Routes>
</MemoryRouter>
);
};
it('should show loading state initially', () => {
mockApiService.getAllQuizIds.mockResolvedValue([]);
mockApiService.getUserFolders.mockResolvedValue([]);
mockApiService.getSharedQuiz.mockResolvedValue('Test Quiz');
renderComponent();
expect(screen.getByText('Chargement...')).toBeInTheDocument();
});
it('should redirect to login if not authenticated', async () => {
mockApiService.isLoggedIn.mockReturnValue(false);
renderComponent();
await waitFor(() => {
expect(mockNavigate).toHaveBeenCalledWith('/login');
});
});
it('should show "quiz already exists" message when quiz exists', async () => {
mockApiService.isLoggedIn.mockReturnValue(true);
mockApiService.getAllQuizIds.mockResolvedValue(['quiz123']);
renderComponent();
await waitFor(() => {
expect(screen.getByText('Quiz déjà existant')).toBeInTheDocument();
expect(screen.getByText(/Le quiz que vous essayez d'importer existe déjà sur votre compte/i)).toBeInTheDocument();
expect(screen.getByText('Retour au tableau de bord')).toBeInTheDocument();
});
});
it('should navigate to dashboard when clicking return button in "quiz exists" view', async () => {
mockApiService.isLoggedIn.mockReturnValue(true);
mockApiService.getAllQuizIds.mockResolvedValue(['quiz123']);
renderComponent();
await waitFor(() => {
fireEvent.click(screen.getByText('Retour au tableau de bord'));
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
});
});
it('should show error when no folders exist', async () => {
mockApiService.isLoggedIn.mockReturnValue(true);
mockApiService.getAllQuizIds.mockResolvedValue([]);
mockApiService.getUserFolders.mockResolvedValue([]);
renderComponent();
await waitFor(() => {
expect(mockNavigate).toHaveBeenCalledWith('/teacher/dashboard');
});
});
});

View file

@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom'; import { useParams, useNavigate } from 'react-router-dom';
import { FolderType } from '../../../Types/FolderType'; import { FolderType } from '../../../Types/FolderType';
import './share.css'; import './share.css';
import { Button, NativeSelect, Typography, Box, Divider } from '@mui/material'; import { Button, NativeSelect, Typography, Box } from '@mui/material';
import ReturnButton from 'src/components/ReturnButton/ReturnButton'; import ReturnButton from 'src/components/ReturnButton/ReturnButton';
import ApiService from '../../../services/ApiService'; import ApiService from '../../../services/ApiService';
@ -20,14 +20,12 @@ const Share: React.FC = () => {
const fetchData = async () => { const fetchData = async () => {
try { try {
if (!id) { if (!id) {
window.alert(`Une erreur est survenue.\n Le quiz n'a pas été trouvé\nVeuillez réessayer plus tard`)
console.error('Quiz not found for id:', id); console.error('Quiz not found for id:', id);
navigate('/teacher/dashboard'); navigate('/teacher/dashboard');
return; return;
} }
if (!ApiService.isLoggedIn()) { if (!ApiService.isLoggedIn()) {
window.alert(`Vous n'êtes pas connecté.\nVeuillez vous connecter et revenir à ce lien`);
navigate("/login"); navigate("/login");
return; return;
} }
@ -43,7 +41,6 @@ const Share: React.FC = () => {
const userFolders = await ApiService.getUserFolders(); const userFolders = await ApiService.getUserFolders();
if (userFolders.length == 0) { if (userFolders.length == 0) {
window.alert(`Vous n'avez aucun dossier.\nVeuillez en créer un et revenir à ce lien`)
navigate('/teacher/dashboard'); navigate('/teacher/dashboard');
return; return;
} }
@ -53,7 +50,6 @@ const Share: React.FC = () => {
const title = await ApiService.getSharedQuiz(id); const title = await ApiService.getSharedQuiz(id);
if (!title) { if (!title) {
window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`)
console.error('Quiz not found for id:', id); console.error('Quiz not found for id:', id);
navigate('/teacher/dashboard'); navigate('/teacher/dashboard');
return; return;
@ -83,7 +79,6 @@ const Share: React.FC = () => {
} }
if (!id) { if (!id) {
window.alert(`Une erreur est survenue.\n Le quiz n'a pas été trouvé\nVeuillez réessayer plus tard`)
console.error('Quiz not found for id:', id); console.error('Quiz not found for id:', id);
navigate('/teacher/dashboard'); navigate('/teacher/dashboard');
return; return;
@ -93,7 +88,6 @@ const Share: React.FC = () => {
navigate('/teacher/dashboard'); navigate('/teacher/dashboard');
} catch (error) { } catch (error) {
window.alert(`Une erreur est survenue.\n Veuillez réessayer plus tard`)
console.log(error) console.log(error)
} }
}; };