Source: App.test.js

import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import App from './App';
import axios from 'axios';

jest.mock('axios');

// 🔥 Mock de react-toastify
const mockToastSuccess = jest.fn();
const mockToastError = jest.fn();

jest.mock('react-toastify', () => ({
  toast: {
    success: (...args) => mockToastSuccess(...args),
    error: (...args) => mockToastError(...args),
  },
  ToastContainer: () => <div data-testid="toast-container" />
}));

/**
 * @function App
 */

describe('App - Architecture API Mockée', () => {

  beforeEach(() => {
    jest.clearAllMocks();
  });

  it('affiche la page d’accueil avec les utilisateurs mockés (GET 200)', async () => {

    axios.get.mockResolvedValue({
      data: { utilisateurs: [] }
    });

    render(<App />);

    await waitFor(() => {
      expect(screen.getByText(/Bienvenue sur votre annuaire/i)).toBeInTheDocument();
      expect(screen.getByText(/Aucun inscrit/i)).toBeInTheDocument();
    });

  });


  it('navigue vers la page inscription', async () => {

    axios.get.mockResolvedValue({ data: { utilisateurs: [] } });

    render(<App />);

    await userEvent.click(screen.getByRole('link', { name: /nouvelle inscription/i }));

    expect(screen.getByText(/Ajouter un nouvel utilisateur/i)).toBeInTheDocument();

  });


  it('POST 201 → inscription réussie + redirection', async () => {

    axios.get.mockResolvedValue({ data: { utilisateurs: [] } });

    axios.post.mockResolvedValue({
      data: { id: 11 }
    });

    render(<App />);

    await userEvent.click(screen.getByRole('link', { name: /nouvelle inscription/i }));

    await userEvent.type(screen.getByLabelText(/Prénom/i), 'Marie');
    await userEvent.type(screen.getByLabelText(/Nom de famille/i), 'Martin');
    await userEvent.type(screen.getByLabelText(/Date de naissance/i), '1990-01-01');
    await userEvent.type(screen.getByLabelText(/Email/i), 'marie@test.fr');
    await userEvent.type(screen.getByLabelText(/Ville/i), 'Angers');
    await userEvent.type(screen.getByLabelText(/Code postal/i), '49100');

    await userEvent.click(screen.getByRole('button', { name: /S'inscrire/i }));

    await waitFor(() => {
      expect(axios.post).toHaveBeenCalled();
      expect(mockToastSuccess).toHaveBeenCalledWith("Inscription réussie !");
    });

  });


  it('POST 400 → email déjà existant', async () => {

    axios.get.mockResolvedValue({ data: { utilisateurs: [] } });

    axios.post.mockRejectedValue({
      response: { status: 400 }
    });

    render(<App />);

    await userEvent.click(screen.getByRole('link', { name: /nouvelle inscription/i }));

    await userEvent.type(screen.getByLabelText(/Prénom/i), 'Marie');
    await userEvent.type(screen.getByLabelText(/Nom de famille/i), 'Martin');
    await userEvent.type(screen.getByLabelText(/Date de naissance/i), '1990-01-01');
    await userEvent.type(screen.getByLabelText(/Email/i), 'marie@test.fr');
    await userEvent.type(screen.getByLabelText(/Ville/i), 'Angers');
    await userEvent.type(screen.getByLabelText(/Code postal/i), '49100');

    await userEvent.click(screen.getByRole('button', { name: /S'inscrire/i }));

    await waitFor(() => {
      expect(axios.post).toHaveBeenCalled();
      expect(mockToastError).toHaveBeenCalledWith("Email déjà existant");
    });

  });


  it('POST 500 → crash serveur géré proprement', async () => {

    axios.get.mockResolvedValue({ data: { utilisateurs: [] } });

    axios.post.mockRejectedValue({
      response: { status: 500 }
    });

    render(<App />);

    await userEvent.click(screen.getByRole('link', { name: /nouvelle inscription/i }));

    await userEvent.type(screen.getByLabelText(/Prénom/i), 'Marie');
    await userEvent.type(screen.getByLabelText(/Nom de famille/i), 'Martin');
    await userEvent.type(screen.getByLabelText(/Date de naissance/i), '1990-01-01');
    await userEvent.type(screen.getByLabelText(/Email/i), 'marie@test.fr');
    await userEvent.type(screen.getByLabelText(/Ville/i), 'Angers');
    await userEvent.type(screen.getByLabelText(/Code postal/i), '49100');

    await userEvent.click(screen.getByRole('button', { name: /S'inscrire/i }));

    await waitFor(() => {
      expect(axios.post).toHaveBeenCalled();
      expect(mockToastError).toHaveBeenCalledWith("Erreur serveur. Veuillez réessayer plus tard.");
    });

  });

});