Contexte
Issue parent #3287.
Porter les 4 tests Cypress de non-régression repeq actuellement sur master vers la nouvelle stack Playwright V2, et ajouter un 5ᵉ scénario non-assujetti propre à V2. Ces 4 tests Cypress constituent la matrice de régression complète historique couvrant les combinaisons calculable × non-calculable pour les cadres dirigeants et les membres des instances dirigeantes, ainsi que les deux variantes de publication (avec / sans URL) :
packages/app/cypress/e2e/declaration_representative_1.cy.ts — cadres calculable (20.4 / 79.6) + membres calculable (30.2 / 69.8) + publication avec URL
packages/app/cypress/e2e/declaration_representative_2.cy.ts — cadres non calculable + membres calculable (62.56 / 37.44) + publication avec URL
packages/app/cypress/e2e/declaration_representative_3.cy.ts — cadres non calculable + membres non calculable (edge case : le motif unique MID devient un texte statique en V2 — cf. RGAA N°22)
packages/app/cypress/e2e/declaration_representative_4.cy.ts — cadres calculable (50 / 50) + membres non calculable + publication sans URL (pas de site internet)
Ce ticket garantit la non-régression fonctionnelle du parcours repeq après la refonte V2, tout en couvrant la nouvelle branche d'assujettissement (scénario 5). Les 4 tests Cypress master sont la référence canonique pour les libellés exacts, les valeurs de test et les motifs non-calculable : les re-copier tels quels (avec adaptation de la syntaxe Playwright et des URLs V2) garantit la continuité de couverture.
Adaptations V2 par rapport au parcours master
Le parcours V2 est plus court et intégré à mon-espace :
- Plus d'écran
assujetti (contrôle auto au démarrage du funnel — test via le scénario 5)
- Plus d'écran
commencer (SIREN / année sélection) — SIREN vient de la session ProConnect
- Plus d'écran
declarant ni entreprise (infos pro pré-remplies, supprimés)
- Plus d'écran
publication séparé — publication intégrée au récap étape 4
- Plus d'écran
validation séparé — récap + transmission fusionnés
- Entrée via le panneau latéral
mon-espace au lieu de la homepage publique
URLs V2 cibles :
/representation-equilibree/etape/1 — période de référence
/representation-equilibree/etape/2 — écarts cadres dirigeants
/representation-equilibree/etape/3 — écarts membres instances dirigeantes
/representation-equilibree/etape/4 — récap + publication + transmission
/representation-equilibree/transmise/[year] — page de succès
/representation-equilibree/non-assujetti — écran bloquant
Fichiers impactés
packages/app/src/e2e/representation-equilibree.e2e.ts — création : un seul fichier regroupant les 5 scénarios (4 portés + 1 nouveau)
packages/app/src/e2e/fixtures/repeq.ts — création si besoin : helpers pour seed les companies aux 4 configurations d'assujettissement (workforce, exercices consécutifs, SIREN) + helpers d'auth réutilisant le pattern auth.setup.ts
Fichiers sources master à lire pour le portage (via git show master:<path>)
packages/app/cypress/e2e/declaration_representative_1.cy.ts — scénario 1 de référence
packages/app/cypress/e2e/declaration_representative_2.cy.ts — scénario 2 de référence
packages/app/cypress/e2e/declaration_representative_3.cy.ts — scénario 3 de référence (edge case motif unique MID)
packages/app/cypress/e2e/declaration_representative_4.cy.ts — scénario 4 de référence (publication sans URL)
packages/app/cypress/support/commands.ts — helpers Cypress à adapter en équivalents Playwright : selectByLabel, clickRadio, checkUrl, loginWithKeycloak
Pattern de référence Playwright V2
packages/app/src/e2e/declaration.e2e.ts — pattern canonique V2 pour un parcours funnel complet
packages/app/src/e2e/auth.setup.ts — auth via session existante
packages/app/src/e2e/global-setup.ts — seed DB
packages/app/src/e2e/fixtures/ + packages/app/src/e2e/helpers/ — à étendre si nécessaire
Changement attendu
Écrire packages/app/src/e2e/representation-equilibree.e2e.ts contenant 5 scénarios (test(...)), chacun découpé en test.step(...) pour la lisibilité des logs. Sélecteurs stables uniquement (getByRole, getByLabel, getByText — jamais de CSS selector fragile).
Scénario 1 — Portage declaration_representative_1
Entreprise avec cadres calculable (20.4 % F / 79.6 % H) + membres calculable (30.2 % F / 69.8 % H) + publication avec URL (www.example.com/egalite).
- Entrée : visiter
/mon-espace/{siren} → cliquer la ligne "Représentation équilibrée" (panneau latéral ouvert, état A — non commencée) → cliquer "Déclarer"
- Assertion : URL =
/representation-equilibree/etape/1 (pas d'écran assujettissement intermédiaire)
- Étape 1 : saisir date fin période
2025-12-31 → cliquer "Continuer"
- Étape 2 : radio "calculable" → saisir 20.4 / 79.6 → vérifier l'annonce
aria-live des pourcentages calculés (RGAA N°37) → "Continuer"
- Étape 3 : radio "calculable" → saisir 30.2 / 69.8 → "Continuer"
- Étape 4 : saisir date de publication, radio "site web oui", URL
www.example.com/egalite → cliquer "Transmettre la déclaration"
- Transmission : assertion URL
/representation-equilibree/transmise/{year} + alert de succès + bouton "Télécharger le PDF" visible
- Retour : revenir
/mon-espace/{siren} → panneau "Représentation équilibrée" en état C (transmise) avec boutons "Modifier" + "Consulter"
Scénario 2 — Portage declaration_representative_2
Cadres non calculable + membres calculable (62.56 / 37.44) + publication avec URL.
- Entrée mon-espace → funnel étape 1 (date fin période)
- Étape 2 : radio "non calculable" + sélectionner motif (libellé repris tel quel du test master) → assertion : les champs F/H ne sont PAS affichés → "Continuer"
- Étape 3 : radio "calculable" → 62.56 / 37.44 → "Continuer"
- Étape 4 : publication avec URL → "Transmettre"
- Assertion transmission OK
Scénario 3 — Portage declaration_representative_3 (edge case)
Cadres non calculable + membres non calculable.
- Étape 2 : non calculable + motif (libellé master)
- Étape 3 : non calculable + texte statique affichant le motif unique MID (cf. fix RGAA N°22) → assertion : il n'y a PAS de dropdown / liste déroulante, juste un texte qui affiche le motif unique → "Continuer"
- Étape 4 : récap + transmission
- Assertion transmission OK
Scénario 4 — Portage declaration_representative_4 (publication sans URL)
Cadres calculable (50 / 50) + membres non calculable + publication sans URL.
- Étape 2 : calculable 50 / 50 → vérifier l'annonce
aria-live avec l'exact 50 % / 50 % (RGAA N°37)
- Étape 3 : non calculable
- Étape 4 : date de publication
2025-11-15, radio "site web NON" → assertion : aucun champ URL n'est affiché → "Transmettre"
- Assertion transmission OK
Scénario 5 — Nouveau (propre à V2) — Blocage non-assujetti
Scénario absent sur master : validation de la branche d'assujettissement V2.
- Setup : utilisateur rattaché à une company ne remplissant PAS les critères — soit
workforce < REPEQ_MIN_HEADCOUNT, soit < REPEQ_MIN_CONSECUTIVE_YEARS exercices consécutifs
- Action : visiter directement
/representation-equilibree/etape/1 (OU cliquer "Déclarer" depuis le panneau mon-espace)
- Assertions :
- redirect automatique vers
/representation-equilibree/non-assujetti
- message explicatif visible (seuils mentionnés)
- aucun bouton "Continuer" ni équivalent pour forcer la déclaration
- lien de retour vers
mon-espace fonctionnel (clic → URL /mon-espace/...)
Scénarios de test
Ce ticket couvre les scénarios PO de l'epic #3287 : S1, S2, S4, S5, S6, S7, S8, S9, S10, S11, S13, S14.
S14 est vérifié via les assertions aria-live sur les pourcentages calculés (scénarios 1 et 4).
Références visuelles
N/A — tests E2E, les assertions portent sur le comportement fonctionnel et l'accessibilité programmatique, pas sur le rendu pixel.
Critères d'acceptation
Note de dépendance : ce ticket dépend de tous les tickets UI de l'epic #3287 (#3292 à #3301). Commencer un skeleton en parallèle est possible, mais la finalisation requiert que les parcours complets soient implémentés. Les 4 tests Cypress master (declaration_representative_{1,2,3,4}.cy.ts) restent la référence canonique pour les libellés exacts, les valeurs de test et les motifs non-calculable — les re-copier tels quels (avec adaptation de la syntaxe Playwright et des URLs V2) garantit la continuité de couverture.
Contexte
Issue parent #3287.
Porter les 4 tests Cypress de non-régression repeq actuellement sur
mastervers la nouvelle stack Playwright V2, et ajouter un 5ᵉ scénario non-assujetti propre à V2. Ces 4 tests Cypress constituent la matrice de régression complète historique couvrant les combinaisons calculable × non-calculable pour les cadres dirigeants et les membres des instances dirigeantes, ainsi que les deux variantes de publication (avec / sans URL) :packages/app/cypress/e2e/declaration_representative_1.cy.ts— cadres calculable (20.4 / 79.6) + membres calculable (30.2 / 69.8) + publication avec URLpackages/app/cypress/e2e/declaration_representative_2.cy.ts— cadres non calculable + membres calculable (62.56 / 37.44) + publication avec URLpackages/app/cypress/e2e/declaration_representative_3.cy.ts— cadres non calculable + membres non calculable (edge case : le motif unique MID devient un texte statique en V2 — cf. RGAA N°22)packages/app/cypress/e2e/declaration_representative_4.cy.ts— cadres calculable (50 / 50) + membres non calculable + publication sans URL (pas de site internet)Ce ticket garantit la non-régression fonctionnelle du parcours repeq après la refonte V2, tout en couvrant la nouvelle branche d'assujettissement (scénario 5). Les 4 tests Cypress master sont la référence canonique pour les libellés exacts, les valeurs de test et les motifs non-calculable : les re-copier tels quels (avec adaptation de la syntaxe Playwright et des URLs V2) garantit la continuité de couverture.
Adaptations V2 par rapport au parcours master
Le parcours V2 est plus court et intégré à
mon-espace:assujetti(contrôle auto au démarrage du funnel — test via le scénario 5)commencer(SIREN / année sélection) — SIREN vient de la session ProConnectdeclarantnientreprise(infos pro pré-remplies, supprimés)publicationséparé — publication intégrée au récap étape 4validationséparé — récap + transmission fusionnésmon-espaceau lieu de la homepage publiqueURLs V2 cibles :
/representation-equilibree/etape/1— période de référence/representation-equilibree/etape/2— écarts cadres dirigeants/representation-equilibree/etape/3— écarts membres instances dirigeantes/representation-equilibree/etape/4— récap + publication + transmission/representation-equilibree/transmise/[year]— page de succès/representation-equilibree/non-assujetti— écran bloquantFichiers impactés
packages/app/src/e2e/representation-equilibree.e2e.ts— création : un seul fichier regroupant les 5 scénarios (4 portés + 1 nouveau)packages/app/src/e2e/fixtures/repeq.ts— création si besoin : helpers pour seed les companies aux 4 configurations d'assujettissement (workforce, exercices consécutifs, SIREN) + helpers d'auth réutilisant le patternauth.setup.tsFichiers sources master à lire pour le portage (via
git show master:<path>)packages/app/cypress/e2e/declaration_representative_1.cy.ts— scénario 1 de référencepackages/app/cypress/e2e/declaration_representative_2.cy.ts— scénario 2 de référencepackages/app/cypress/e2e/declaration_representative_3.cy.ts— scénario 3 de référence (edge case motif unique MID)packages/app/cypress/e2e/declaration_representative_4.cy.ts— scénario 4 de référence (publication sans URL)packages/app/cypress/support/commands.ts— helpers Cypress à adapter en équivalents Playwright :selectByLabel,clickRadio,checkUrl,loginWithKeycloakPattern de référence Playwright V2
packages/app/src/e2e/declaration.e2e.ts— pattern canonique V2 pour un parcours funnel completpackages/app/src/e2e/auth.setup.ts— auth via session existantepackages/app/src/e2e/global-setup.ts— seed DBpackages/app/src/e2e/fixtures/+packages/app/src/e2e/helpers/— à étendre si nécessaireChangement attendu
Écrire
packages/app/src/e2e/representation-equilibree.e2e.tscontenant 5 scénarios (test(...)), chacun découpé entest.step(...)pour la lisibilité des logs. Sélecteurs stables uniquement (getByRole,getByLabel,getByText— jamais de CSS selector fragile).Scénario 1 — Portage
declaration_representative_1Entreprise avec cadres calculable (20.4 % F / 79.6 % H) + membres calculable (30.2 % F / 69.8 % H) + publication avec URL (
www.example.com/egalite)./mon-espace/{siren}→ cliquer la ligne "Représentation équilibrée" (panneau latéral ouvert, état A — non commencée) → cliquer "Déclarer"/representation-equilibree/etape/1(pas d'écran assujettissement intermédiaire)2025-12-31→ cliquer "Continuer"aria-livedes pourcentages calculés (RGAA N°37) → "Continuer"www.example.com/egalite→ cliquer "Transmettre la déclaration"/representation-equilibree/transmise/{year}+ alert de succès + bouton "Télécharger le PDF" visible/mon-espace/{siren}→ panneau "Représentation équilibrée" en état C (transmise) avec boutons "Modifier" + "Consulter"Scénario 2 — Portage
declaration_representative_2Cadres non calculable + membres calculable (62.56 / 37.44) + publication avec URL.
Scénario 3 — Portage
declaration_representative_3(edge case)Cadres non calculable + membres non calculable.
Scénario 4 — Portage
declaration_representative_4(publication sans URL)Cadres calculable (50 / 50) + membres non calculable + publication sans URL.
aria-liveavec l'exact 50 % / 50 % (RGAA N°37)2025-11-15, radio "site web NON" → assertion : aucun champ URL n'est affiché → "Transmettre"Scénario 5 — Nouveau (propre à V2) — Blocage non-assujetti
Scénario absent sur master : validation de la branche d'assujettissement V2.
workforce < REPEQ_MIN_HEADCOUNT, soit< REPEQ_MIN_CONSECUTIVE_YEARSexercices consécutifs/representation-equilibree/etape/1(OU cliquer "Déclarer" depuis le panneaumon-espace)/representation-equilibree/non-assujettimon-espacefonctionnel (clic → URL/mon-espace/...)Scénarios de test
Ce ticket couvre les scénarios PO de l'epic #3287 : S1, S2, S4, S5, S6, S7, S8, S9, S10, S11, S13, S14.
S14 est vérifié via les assertions
aria-livesur les pourcentages calculés (scénarios 1 et 4).Références visuelles
N/A — tests E2E, les assertions portent sur le comportement fonctionnel et l'accessibilité programmatique, pas sur le rendu pixel.
Critères d'acceptation
packages/app/src/e2e/representation-equilibree.e2e.tscréé et contient les 5 scénarios (4 portés depuis Cypress master + 1 nouveau non-assujetti)aria-livedes pourcentages calculés (RGAA N°37)/non-assujetti, pas de bouton "Continuer", lien retour mon-espace)test.step(...)pour la lisibilité des logsgetByRole,getByLabel,getByText) — aucun CSS selector fragilefixtures/repeq.tsouglobal-setup.tspnpm dev:apprunning →pnpm test:e2epasse localement en < 2 min totalpnpm test)pnpm typecheck)pnpm lint:check)pnpm format:check)functional-validatorNote de dépendance : ce ticket dépend de tous les tickets UI de l'epic #3287 (#3292 à #3301). Commencer un skeleton en parallèle est possible, mais la finalisation requiert que les parcours complets soient implémentés. Les 4 tests Cypress master (
declaration_representative_{1,2,3,4}.cy.ts) restent la référence canonique pour les libellés exacts, les valeurs de test et les motifs non-calculable — les re-copier tels quels (avec adaptation de la syntaxe Playwright et des URLs V2) garantit la continuité de couverture.