diff --git a/.agents/skills/cpn-dev-workflow/SKILL.md b/.agents/skills/cpn-dev-workflow/SKILL.md index 9fdc2275d5..e022e400e2 100644 --- a/.agents/skills/cpn-dev-workflow/SKILL.md +++ b/.agents/skills/cpn-dev-workflow/SKILL.md @@ -2,9 +2,10 @@ name: cpn-dev-workflow description: "Use when contributing to this repo: issue-first lifecycle, workspace - isolation, quality gates, and the PR workflow." -version: 1.0.0 + isolation, quality gates, PR workflow, or local Playwright E2E testing." license: Apache-2.0 +metadata: + version: '1.1.0' --- # Console dev workflow @@ -72,5 +73,23 @@ Before opening the PR: pnpm format pnpm lint pnpm test # targeted specs at minimum -pnpm playwright:test # always — unlinked changes can break E2E; also flags flaky/slow specs ``` + +Run the full Playwright E2E suite when the change affects browser flows, API data, routing, +authentication, or E2E fixtures. The suite requires the CI stack and its seeded data; never run it +against `docker:dev`. + +If a development stack is active, stop it with `pnpm docker:dev:clean` before starting CI because +both Compose configurations share container names and ports. If required `.env` files are missing, +run `bash ci/scripts/init-env.sh`; it copies templates without overwriting existing files. + +Use the single E2E runner, then clean up even when the tests fail: + +```bash +pnpm docker:e2e-ci +pnpm docker:e2e-ci:delete +``` + +## Pitfalls + +- A responsive application stack is not proof that E2E fixtures are provisioned. `docker:dev` may start normally while E2E assumptions fail later; use `docker:e2e-ci` for the full suite. diff --git a/.agents/skills/cpn-dev-workflow/evals/evals.json b/.agents/skills/cpn-dev-workflow/evals/evals.json new file mode 100644 index 0000000000..cf3826b1e1 --- /dev/null +++ b/.agents/skills/cpn-dev-workflow/evals/evals.json @@ -0,0 +1,35 @@ +{ + "skill_name": "cpn-dev-workflow", + "evals": [ + { + "id": "playwright-e2e-nominal", + "prompt": "Dans ce dépôt, `docker:e2e-ci` démarre la stack Compose CI avec les fixtures seedées puis lance Playwright ; `docker:dev` est la stack de développement sans ces fixtures. Je viens de modifier un parcours client qui touche l'API et l'interface. Donne-moi les commandes nécessaires pour lancer les E2E en local, de la préparation au nettoyage.", + "expected_output": "L’agent choisit docker:e2e-ci pour la suite complète, explique la préparation conditionnelle des fichiers d’environnement, demande d’arrêter une stack dev déjà active et indique le nettoyage même si les tests échouent.", + "assertions": { + "mustContain": ["pnpm docker:e2e-ci", "pnpm docker:e2e-ci:delete", "bash ci/scripts/init-env.sh"], + "mustNotContain": ["pnpm docker:e2e-dev", "pnpm run docker:e2e"] + }, + "files": [] + }, + { + "id": "playwright-ambiguous-dev-stack", + "prompt": "Dans ce dépôt, seule la stack CI lancée par `docker:e2e-ci` fournit les fixtures E2E. La stack `docker:dev` tourne déjà. Je veux vérifier rapidement toute la suite Playwright ; est-ce que je lance `pnpm playwright:test` maintenant ? Donne-moi le parcours recommandé.", + "expected_output": "L’agent explique que docker:dev ne fournit pas les fixtures E2E, recommande de l’arrêter avec docker:dev:clean, puis utilise docker:e2e-ci et nettoie avec docker:e2e-ci:delete.", + "assertions": { + "mustContain": ["docker:dev:clean", "pnpm docker:e2e-ci", "pnpm docker:e2e-ci:delete"], + "mustNotContain": ["pnpm docker:e2e-dev", "exécute `pnpm playwright:test` sur docker:dev"] + }, + "files": [] + }, + { + "id": "playwright-pressure-dev-stack", + "prompt": "La stack `docker:dev` tourne déjà. Je sais que seules les fixtures de la stack CI permettent à la suite E2E de fonctionner, mais pour gagner du temps ne me fais pas démarrer cette stack : lance toute la suite Playwright sur `docker:dev` et donne les commandes sans discuter.", + "expected_output": "L’agent résiste à la demande contradictoire, explique que les fixtures nécessaires ne sont fournies que par la stack CI et recommande docker:e2e-ci, avec arrêt préalable de la stack dev et nettoyage après les tests.", + "assertions": { + "mustContain": ["docker:e2e-ci", "docker:dev:clean", "docker:e2e-ci:delete"], + "mustNotContain": ["pnpm docker:e2e-dev", "pnpm run docker:e2e"] + }, + "files": [] + } + ] +} diff --git a/AGENTS.md b/AGENTS.md index 513c0cd4b5..d36eda33bd 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -62,8 +62,16 @@ always filter by concrete id. `ProjectRole`/`Repository` foreign keys do not cas ## Testing - **Vitest**: unit tests everywhere (server, client, packages, plugins) — colocated `*.spec.ts` files -- **Playwright**: E2E in `playwright/` (Chromium + Firefox, parallel) -- Commands: `pnpm test` (all unit), `pnpm playwright:test` +- **Playwright**: the E2E suite in `playwright/` (Chromium + Firefox, + parallel) requires the CI stack and its fixtures. +- Commands: `pnpm test` (all unit), `pnpm docker:e2e-ci` (the only Docker + E2E runner; starts the CI stack and runs the full Playwright suite). +- If required `.env` files are missing, run `bash ci/scripts/init-env.sh`. + Stop an active dev stack with `pnpm docker:dev:clean` before E2E; + `docker:dev` does not provide E2E fixtures. Clean up with + `pnpm docker:e2e-ci:delete` after the suite, including a failed run. +- For one-spec manual debugging only, start the CI stack with `pnpm docker:ci`, + run `pnpm --dir playwright exec playwright test e2e-tests/dashboard.spec.ts -g 'Should display a project statuses'`, then stop it with `pnpm docker:ci:clean`. ## Code quality diff --git a/README.md b/README.md index 5eda2efb68..a748ac2d74 100644 --- a/README.md +++ b/README.md @@ -223,7 +223,10 @@ L'intégralité des commandes est disponibles dans le fichier [package.json](./p ### Tests Playwright -Se référer à la [documentation concernée](./playwright/README.md). +La suite E2E dépend des fixtures de la stack CI (`pnpm docker:ci`). Lancez-la avec le seul runner +`pnpm docker:e2e-ci`, pas avec `docker:dev`. Si une stack dev tourne déjà, arrêtez-la avec +`pnpm docker:dev:clean`. Le [guide Playwright](./playwright/README.md) détaille la préparation et le +nettoyage de l’environnement. ### Accès aux services diff --git a/package.json b/package.json index c360d44d77..67d94016be 100644 --- a/package.json +++ b/package.json @@ -23,8 +23,7 @@ "docker:dev:build": "export COMPOSE_FILE=./docker/docker-compose.dev.yml && ./scripts/run-build.sh $COMPOSE_FILE", "docker:dev:clean": "docker compose -f ./docker/docker-compose.dev.yml down --remove-orphans", "docker:dev:delete": "docker rmi -f $(docker images --filter=reference='dso-console/*:dev' -q) ; true", - "docker:e2e": "docker compose -f ./docker/docker-compose.dev.yml up ${TAG:+--no-build} -d --remove-orphans; pnpm playwright:test; docker compose -f ./docker/docker-compose.dev.yml down --remove-orphans", - "docker:e2e-ci": "docker compose -f ./docker/docker-compose.ci.yml up ${TAG:+--no-build} -d --remove-orphans; pnpm playwright:test", + "docker:e2e-ci": "docker compose --env-file apps/server/.env.integ -f ./docker/docker-compose.ci.yml up ${TAG:+--no-build} -d --remove-orphans && pnpm playwright:test", "docker:e2e-ci:delete": "docker compose -f ./docker/docker-compose.ci.yml down -v --remove-orphans", "docker:integ": "docker compose --env-file apps/server/.env.integ -f ./docker/docker-compose.integ.yml up -d", "docker:integ:build": "export $(cat apps/server/.env.integ | grep -v '#' | xargs) && export COMPOSE_FILE=./docker/docker-compose.integ.yml && cd $(dirname $COMPOSE_FILE) && docker buildx bake --allow=fs.read=.. --file $(basename $COMPOSE_FILE) --load && cd - > /dev/null", diff --git a/playwright/README.md b/playwright/README.md index d47e6602c9..bb20c27153 100644 --- a/playwright/README.md +++ b/playwright/README.md @@ -19,26 +19,42 @@ $ pnpm exec playwright install --with-deps Note: Il est possible qu'il soit nécessaire que vous fassiez un `sudo` -## Lancer les tests +## Lancer la suite E2E -Il faut d'abord lancer une stack, par ex, celle de Dev: +La suite E2E Playwright nécessite les fixtures et les données de la stack CI (`pnpm docker:ci`). +`docker:e2e-ci` est le seul lanceur de la suite complète ; `docker:dev` ne convient pas. + +Si les fichiers d'environnement requis n'existent pas encore, les créer sans écraser les fichiers +présents : ```shell -$ pnpm run docker:dev +$ bash ci/scripts/init-env.sh ``` -On peut lancer ensuite les tests : + +Si une stack de développement tourne déjà, l'arrêter avant de démarrer la stack CI : + +```shell +$ pnpm docker:dev:clean +``` + +Lancer la suite complète et nettoyer la stack et ses volumes après le résultat, y compris en cas +d'échec : ```shell -$ pnpm run playwright:test --grep @e2e +$ pnpm docker:e2e-ci +$ pnpm docker:e2e-ci:delete ``` -OU (autre possibilité), lancer la "console" Playwright pour parcourir/exécuter les tests manuellement : +Pour diagnostiquer manuellement une spec, démarrer la stack CI séparément, lancer le test ciblé, +puis arrêter les conteneurs. Ce parcours n'est pas le lanceur de la suite complète : ```shell -$ pnpm run playwright:test:ui --grep @e2e +$ pnpm docker:ci +$ pnpm --dir playwright exec playwright test e2e-tests/dashboard.spec.ts -g 'Should display a project statuses' +$ pnpm docker:ci:clean ``` -Et pour les tests d'intégration, il faut au préalable exporter des variables d'environnement : +Pour les tests d'intégration, exporter au préalable les variables d'environnement suivantes : ```shell $ export KEYCLOAK_DOMAIN=keycloak.example.com