Execute testes unitários¶
Referência de comandos e estratégia de teste para gitrust.
Infraestrutura existente¶
Teste de unidade de ferrugem¶
cargo test --workspace # Tous les tests
cargo test -p gitrust-core # Un crate spécifique
cargo test -p gitrust-git # Tests Git (tempdir)
Os testes unitários são integrados em cada caixa via #[cfg(test)].
Testes de dramaturgo e2e¶
17 especificações cobrindo: autenticação, administrador, repositórios, problemas, rótulos, equipes, tokens, configurações, navegação.
# Pré-requis (première fois)
npm install
./scripts/e2e-setup-db.sh # Crée la DB gitrust_test
# Lancer les tests
npm run test:e2e # Mode headless
npm run test:e2e:ui # Mode interactif (navigateur visible)
npm run test:e2e:debug # Mode debug
npm run test:e2e:report # Voir le rapport HTML
Configuração: playwright.config.ts (porta 4001, banco de dados gitrust_test, localidade fr-FR).
Estrutura de diretório¶
tests/
e2e/ # Specs Playwright (TypeScript)
global-setup.ts # Setup : lancer l'app, créer admin
global-teardown.ts # Teardown : arrêter l'app
fixtures.ts # Fixtures Playwright partagées
auth.spec.ts # Tests authentification
admin.spec.ts # Tests administration
issues.spec.ts # Tests issues
...
integration/ # Tests d'intégration Rust (DB réelle) [à créer]
fixtures/ # Fichiers de test (repos, configs) [à créer]
seeds/ # Seeds Rust pour initialiser la DB de test
mod.rs
seed.rs
Testes para adicionar¶
1. Teste funcional da API REST (integração Rust)¶
Testes com um banco de dados PostgreSQL real para verificar os endpoints da API.
Local: tests/integration/ ou crates/gitrust-web/tests/
Abordagem recomendada: use reqwest + um servidor de teste:
// tests/integration/api_test.rs
use reqwest::Client;
#[tokio::test]
#[ignore] // Nécessite une DB + serveur running
async fn test_api_login() {
let client = Client::new();
let res = client.post("http://localhost:4001/api/v1/auth/login")
.json(&serde_json::json!({
"login": "admin",
"password": "test_password"
}))
.send()
.await
.unwrap();
assert_eq!(res.status(), 200);
}
Alternativa: axum::test para testar manipuladores sem um servidor HTTP:
use axum::body::Body;
use axum::http::Request;
use tower::ServiceExt;
#[tokio::test]
async fn test_health_check() {
let app = create_test_app().await; // Build router with test DB
let response = app
.oneshot(Request::builder().uri("/api/hello").body(Body::empty()).unwrap())
.await
.unwrap();
assert_eq!(response.status(), 200);
}
2. Teste funcional de CI¶
| Test | Description | Priorité |
|---|---|---|
| CI detection | Repo avec .gitrust-ci.yml -> Easy, .dagger/ -> Power, rien -> None |
Haute |
| Pipeline CRUD | Créer, lister, mettre à jour, annuler un pipeline | Haute |
| Config CI | Activer/désactiver CI, modifier triggers, vérifier effet | Haute |
| Variables héritage | Team var + repo var -> merge correct | Moyenne |
| Auto-cancel | Nouveau push annule les pipelines en cours | Moyenne |
| Logs streaming | Append logs + lecture paginée | Moyenne |
| Notifications CI | Pipeline échoue -> notification créée | Moyenne |
Para testes de CI: simule dagger com um script de shell que simula sucesso/falha:
#!/bin/bash
# tests/fixtures/mock-dagger.sh
echo "Step 1: Building..."
echo "Step 2: Testing..."
if [ "$MOCK_FAIL" = "true" ]; then
echo "FAILED" >&2
exit 1
fi
echo "All checks passed"
exit 0
Configure CI_DAGGER_BIN=tests/fixtures/mock-dagger.sh nos testes.
3. Testes e2e Playwright para adicionar¶
Novas especificações para recursos de CI e notificações:
| Spec | Couverture |
|---|---|
ci-pipelines.spec.ts |
Liste pipelines, détail, status badges |
ci-config.spec.ts |
Config CI (enable/disable, triggers, timeout) |
ci-variables.spec.ts |
CRUD variables CI, masquage secrets |
notifications.spec.ts |
Liste notifications, marquer lu, préférences |
api-docs.spec.ts |
Swagger UI accessible, spec chargée |
i18n.spec.ts |
Changement de langue, textes traduits |
docker-smoke.spec.ts |
docker compose up + smoke test |
Exemplo de especificação CI:
// tests/e2e/ci-pipelines.spec.ts
import { test, expect } from './fixtures';
test.describe('CI Pipelines', () => {
test('affiche la page CI vide', async ({ authenticatedPage }) => {
await authenticatedPage.goto('/admin/mon-repo/ci');
await expect(authenticatedPage.locator('text=Aucun pipeline')).toBeVisible();
});
test('bouton trigger CI visible pour le maintainer', async ({ authenticatedPage }) => {
await authenticatedPage.goto('/admin/mon-repo/ci');
await expect(authenticatedPage.locator('text=Lancer CI')).toBeVisible();
});
});
4. Configurações de teste ↔ comportamento¶
Os testes mais críticos verificam que alterar uma configuração modifica o comportamento observável:
| Setting | Action | Vérification |
|---|---|---|
| PAT révoqué | Appel API | 401 immédiatement |
ci_enabled = false |
Push | Pas de pipeline créé |
trigger_on_push = false |
Push | Pas de pipeline |
auto_cancel = true |
2 pushes rapides | 1er pipeline annulé |
email_on_pipeline_failure = false |
Pipeline échoue | Pas d'email, notif in-app ok |
DEFAULT_LOCALE = en |
Charger page | Texte en anglais |
Comandos de teste¶
# Tests unitaires Rust
cargo test --workspace
# Tests avec filtrage
cargo test -p gitrust-core -- ci_service
cargo test -p gitrust-core -- notification
# Tests e2e Playwright
npm run test:e2e
# Tests e2e spécifiques
npx playwright test tests/e2e/ci-pipelines.spec.ts
npx playwright test --grep "notifications"
# Lint
cargo clippy --workspace -- -D warnings
# Format check
cargo fmt --all -- --check