Skip to content

[V2 Repeq] E2E Playwright: parcours complet nominal + non-assujetti #3302

@Viczei

Description

@Viczei

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.tscréation : un seul fichier regroupant les 5 scénarios (4 portés + 1 nouveau)
  • packages/app/src/e2e/fixtures/repeq.tscré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

  • packages/app/src/e2e/representation-equilibree.e2e.ts créé et contient les 5 scénarios (4 portés depuis Cypress master + 1 nouveau non-assujetti)
  • Les 4 combinaisons calculable × non-calculable pour cadres × membres sont couvertes explicitement
  • Le scénario 1 vérifie l'annonce aria-live des pourcentages calculés (RGAA N°37)
  • Le scénario 3 vérifie que l'étape 3 affiche un texte statique (pas de dropdown) pour le motif unique MID (RGAA N°22)
  • Le scénario 4 vérifie la branche "publication sans URL" (radio NON → pas de champ URL affiché)
  • Le scénario 5 vérifie le blocage non-assujetti (redirect /non-assujetti, pas de bouton "Continuer", lien retour mon-espace)
  • Chaque scénario utilise test.step(...) pour la lisibilité des logs
  • Sélecteurs stables uniquement (getByRole, getByLabel, getByText) — aucun CSS selector fragile
  • Les 4 companies de test (une par configuration) sont seedées (workforce, exercices consécutifs, SIREN) via fixtures/repeq.ts ou global-setup.ts
  • pnpm dev:app running → pnpm test:e2e passe localement en < 2 min total
  • Tests ajoutés et verts (pnpm test)
  • Typecheck vert (pnpm typecheck)
  • Lint vert (pnpm lint:check)
  • Format vert (pnpm format:check)
  • Scénarios rejoués sans erreur par functional-validator

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    Status

    To Do

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions