Cinq vues Mermaid dans docs/architecture (vue d'ensemble, infra, backend, frontend, donnees), plus leur index, les conventions de statut et la regle de maintenance en PR. Reprend les jalons J1-J4, disparus de dev lors de la reecriture du README (2670483) et restes seulement sur main : plus rien sur la branche de travail ne disait ce que le projet doit prouver. Fige les decisions du module Terraform k3s, qui ne vivaient jusqu'ici que dans des commentaires de code et des description de variables : version epinglee obligatoire, Traefik desactive, kubeconfig en 600/root, state local. Corrige trois affirmations devenues fausses : le frontend classe "a initialiser" alors que le squelette existe depuis49f4697, le port 4200 dit attendu par docker-compose.yml qui n'a aucun service frontend, et l'arborescence core/ prescrite par TESTING.md sans exister.
86 lines
2.7 KiB
Markdown
86 lines
2.7 KiB
Markdown
# Conventions de tests unitaires — Frontend
|
|
|
|
## Outil
|
|
Vitest (intégré nativement à Angular CLI, pas d'installation à faire).
|
|
|
|
## Où écrire les tests
|
|
Un fichier `*.spec.ts` à côté de chaque fichier testé (convention Angular CLI
|
|
par défaut, respectée automatiquement par `ng generate`).
|
|
|
|
## Structure attendue (Arrange / Act / Assert)
|
|
```typescript
|
|
it('devrait faire X quand Y', () => {
|
|
// Arrange : préparer les données et les mocks
|
|
const input = { valeur: 42 };
|
|
|
|
// Act : exécuter le code testé
|
|
const result = service.doSomething(input);
|
|
|
|
// Assert : vérifier le résultat
|
|
expect(result).toBe(true);
|
|
});
|
|
```
|
|
|
|
## Ce qui doit être testé en priorité
|
|
- Services (`core/services/`) : logique métier, gestion des erreurs
|
|
- Guards et interceptors (`core/guards/`, `core/interceptors/`) : chaque branche de décision
|
|
- Composants avec logique (formulaires, conditions d'affichage) — pas nécessaire pour
|
|
un composant 100% template, sans logique
|
|
|
|
`core/services/`, `core/guards/` et `core/interceptors/` n'existent pas encore : c'est
|
|
l'arborescence cible, décrite dans
|
|
[docs/architecture/30-frontend.md](../../docs/architecture/30-frontend.md).
|
|
|
|
## Gabarit — tester un service avec appel HTTP
|
|
```typescript
|
|
import { TestBed } from '@angular/core/testing';
|
|
import { provideHttpClient } from '@angular/common/http';
|
|
import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing';
|
|
import { MonService } from './mon.service';
|
|
|
|
describe('MonService', () => {
|
|
let service: MonService;
|
|
let httpMock: HttpTestingController;
|
|
|
|
beforeEach(() => {
|
|
TestBed.configureTestingModule({
|
|
providers: [MonService, provideHttpClient(), provideHttpClientTesting()],
|
|
});
|
|
service = TestBed.inject(MonService);
|
|
httpMock = TestBed.inject(HttpTestingController);
|
|
});
|
|
|
|
afterEach(() => httpMock.verify());
|
|
|
|
it('devrait récupérer les données', () => {
|
|
service.getData().subscribe();
|
|
const req = httpMock.expectOne('/api/v1/...');
|
|
expect(req.request.method).toBe('GET');
|
|
req.flush({ /* réponse simulée */ });
|
|
});
|
|
});
|
|
```
|
|
|
|
## Gabarit — tester un composant standalone
|
|
```typescript
|
|
import { TestBed } from '@angular/core/testing';
|
|
import { MonComposant } from './mon-composant';
|
|
|
|
describe('MonComposant', () => {
|
|
beforeEach(async () => {
|
|
await TestBed.configureTestingModule({
|
|
imports: [MonComposant],
|
|
}).compileComponents();
|
|
});
|
|
|
|
it('devrait se créer', () => {
|
|
const fixture = TestBed.createComponent(MonComposant);
|
|
expect(fixture.componentInstance).toBeTruthy();
|
|
});
|
|
});
|
|
```
|
|
|
|
## Lancer les tests
|
|
- Développement (mode watch) : `npm test`
|
|
- Rapport de couverture (CI) : `npm run test:ci -- --coverage`, puis ouvrir `coverage/index.html`
|