#!/usr/bin/env bash # Teste l'application web (app/, ADR 0009), dans l'image ustagammon/web : # - tests unitaires du domaine (faux moteur) et partie complète sur le vrai # moteur WebAssembly (node:test) ; # - scénarios de docs/scenarios/ exécutés par Cucumber sur le domaine branché # au vrai moteur (ADR 0008) ; # - règles d'architecture (dependency-cruiser, ADR 0007), et preuve qu'une # violation volontaire de chaque règle est bien détectée. # # Lance `make engine-wasm` et `make web` (sans effet si tout est à jour). set -euo pipefail cd "$(dirname "$0")/.." image="${WEB_IMAGE:?lancer via make test}" # Lancé depuis `make test` : repartir d'un make indépendant du make parent. unset MAKEFLAGS MFLAGS MAKELEVEL make engine-wasm >/dev/null make web >/dev/null errors=0 report() { echo " $1" errors=$((errors + 1)) } # Lance une commande des outils web, dépôt monté sous /src ; le premier # argument est le dossier de travail, relatif au dépôt. web() { local dir="$1" shift docker run --rm --user "$(id -u):$(id -g)" -v "$PWD:/src" -w "/src/$dir" "$image" "$@" } web . node --test --test-reporter=dot 'build/web/tests/**/*.test.js' \ || report "tests unitaires ou partie complète en échec (voir ci-dessus)" web . cucumber-js --format summary --import 'build/web/tests/steps/*.js' docs/scenarios/*.feature \ || report "scénarios en échec (voir ci-dessus)" web app depcruise --config .dependency-cruiser.cjs src tests \ || report "règles d'architecture non respectées (voir ci-dessus)" # Violations volontaires, dans un dossier jetable sous build/ : chaque règle # doit être signalée par dependency-cruiser. fixture=build/web-violations rm -rf "$fixture" mkdir -p "$fixture/src/domain" "$fixture/src/engine" "$fixture/src/ui" cp app/tsconfig.json "$fixture/" echo 'import { engine } from "../engine/adapter.js"; export const a = engine;' >"$fixture/src/domain/uses-engine.ts" echo 'import { readFileSync } from "node:fs"; export const b = readFileSync;' >"$fixture/src/domain/uses-node.ts" echo 'export const engine = 1;' >"$fixture/src/engine/adapter.ts" echo 'import { engine } from "../engine/adapter.js"; export const c = engine;' >"$fixture/src/ui/uses-engine.ts" echo 'import { e } from "./loop-b.js"; export const d = e;' >"$fixture/src/ui/loop-a.ts" echo 'import { d } from "./loop-a.js"; export const e = d;' >"$fixture/src/ui/loop-b.ts" output="$(web "$fixture" depcruise --config /src/app/.dependency-cruiser.cjs src 2>&1)" \ && report "dependency-cruiser accepte des violations volontaires" for rule in domain-is-pure ui-does-not-call-engine no-circular; do grep -q "$rule" <<<"$output" || report "violation volontaire de $rule non détectée" done grep -q 'uses-node' <<<"$output" || report "import de Node dans le domaine non détecté" rm -rf "$fixture" [ "$errors" -eq 0 ]