Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 22 additions & 3 deletions .agents/skills/cpn-dev-workflow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
35 changes: 35 additions & 0 deletions .agents/skills/cpn-dev-workflow/evals/evals.json
Original file line number Diff line number Diff line change
@@ -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": []
}
]
}
12 changes: 10 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
32 changes: 24 additions & 8 deletions playwright/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading