batchCooking/apps/api/test
Nicolas 13d92f8fa8
Some checks failed
CI / lint (push) Successful in 2m1s
CI / build (push) Successful in 1m21s
CI / intent-service-test (push) Successful in 4m25s
CI / e2e (push) Successful in 6m12s
CI / test (push) Failing after 3h13m30s
feat(admin): pousse le monitoring en WebSocket au lieu du polling client
Le tableau de bord /admin/monitoring fonctionnait en polling côté client
(15 s) déclenchant une sonde active côté serveur à chaque appel — deux
onglets admin ouverts = deux séries de sondes redondantes.

Inverse le mécanisme : le serveur sonde une fois par minute et pousse le
résultat aux clients connectés via WebSocket (socket.io, room
"monitoring"). Décisions actées avec l'utilisateur : l'endpoint REST
disparaît entièrement (plus de repli, 100% WebSocket) ; la sonde tourne
en continu dès le démarrage, sans lien avec la présence d'un admin
connecté (le plus simple des deux, coût des sondes négligeable).

Backend :
- ExpressServer (packages/express-tools) expose désormais son
  http.Server sous-jacent (créé explicitement, plus dans .listen()) —
  socket.io s'attache au serveur HTTP lui-même, pas à Express/un port.
- MonitoringBroadcastService (nouveau) : sonde immédiate au démarrage
  puis toutes les 60 s (réutilise getMonitoring() tel quel, aucune
  duplication), diffuse à la room "monitoring", rejoue le dernier
  résultat en cache à tout nouvel admin qui rejoint (pas d'attente
  jusqu'à une minute pour un onglet fraîchement ouvert).
- requireAdminSocket (nouveau) : middleware de handshake socket.io,
  équivalent WebSocket de requireAdmin — même vérification (cookie +
  JWT + tokenVersion), factorisée dans resolveAdminFromToken
  (require-admin.ts) puisque les deux ne diffèrent que par où ils lisent
  le cookie brut (un handshake socket.io ne passe pas par
  cookie-parser).
- GET /admin/api/monitoring supprimée (route + service de test associés).
- server.ts (pas app.ts) instancie socket.io — les tests supertest n'ont
  pas besoin d'un serveur WebSocket.

Frontend :
- MonitoringSocketClient (nouveau, api/monitoring-socket.ts) : wrapper
  socket.io-client, interface MonitoringSocketClientLike volontairement
  petite et injectable dans MonitoringPage (prop optionnelle) pour rester
  testable sans serveur réel.
- MonitoringPage : data et connectionState séparés — une coupure de
  connexion après un premier chargement affiche un badge "reconnexion en
  cours" sans jamais effacer le dernier board connu (repose sur la
  reconnexion automatique de socket.io-client). Seul le tout premier
  chargement affiche l'état plein-écran chargement/erreur.
- adminApiClient.getMonitoring() supprimée (plus utilisée).

Tests :
- Nouveau apps/api/test/admin-monitoring-socket.test.ts : vraie connexion
  socket.io-client contre un serveur réel démarré dans le test (port 0),
  authentification avec un admin seedé + cookie signé, vérifie la
  réception de monitoring:update et le rejet sans cookie admin valide.
  Les tests heartbeat de l'ancien admin-monitoring.test.ts (route
  /internal/tech-steps/heartbeat, sans rapport avec ce changement) sont
  déplacés vers tech-step-worker.routes.test.ts, leur router d'origine.
- Nouveau cypress/component/MonitoringPage.cy.tsx : monte la page avec un
  client factice, vérifie rendu des cartes, badge de reconnexion sans
  perte du board, états chargement/erreur — pas de test e2e Gherkin
  contre un vrai WebSocket (aucun mécanisme pour ça dans ce repo,
  fragile ; le test Mocha ci-dessus est la preuve bout-en-bout serveur).
- apps/web/cypress/e2e/admin-monitoring.cy.ts (REST) supprimé, remplacé
  par le test composant ci-dessus.

Vérification : pnpm lint clean, build complet du monorepo clean, suite
Cypress e2e complète 27/27 fichiers (114/114 tests), suite composant
complète 5/5 fichiers (54/54 tests, dont les 4 nouveaux). Suite Mocha
apps/api non exécutable cette session (Postgres/Docker injoignable,
comme pour #33) — le nouveau test socket.io n'a donc pas pu être
run-vérifié, seulement relu attentivement et vérifié par le lint.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-05 14:44:39 +02:00
..
internal feat(admin): pousse le monitoring en WebSocket au lieu du polling client 2026-09-05 14:44:39 +02:00
recipe feat(recipes): permet de corriger la température d'un tech-step 2026-09-04 23:53:14 +02:00
recipe-matching feat(cooking-session): regroupement d'étapes sensible aux métadonnées d'action 2026-09-03 12:05:44 +02:00
recipe-sources fix(recipes): corrige la liste vide de sevenFiftyGAdapter quand le filtre est vide (#68) 2026-08-22 20:08:28 +02:00
sources fix(recipes): active le matching ingredients/unites pour les sources en francais (#72) 2026-08-22 20:34:32 +02:00
admin-auth.test.ts fix(admin): isole l'API admin sous /admin/api pour éviter la collision avec les pages front 2026-09-05 13:48:07 +02:00
admin-catalog-normalize.test.ts feat(recipes): permet d'ajouter des ingredients hors-catalogue 2026-08-28 23:36:42 +02:00
admin-catalog.test.ts fix(admin): isole l'API admin sous /admin/api pour éviter la collision avec les pages front 2026-09-05 13:48:07 +02:00
admin-metrics.test.ts fix(admin): isole l'API admin sous /admin/api pour éviter la collision avec les pages front 2026-09-05 13:48:07 +02:00
admin-monitoring-socket.test.ts feat(admin): pousse le monitoring en WebSocket au lieu du polling client 2026-09-05 14:44:39 +02:00
admin-tech-steps.test.ts fix(admin): isole l'API admin sous /admin/api pour éviter la collision avec les pages front 2026-09-05 13:48:07 +02:00
auth.test.ts Tests API: couverture Mocha + Cucumber pour le foyer et la suppression de compte (step 4/8) 2026-08-17 10:40:23 +02:00
cooking-session.test.ts feat(cooking-session): regroupement d'étapes sensible aux métadonnées d'action 2026-09-03 12:05:44 +02:00
health.test.ts Scaffold generic pnpm monorepo (api + web + shared) (#1) 2026-08-16 10:55:13 +02:00
house.test.ts fix: corrige les bugs ouverts du repo (import TheMealDB, sidebar mobile) + doc (#59) 2026-08-21 12:16:22 +02:00
logger.service.test.ts fix: corrige les bugs ouverts du repo (import TheMealDB, sidebar mobile) + doc (#59) 2026-08-21 12:16:22 +02:00
planning.test.ts feat(recipes): ajouter le nombre de portions couvertes par une recette 2026-08-19 21:44:01 +02:00
preferences.test.ts API: module preferences — GET/PATCH /preferences (step 2/4) 2026-08-17 15:55:45 +02:00
profile.test.ts refactor(catalog): authoring 100% anglais — uid camelCase, plus de français dans le code 2026-08-19 20:40:55 +02:00
recipe-placeholder.test.ts feat(recipes): permet d'ajouter des ingredients hors-catalogue 2026-08-28 23:36:42 +02:00
recipe.test.ts fix(recipes): persiste les métadonnées de clause des tech-steps à l'édition 2026-09-04 09:08:15 +02:00
reference.test.ts fix(tests): corrige 3 suites Mocha DB revelees par leur 1er run sur main 2026-08-29 12:00:43 +02:00
shopping-list.test.ts feat(shopping-list): liste de courses agrégée depuis le planning (#73) 2026-08-22 22:45:06 +02:00