원클릭으로
generate-e2e-test
Génère ou complète des tests Storybook (`play`) pour les stories Lucca Front.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Génère ou complète des tests Storybook (`play`) pour les stories Lucca Front.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Produit une analyse des bugs de Lucca Front sur une période donnée (trimestre, mois…) en croisant deux populations : les issues de type `Bug` (demande) et les PR labellisées FIX (livraison) — volumes ouverts/traités/restants, criticité, sujets et comparatif trimestriel.
Règles d’écriture du SCSS Lucca Front : nommage type BEM à plat, modifiers/états, layers, tokens, propriétés logiques, structure de fichiers et enregistrement highlight-prisme. À utiliser pour écrire ou modifier du SCSS dans packages/scss, packages/ng ou les stories.
Génère une story QA à partir de guidelines et du contrat d’interface d’un composant.
Design system Lucca Front / Prisme (Angular). À charger pour tout fichier d'un projet qui dépend de @lucca-front/ng ou @lucca-front/scss, ou contenant des sélecteurs lu-*, pr-* ou des directives commençant par 'lu' (ex: luButton, luTooltip, luForm).
Design system Lucca Front / Prisme (Angular). À charger pour tout fichier d'un projet qui dépend de @lucca-front/ng ou @lucca-front/scss, ou contenant des sélecteurs lu-*, pr-* ou des directives commençant par 'lu' (ex: luButton, luTooltip, luForm).
Design system Lucca Front / Prisme (Angular) — toutes versions. À charger pour tout fichier d'un projet qui dépend de @lucca-front/ng ou @lucca-front/scss, ou contenant des sélecteurs lu-*, pr-* ou des directives commençant par 'lu' (ex: luButton, luTooltip, luForm).
| name | generate-e2e-test |
| description | Génère ou complète des tests Storybook (`play`) pour les stories Lucca Front. |
Génère des tests E2E Storybook en respectant les conventions du repository (createTestStory, waitForAngular, step, queries via within/screen).
Si aucune guideline n'est fournie, demander à l'utilisateur s'il souhaite en fournir une (lien Figma, documentation, texte libre) avant de générer la story, en précisant que cela permettra de couvrir les règles d'usage officielles et les cas limites. Si l'utilisateur confirme qu'il n'en a pas, se baser uniquement sur le contrat d'interface.
Pour produire un test fiable, identifier :
Basic, States, WithPopover).stories/helpers/test.ts.createTestStory(Story, play)).step(...).await waitForAngular() au début.within(canvasElement) pour les éléments dans la story.screen pour les éléments rendus dans l’overlay global.await waitForAngular() après chaque interaction pouvant déclencher une mise à jour asynchrone.toBeVisible, toHaveTextContent, toHaveAttribute, etc.).Basic s’appelle BasicTEST.TEST est obligatoire.```typescript
import { createTestStory } from '@/helpers/stories'; import { waitForAngular } from '@/helpers/test'; import { expect, userEvent, within } from 'storybook/test';
export const MyStoryTEST = createTestStory(MyStory, async ({ canvasElement, step }) => { // 1. Wait for Angular to stabilize await waitForAngular();
const canvas = within(canvasElement);
// 2. Use steps to organize interactions and assertions
await step('Initial state check', async () => {
const button = canvas.getByRole('button');
await expect(button).toBeVisible();
});
await step('Interaction test', async () => {
const button = canvas.getByRole('button');
await userEvent.click(button);
await waitForAngular(); // Wait after interactions if they trigger async changes
// Add assertions here
});
});
### Règles
1. Toujours démarrer le `play` avec `await waitForAngular()`.
2. Toujours encapsuler les actions/attendus métier dans des `step` nommés.
3. Utiliser `within(canvasElement)` par défaut ; basculer sur `screen` uniquement pour les overlays globaux.
4. Ajouter `await waitForAngular()` après les interactions asynchrones (`click`, `keyboard`, sélection de date, etc.).
5. Réutiliser les helpers de `stories/helpers/test.ts` avant de créer une logique ad hoc.
6. Garder des assertions métier : tester le comportement utilisateur visible, pas l'implémentation interne.
7. **Tout composant interactif doit inclure un step clavier** en plus du step souris : au minimum l'ouverture/confirmation (`{Enter}` ou `{ArrowDown}`) et la fermeture (`{Escape}`).
---
## Interactions clavier
### Mettre le focus sur un élément
Utiliser `.focus()` directement sur l'élément DOM (pas via `userEvent`) pour positionner le focus avant une séquence clavier :
```typescript
const button = canvas.getByRole('button');
button.focus();
await expect(button).toHaveFocus();
| Touche | Usage |
|---|---|
{Enter} | Confirmer, valider, ouvrir un overlay focalisé |
{Space} | Activer un bouton, cocher une case |
{Escape} | Fermer un overlay, annuler |
{ArrowDown} / {ArrowUp} | Naviguer dans une liste, ouvrir un select |
{ArrowLeft} / {ArrowRight} | Naviguer entre segments (timepicker, etc.) |
{Tab} | Avancer le focus (via userEvent.tab()) |
await userEvent.tab();
await expect(canvas.getByRole('textbox')).toHaveFocus();
const input = canvas.getByRole('combobox');
input.focus();
await userEvent.keyboard('{ArrowDown}');
await waitForAngular();
await expect(screen.getByRole('listbox')).toBeVisible();
await userEvent.keyboard('{Enter}');
await waitForAngular();
Utiliser le helper repeatKeyboardUserEvent de stories/helpers/test.ts :
import { repeatKeyboardUserEvent, waitForAngular } from '@/helpers/test';
await repeatKeyboardUserEvent('{ArrowUp}', 3);
await waitForAngular();
Après une interaction clavier, vérifier les attributs ARIA reflétant l'état du composant :
await expect(trigger).toHaveAttribute('aria-expanded', 'true');
await expect(option).toHaveAttribute('aria-selected', 'true');
await expect(trigger).toHaveFocus(); // le focus revient au déclencheur après fermeture
```typescript
await step('Open popover', async () => { await userEvent.click(canvas.getByRole('button')); await waitForAngular(); const popover = screen.getByRole('dialog'); await expect(popover).toBeVisible(); });
### Interaction clavier
```typescript
await step('Escape closes popover', async () => {
await userEvent.keyboard('{Escape}');
await waitForAngular();
await expect(screen.queryByRole('dialog')).not.toBeInTheDocument();
});
```typescript
const commonPlay = async (context) => { // ... };
export const BasicTEST = createTestStory(Basic, commonPlay); export const VariantTEST = createTestStory(Variant, async (context) => { await commonPlay(context); // assertions spécifiques });