Files
LogiFlow/scripts/bench/cases/socle.ts
T
LogiFlowandClaude Opus 5.5 600627c632 feat(rust) : serveur réécrit en Rust, Node retiré ; Calendrier en tête du menu (#571)
- Serveur Rust (server-rs/, axum + sqlx) : les 148 adresses de l'API,
  l'interface, les migrations de démarrage et les tâches de fond ; même
  comportement que Node (banc : 2027 cas, 0 écart hors écarts déclarés
  USERS-02, RAPPRO-21, R4, R5).
- Node retiré : server/, dépendances serveur, image Docker sans Node
  (51 Mo), docker-compose à un seul service applicatif.
- R4 : écritures d'un autre site refusées (Sec-Fetch-Site / Origin).
- R5 : « aujourd'hui » et sauvegarde automatique à l'heure de Paris.
- R6 : mainteneur dans .github/CODEOWNERS.
- Menu latéral : Accueil puis Calendrier en tête.
- Plan et état : docs/PLAN-MIGRATION-RUST.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ke2qyS8rgacP3ap5iezDbM
2026-10-15 20:31:14 +02:00

67 lines
2.2 KiB
TypeScript

import type { ReadCase, WriteScenario } from "../types";
export const reads: ReadCase[] = [
{ module: "socle", path: "/", accounts: ["anonyme"] },
{ module: "socle", path: "/deliveries", accounts: ["anonyme", "manager"] },
{ module: "socle", path: "/favicon.ico", accounts: ["anonyme"] },
{ module: "socle", path: "/api/health", accounts: ["anonyme"] },
{ module: "socle", path: "/api/adresse-inconnue", accounts: ["anonyme", "admin"] },
{ module: "auth", path: "/api/user" },
{ module: "auth", path: "/api/default-credentials-check" },
];
export const writes: WriteScenario[] = [
{
module: "auth",
name: "déconnexion puis lecture de l'utilisateur",
steps: [
{ method: "POST", path: "/api/logout" },
{ method: "GET", path: "/api/user" },
],
tables: [],
},
{
module: "auth",
name: "connexion refusée",
accounts: ["anonyme"],
steps: [
{ method: "POST", path: "/api/login", body: { username: "manager", password: "mauvais" } },
{ method: "POST", path: "/api/login", body: { username: "inconnu", password: "x" } },
{ method: "POST", path: "/api/login", body: {} },
],
tables: ["users"],
},
// ---------- Requêtes d'écriture d'un autre site (décision R4) ----------
{
module: "socle",
name: "écriture d'un autre site refusée",
accounts: ["manager"],
steps: [
{
method: "POST",
path: "/api/logout",
headers: { origin: "https://site-tiers.example", "sec-fetch-site": "cross-site" },
},
{ method: "POST", path: "/api/logout", headers: { origin: "null" } },
// La session est toujours ouverte côté Rust
{ method: "GET", path: "/api/user" },
],
tables: [],
deviation: {
fields: ["status", "headers", "body"],
reason:
"R4 : une requête /api qui n'est pas une lecture est refusée (403) quand le navigateur indique qu'elle vient d'un autre site (Sec-Fetch-Site, sinon Origin)",
},
},
{
module: "socle",
name: "écriture du même site acceptée",
accounts: ["manager"],
steps: [
{ method: "POST", path: "/api/logout", headers: { "sec-fetch-site": "same-origin" } },
{ method: "GET", path: "/api/user" },
],
tables: [],
},
];