Enhance testing framework and add UI component tests. Integrated Vitest for testing with AstroContainer API. Updated package.json and bun.lock to include testing dependencies. Added comprehensive test cases for various UI components including Button, Alert, Badge, and more, ensuring proper rendering and functionality.
This commit is contained in:
188
TESTING.md
Normal file
188
TESTING.md
Normal file
@ -0,0 +1,188 @@
|
||||
# Guide de Tests Astro
|
||||
|
||||
Ce projet utilise **Vitest** avec l'API **AstroContainer** pour tester les composants Astro UI.
|
||||
|
||||
## Configuration
|
||||
|
||||
- **Framework de test** : Vitest
|
||||
- **API de rendu** : `experimental_AstroContainer` d'Astro
|
||||
- **Environnement** : Node.js
|
||||
- **Configuration** : `vitest.config.ts` utilise `getViteConfig` d'Astro
|
||||
|
||||
## Structure des Tests
|
||||
|
||||
```
|
||||
src/components/ui/__tests__/
|
||||
├── basic.test.ts # Test simple de démonstration
|
||||
├── Button.test.ts # Tests du composant Button
|
||||
├── Card.test.ts # Tests du composant Card
|
||||
├── Alert.test.ts # Tests du composant Alert
|
||||
├── Badge.test.ts # Tests du composant Badge
|
||||
├── Input.test.ts # Tests du composant Input
|
||||
├── Progress.test.ts # Tests du composant Progress
|
||||
├── Spinner.test.ts # Tests du composant Spinner
|
||||
├── MovieCard.test.ts # Tests du composant MovieCard
|
||||
└── ... # Autres tests de composants
|
||||
```
|
||||
|
||||
## Exécution des Tests
|
||||
|
||||
```bash
|
||||
# Exécuter tous les tests
|
||||
bun run test
|
||||
|
||||
# Exécuter les tests en mode watch
|
||||
bun run test:watch
|
||||
|
||||
# Exécuter l'interface graphique des tests
|
||||
bun run test:ui
|
||||
|
||||
# Exécuter des tests spécifiques
|
||||
bun run test src/components/ui/__tests__/Button.test.ts
|
||||
```
|
||||
|
||||
## Structure d'un Test Type
|
||||
|
||||
```typescript
|
||||
import { experimental_AstroContainer as AstroContainer } from 'astro/container';
|
||||
import { describe, it, expect } from 'vitest';
|
||||
import MonComposant from '../MonComposant.astro';
|
||||
|
||||
describe('MonComposant', () => {
|
||||
it('renders with default props', async () => {
|
||||
const container = await AstroContainer.create();
|
||||
const result = await container.renderToString(MonComposant, {
|
||||
props: { propriete: 'valeur' },
|
||||
slots: { default: 'Contenu du slot' }
|
||||
});
|
||||
|
||||
expect(result).toContain('Contenu attendu');
|
||||
expect(result).toContain('class="ma-classe"');
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
## Bonnes Pratiques
|
||||
|
||||
### 1. Utilisation d'AstroContainer
|
||||
|
||||
```typescript
|
||||
// ✅ Correct - Utiliser AstroContainer
|
||||
const container = await AstroContainer.create();
|
||||
const result = await container.renderToString(Component, {
|
||||
props: { variant: 'primary' },
|
||||
slots: { default: 'Content' }
|
||||
});
|
||||
|
||||
// ❌ Incorrect - Ancienne méthode DOM
|
||||
const html = await renderAstroComponent(Component);
|
||||
document.body.innerHTML = html;
|
||||
```
|
||||
|
||||
### 2. Vérifications de Contenu
|
||||
|
||||
```typescript
|
||||
// ✅ Vérifier le contenu HTML rendu
|
||||
expect(result).toContain('expected-class');
|
||||
expect(result).toContain('Expected text');
|
||||
expect(result).toContain('attribute="value"');
|
||||
|
||||
// ✅ Vérifier la structure HTML
|
||||
expect(result).toContain('<button');
|
||||
expect(result).toContain('type="submit"');
|
||||
```
|
||||
|
||||
### 3. Test des Props
|
||||
|
||||
```typescript
|
||||
// Test des variants
|
||||
const variants = ['primary', 'secondary', 'outline'] as const;
|
||||
for (const variant of variants) {
|
||||
const result = await container.renderToString(Button, {
|
||||
props: { variant },
|
||||
slots: { default: 'Test' }
|
||||
});
|
||||
expect(result).toContain(`btn-${variant}`);
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Test des Slots
|
||||
|
||||
```typescript
|
||||
// Test avec différents slots
|
||||
const result = await container.renderToString(Modal, {
|
||||
props: { id: 'test-modal' },
|
||||
slots: {
|
||||
header: 'Modal Title',
|
||||
default: 'Modal content',
|
||||
footer: 'Modal actions'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
## Composants Testés
|
||||
|
||||
### Composants de Base (4/4)
|
||||
- ✅ Button - Variants, tailles, états, types
|
||||
- ✅ Card - Classes, contenu, props
|
||||
- ✅ Alert - Variants (success, warning, error, info)
|
||||
- ✅ Badge - Variants et styles
|
||||
|
||||
### Composants de Formulaire (4/4)
|
||||
- ✅ Input - Types, tailles, validation
|
||||
- ✅ Select - Options, validation
|
||||
- ✅ Textarea - Dimensions, validation
|
||||
- ✅ FormGroup - Regroupement
|
||||
|
||||
### Composants de Layout (3/3)
|
||||
- ✅ Container - Mode fluide
|
||||
- ✅ Row - Styles
|
||||
- ✅ Col - Breakpoints responsifs
|
||||
|
||||
### Composants Modaux (4/4)
|
||||
- ✅ Modal - Visibilité, structure
|
||||
- ✅ ModalHeader - Avec bouton fermeture
|
||||
- ✅ ModalBody - Contenu
|
||||
- ✅ ModalFooter - Actions
|
||||
|
||||
### Composants de Navigation (3/3)
|
||||
- ✅ Navbar - Slots (brand, nav, actions)
|
||||
- ✅ NavLink - État actif, liens
|
||||
- ✅ NavbarBrand - Logo/marque
|
||||
|
||||
### Composants Spécialisés (4/4)
|
||||
- ✅ MovieCard - Film (poster, rating, metadata)
|
||||
- ✅ SearchBar - Recherche avec icône
|
||||
- ✅ Progress - Barre de progression
|
||||
- ✅ Spinner - Indicateur de chargement
|
||||
|
||||
## Total : 22 composants testés
|
||||
|
||||
## Statut des Tests
|
||||
|
||||
- **Tests configurés** : ✅
|
||||
- **API AstroContainer** : ✅
|
||||
- **Tests fonctionnels** : ✅
|
||||
- **Coverage complète** : ✅
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Erreur de Parsing Astro
|
||||
Si vous obtenez des erreurs de parsing `.astro`, vérifiez que votre `vitest.config.ts` utilise bien `getViteConfig` :
|
||||
|
||||
```typescript
|
||||
import { getViteConfig } from 'astro/config';
|
||||
|
||||
export default getViteConfig({
|
||||
test: {
|
||||
environment: 'node'
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Tests qui ne trouvent pas les composants
|
||||
Vérifiez les imports relatifs dans vos tests :
|
||||
|
||||
```typescript
|
||||
import MonComposant from '../MonComposant.astro';
|
||||
```
|
Reference in New Issue
Block a user