Files
Johan LEROY 4c72fbbb69 docs: fonde les vues d'architecture du monorepo
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 depuis 49f4697, 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.
2026-09-15 11:56:18 +02:00

2.7 KiB

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)

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.

Gabarit — tester un service avec appel HTTP

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

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