import type { Meta, StoryObj } from '@storybook/react'; import { fn } from '@storybook/test'; import { within, userEvent } from '@storybook/test'; import { TwoFactorVerify } from './TwoFactorVerify'; /** * TwoFactorVerify - Vérification 2FA * * Composant pour saisir le code de vérification 2FA * lors de la connexion avec authentification à deux facteurs. */ const meta: Meta = { title: 'Features/Auth/TwoFactorVerify', component: TwoFactorVerify, parameters: { layout: 'centered', docs: { description: { component: 'Formulaire de vérification 2FA avec support des codes de backup.', }, }, }, tags: ['autodocs'], args: { onSuccess: fn(), onCancel: fn(), }, argTypes: { onSuccess: { description: 'Callback appelé avec le code après vérification réussie', action: 'onSuccess', }, onCancel: { description: 'Callback appelé quand l\'utilisateur annule', action: 'onCancel', }, }, }; export default meta; type Story = StoryObj; /** * État par défaut - saisie du code TOTP. */ export const Default: Story = { name: 'Par défaut', }; /** * État avec erreur de vérification. */ export const WithError: Story = { name: 'Avec erreur', play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Saisir un code invalide const codeInput = canvas.getByLabelText(/verification code/i); await userEvent.type(codeInput, '123456'); // Cliquer sur Verify const verifyButton = canvas.getByRole('button', { name: /verify/i }); await userEvent.click(verifyButton); }, parameters: { docs: { description: { story: 'Affiche le message d\'erreur après un code invalide.', }, }, }, }; /** * État de chargement pendant la vérification. */ export const Loading: Story = { name: 'Chargement', play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Saisir un code const codeInput = canvas.getByLabelText(/verification code/i); await userEvent.type(codeInput, '123456'); // Cliquer sur Verify pour voir le spinner const verifyButton = canvas.getByRole('button', { name: /verify/i }); await userEvent.click(verifyButton); }, parameters: { docs: { description: { story: 'Montre le spinner pendant la vérification.', }, }, }, }; /** * Mode backup code. */ export const BackupCode: Story = { name: 'Code de backup', play: async ({ canvasElement }) => { const canvas = within(canvasElement); // Cliquer sur "Use a backup code" const backupLink = canvas.getByRole('button', { name: /use a backup code/i }); await userEvent.click(backupLink); }, parameters: { docs: { description: { story: 'Interface pour utiliser un code de backup au lieu du TOTP.', }, }, }, };