# Plan de tests — backend_envie2e

Ce document liste les fichiers/axes de tests recommandés pour le backend, en indiquant pour chacun si le test doit être unitaire (Unit) ou d'intégration (Integration), avec une courte description et priorité.

Notes générales
- Tests unitaires: rapides, mockent les dépendances externes (prisma, services, requêtes HTTP externes). Ciblent validateurs Zod, fonctions métier et handlers route exportés.
- Tests d'intégration: appellent les endpoints HTTP réels (via fetch) contre un serveur démarré ou utilisent Next handler importé dans le même process pour permettre instrumentation. Ciblent le contrat API (status, JSON, auth).
- Priorité: High / Medium / Low

Structure proposée
- Dossier principal tests: `tests/unit` pour unitaires, `tests/integration` pour intégration.
- Scripts utiles:
  - `npm run test:unit` — exécute les tests unitaires (à ajouter)
  - `npm run test:integration` — déjà présent
  - `npm run test:coverage` — coverage global (déjà présent)

-------------------------

## 1. Auth
Files: `src/app/api/auth/login/route.ts`, `src/app/api/auth/me/route.ts`, `src/app/api/auth/logout/route.ts`, `src/lib/jwt.ts`, `src/lib/auth.ts`
- Integration: `tests/integration/auth.spec.ts` (exists)
  - Description: test login flow (POST /api/auth/login), cookie vs bearer, `GET /api/auth/me`, `POST /api/auth/logout`.
  - Priority: High
- Unit: `tests/unit/lib/auth.spec.ts`
  - Description: mock DB/prisma to validate `verifyPassword`, `hashPassword` utilities and JWT generation/verification (`jwt.ts`).
  - Priority: High

## 2. Employés
Files: `src/app/api/employes/route.ts`, any `services/employes.*`, `src/validators/employes.ts`
- Integration: `tests/integration/employes.spec.ts`
  - Description: GET list (auth), GET by id, POST create (validation), PUT update, DELETE. Test auth-protected behaviors (401) and happy path (200/201).
  - Priority: High
- Unit (route handler): `tests/unit/routes/employes.route.spec.ts`
  - Description: call exported handlers directly (new Request(...)) mocking `prisma` or services; assert status/json shape.
  - Priority: Medium
- Unit (validator): `tests/unit/validators/employes.spec.ts`
  - Description: tests pour `employeSchema` (valid/invalid payloads, messages d'erreur).
  - Priority: High

## 3. Contrats
Files: `src/app/api/contrats/route.ts`, `src/app/api/contrats/[id]/route.ts`, `src/validators/contrats.ts`, services
- Integration: `tests/integration/contrats.spec.ts`
  - Description: CRUD tests, listing contracts for an employee, nested avenants endpoints.
  - Priority: High
- Unit (validator/service): `tests/unit/validators/contrats.spec.ts`, `tests/unit/services/contrats.spec.ts`
  - Description: validate parsing, business rules (dates, overlaps), service layer logic.
  - Priority: High

## 4. Avenants
Files: `src/app/api/avenants/route.ts`, `src/app/api/contrats/[id]/avenants/route.ts`, `src/validators/avenants.ts`
- Integration: `tests/integration/avenants.spec.ts` (nested contract/avenant flows)
  - Priority: Medium
- Unit: `tests/unit/validators/avenants.spec.ts`, `tests/unit/services/avenants.spec.ts`
  - Priority: Medium

## 5. Absences
Files: `src/app/api/absences/route.ts`, `src/app/api/absences/[id]/route.ts`, `src/validators/absences.ts`
- Integration: `tests/integration/absences.spec.ts`
  - Description: create absence (validation), list, update, delete, special rules (jours fériés?).
  - Priority: Medium
- Unit (validator/service): `tests/unit/validators/absences.spec.ts`, `tests/unit/services/absences.spec.ts`
  - Priority: Medium

## 6. Visites médicales
Files: `src/app/api/visites-medicales/route.ts`
- Integration: `tests/integration/visites-medicales.spec.ts`
  - Priority: Medium
- Unit (service/validator): `tests/unit/services/visites.service.spec.ts`
  - Priority: Low

## 7. Diplômes
Files: `src/app/api/diplomes/route.ts`, validators
- Integration: `tests/integration/diplomes.spec.ts`
  - Priority: Low
- Unit (validator): `tests/unit/validators/diplomes.spec.ts`
  - Priority: Low

## 8. Disciplinaires / Sanctions
Files: `src/app/api/disciplinaires/route.ts`, `src/app/api/.../sanctions/route.ts`
- Integration: `tests/integration/disciplinaires.spec.ts`
  - Priority: Low
- Unit: `tests/unit/services/disciplinaires.spec.ts`
  - Priority: Low

## 9. Lookups / Static lists (postes, secteurs, types...)
Files: `src/app/api/*/route.ts` under lookups
- Integration: `tests/integration/lookups.spec.ts`
  - Description: ensure endpoints return expected arrays, caching behavior if any.
  - Priority: Low
- Unit: not usually necessary unless there is logic.

## 10. Health / utils / middleware
Files: `src/app/api/health/route.ts`, `middleware.ts`
- Integration: `tests/integration/health.spec.ts` (simple GET)
  - Priority: High
- Unit (middleware): `tests/unit/middleware.spec.ts`
  - Description: call exported middleware functions, mock Request/Response, assert CORS headers and logging behaviour (mock console).
  - Priority: Medium

## 11. Validators (global)
Files: `src/validators/*.ts` (pagination, auth, employes, contrats...)
- Unit: `tests/unit/validators/*.spec.ts`
  - Description: exhaustive valid/invalid payloads, error messages, edge cases.
  - Priority: High

## 12. Services / database layer
Files: `src/services/*.ts`, `src/lib/prisma.ts`
- Unit: `tests/unit/services/*.spec.ts`
  - Description: mock `prisma` calls and test business logic, error mapping, transactions.
  - Priority: High for complex services; Medium for simple wrappers.

## 13. Generated Prisma client
- Generally **skip** unit tests for generated client code. Mock calls to `prisma` instead.

-------------------------

### Exemples de mapping fichier -> tests (concret)
- `src/app/api/auth/login/route.ts`
  - Integration: `tests/integration/auth.spec.ts` (login flow)
  - Unit: `tests/unit/routes/auth.login.spec.ts` (appel direct du handler avec mocks)
- `src/app/api/employes/route.ts`
  - Integration: `tests/integration/employes.spec.ts`
  - Unit: `tests/unit/routes/employes.route.spec.ts` + `tests/unit/validators/employes.spec.ts`
- `src/app/api/contrats/route.ts` and `/contrats/[id]/route.ts`
  - Integration: `tests/integration/contrats.spec.ts`
  - Unit: `tests/unit/services/contrats.spec.ts`, `tests/unit/validators/contrats.spec.ts`

-------------------------

### Convention et helpers recommandés
- Utiliser `vitest` pour unitaires et intégration.
- Utilities test helpers (to create mocked `Request`, `NextResponse`, and a `mockPrisma` fixture) placés dans `tests/_utils/*`.
- Exemple minimal `tests/_utils/mockRequest.ts`:
```ts
export function mockRequest(url = 'http://localhost') {
  return new Request(url);
}
```

### Commandes utiles
```bash
# unit tests
npm run test:unit
# integration
npm run test:integration
# coverage (combinaison ou coverage d'un set)
npm run test:coverage
```

(je peux ajouter les scripts `test:unit` et `test:all` dans package.json si tu veux)

-------------------------

Si tu veux, j'ajoute maintenant:
- A: création des fichiers-template `tests/unit/...` et `tests/integration/...` pour `employes` et `contrats` (squelettes prêts à remplir)
- B: ajout des scripts `test:unit` et `test:all` dans `package.json`

Dis-moi si je crée directement les squelettes (A) et/ou les scripts (B).