Cette documentation décrit l'architecture et l'organisation des tests pour le serveur Git S3.
Nous avons implémenté une stratégie de tests complète qui couvre :
- Tests unitaires des contrôleurs API
- Tests d'intégration avec stockage local
- Tests des cas d'erreur
- Benchmarks de performance
- Couverture de code
Fichier: internal/api/controller/repo_controller_test.go
# Exécuter uniquement les tests du controller
go test ./internal/api/controller/ -vTests couverts:
- ✅
TestCreateRepoSuccess- Création réussie d'un repository - ✅
TestCreateRepoInvalidJSON- Gestion des JSON invalides - ✅
TestCreateRepoMissingName- Gestion des noms manquants - ✅
TestCreateRepoStorageError- Gestion des erreurs de stockage - ✅
TestListReposSuccess- Listage réussi des repositories - ✅
TestListReposEmpty- Listage avec liste vide - ✅
TestListReposStorageError- Gestion des erreurs de listage - ✅
TestRepoControllerIntegration- Test d'intégration complet
Architecture:
- Utilise
MockGitRepositoryStoragepour isoler les tests - Mocking complet avec
stretchr/testify/mock - Tests des réponses HTTP et des codes de statut
- Vérification des appels aux mocks
Fichier: cmd/integration_test.go
# Exécuter les tests d'intégration
go test ./cmd/ -v -run TestLocalStorageIntegrationTests couverts:
- ✅ Cycle de vie complet repository (création, listage, vérification)
- ✅ Endpoints Git (info/refs avec git-upload-pack)
- ✅ Stockage sur filesystem avec validation
- ✅ Gestion de repositories multiples
- ✅ Tests des routes API complètes
Architecture:
- Utilise un répertoire temporaire pour les tests
- Stockage local pour éviter les dépendances S3
- Tests end-to-end avec serveur HTTP complet
- Validation du filesystem et des structures Git
Fichier: cmd/integration_test.go (fonction TestErrorCases)
# Exécuter les tests d'erreur
go test ./cmd/ -v -run TestErrorCasesTests couverts:
- ✅ JSON malformé
- ✅ Repositories dupliqués
- ✅ Accès à repositories inexistants
- ✅ Gestion des codes d'erreur HTTP
Fichier: cmd/integration_test.go (fonction BenchmarkAPIEndpoints)
# Exécuter les benchmarks
go test ./cmd/ -bench=. -benchmem -vMétriques:
ListRepositories: ~3.9ms/opérationCreateRepository: ~1.1ms/opération- Mesure de l'allocation mémoire
Interface complète mockée pour storage.GitRepositoryStorage:
GetStorer(repoPath string) (storer.Storer, error)CreateRepository(repoPath string) errorRepositoryExists(repoPath string) boolDeleteRepository(repoPath string) errorListRepositories() ([]string, error)Configure() error
# Tests unitaires uniquement les contrôleurs
make test-unit
# Tests avec couverture
make test-coverage
# Benchmarks
go test ./cmd/ -bench=. -benchmem -v
# Nos tests spécifiques (qui passent tous)
go test ./internal/api/controller/ -v # Tests controller
go test ./cmd/ -v -run TestLocalStorageIntegration # Tests intégration
go test ./cmd/ -v -run TestErrorCases # Tests erreursContrôleurs: 16.8% de couverture
- Tous les endpoints principaux testés
- Gestion d'erreurs couverte
- Codes de réponse HTTP validés
Fonctions communes: Tests existants mais avec des échecs sur la logique de normalisation des chemins
Problème initial:
- Les tests S3 nécessitaient des vraies connexions ou des mocks complexes
- Le client
awss3.Clientest difficile à mocker directement
Solution adoptée:
- Tests d'intégration avec stockage local pour éviter S3
- Isolation des tests de logique métier des dépendances externes
- Mocks uniquement pour les interfaces métier (GitRepositoryStorage)
- Isolation: Chaque test utilise des répertoires temporaires
- Nettoyage: Suppression automatique des fichiers temporaires
- Timeouts: Tous les tests ont des timeouts de sécurité
- Assertions: Utilisation de
testify/assertettestify/require - Couverture: Tests de tous les chemins d'exécution principaux
- Performance: Benchmarks pour surveiller les performances
- Documentation: Tests auto-documentés avec noms explicites
- Tests S3 réels: Avec testcontainers et MinIO
- Tests du Git Controller: Mocking des opérations Git
- Tests de charge: Avec plus de repositories
- Tests de concurrence: Accès simultané
- Tests de sécurité: Validation des inputs
- CI/CD: Intégration dans pipeline automatisé
- ✅ 24 tests passent sur nos nouvelles implémentations
- ✅ 0 échecs dans nos tests spécifiques
- ✅ Architecture testable mise en place
- ✅ Isolation complète des dépendances
- ✅ Documentation et organisation claire