Files
siop2/apps/web/src/lib/lieux.test.ts
pr-daaif 9778629827 feat(r1.2): écrans web du référentiel — 7 écrans fidèles à maquette-r1
- Sites : liste + carte Leaflet/OSM réelle (pins maquette, positions
  PostGIS), création en modale avec position posée au clic sur la carte
- Fiche site : arbre site→zones, appareils rattachés, ajout de zone
- Ascenseurs : table dense, filtres site/statut, strie rouge à l'arrêt ;
  fiche appareil (organes ± ajout/retrait, statut, QR réel) ; création
  identité → rattachement → organes ; étiquette A6 imprimable (objet
  papier, window.print n'imprime qu'elle)
- Personnes & équipes : invitation → lien d'activation affiché à copier
  (pas d'email en R1, décision explicite), renvoi de lien, équipes ;
  page /activation (choix du mot de passe, connexion directe)
- Catégories : ajout, renommage inline, désactivation
- navigation et actions pilotées par la matrice (usePermissions) —
  l'API re-vérifie chaque requête
- e2e Playwright : recette R1 officielle rejouée intégralement (site →
  zone → appareil+organe → étiquette → invitation → activation) +
  parcours « la matrice pilote l'UI » ; purge idempotente en globalSetup
- alias Vite @siop/shared → source TS (exports nommés CJS ↯ workspace lié)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:06:45 +01:00

30 lines
1003 B
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { describe, expect, it } from 'vitest';
import { construireArbre } from './lieux';
import type { LocationDto } from '@siop/shared';
const loc = (over: Partial<LocationDto>): LocationDto => ({
id: crypto.randomUUID(),
name: 'X',
parentId: null,
address: null,
city: null,
guardianName: null,
guardianPhone: null,
latitude: null,
longitude: null,
assetCount: 0,
...over,
});
describe('construireArbre (liste plate → site → zones)', () => {
it('rattache les zones à leur site et trie par nombre dappareils', () => {
const atlas = loc({ name: 'Tour Atlas', assetCount: 4 });
const manar = loc({ name: 'Al Manar', assetCount: 1 });
const hall = loc({ name: 'Hall', parentId: atlas.id, assetCount: 2 });
const arbre = construireArbre([manar, atlas, hall]);
expect(arbre.map((s) => s.name)).toEqual(['Tour Atlas', 'Al Manar']);
expect(arbre[0]!.zones.map((z) => z.name)).toEqual(['Hall']);
expect(arbre[1]!.zones).toHaveLength(0);
});
});