Tests in user package

This commit is contained in:
2025-08-30 08:59:45 +02:00
parent 95a557cd13
commit 67d12848ed
2 changed files with 4 additions and 97 deletions
-97
View File
@@ -1,97 +0,0 @@
# Password Reset Tests Documentation
Diese Dokumentation beschreibt die umfassenden Tests für das Password-Reset-System.
## Test-Übersicht
Das Password-Reset-System wurde mit 16 umfassenden Tests abgedeckt:
### 1. API-Handler-Tests
#### RequestPasswordReset Tests:
- `TestRequestPasswordReset_Success` - Erfolgreiche Password-Reset-Anfrage mit `redirect_url`
- `TestRequestPasswordReset_WithoutRedirectURL` - Erfolgreich ohne `redirect_url` (Fallback wird verwendet)
- `TestRequestPasswordReset_NonExistentEmail` - Nicht existierende E-Mail (Sicherheitsverhalten: Keine Information preisgeben)
- `TestRequestPasswordReset_InvalidEmail` - Ungültiges E-Mail-Format (Validation-Fehler)
#### ValidateResetToken Tests:
- `TestValidateResetToken_Success` - Gültiger Token wird korrekt validiert
- `TestValidateResetToken_InvalidToken` - Ungültiger Token wird abgelehnt
- `TestValidateResetToken_ExpiredToken` - Abgelaufener Token wird abgelehnt
#### ResetPassword Tests:
- `TestResetPassword_Success` - Erfolgreiches Zurücksetzen des Passworts
- `TestResetPassword_InvalidToken` - Ungültiger Token wird abgelehnt
- `TestResetPassword_ShortPassword` - Zu kurzes Passwort wird abgelehnt (< 6 Zeichen)
- `TestResetPassword_ExpiredToken` - Abgelaufener Token wird abgelehnt
### 2. User-Model-Tests
#### Password-Reset-Hash Management:
- `TestUser_SetPasswordResetHash` - Setzt Reset-Hash und Ablaufzeit (14 Tage)
- `TestUser_ClearPasswordResetHash` - Entfernt Reset-Hash und Ablaufzeit
- `TestUser_IsResetHashValid` - Validiert Reset-Hash gegen Zeit und Wert
#### Database-Query Tests:
- `TestUser_FindByResetHash` - Findet User anhand gültigem Reset-Hash
- `TestUser_FindByEmail` - Findet User anhand E-Mail-Adresse
## Test-Setup
### Database Migration
- Jeder Test führt automatisch `MigrateStructure()` aus um sicherzustellen, dass die `reset_pw_hash` und `reset_pw_hash_expires` Felder existieren
### Test-Isolation
- Eindeutige E-Mail-Adressen per Test über `rand.Intn(100000)` um UNIQUE-Constraint-Konflikte zu vermeiden
- SQLite In-Memory-Datenbank für schnelle Test-Ausführung
### Test-Daten
- Generierte Test-User mit MD5-gehashten Passwörtern (wie im echten System)
- Realistische Reset-Token-Generierung und Zeitstempel
## Sicherheits-Tests
### E-Mail-Enumeration-Schutz
- Tests stellen sicher, dass bei nicht-existierenden E-Mail-Adressen dieselbe Erfolgsmeldung zurückgegeben wird
- Keine Information wird preisgegeben, ob ein Account existiert oder nicht
### Token-Sicherheit
- Token-Ablauf wird korrekt geprüft (14 Tage)
- Ungültige Tokens werden sicher abgelehnt
- Token werden nach erfolgreichem Reset automatisch gelöscht
### Input-Validation
- E-Mail-Format-Validierung
- Passwort-Mindestlänge (6 Zeichen)
- Token-Presence-Validation
## Test-Ausführung
```bash
# Alle Password-Reset-Tests ausführen
go test ./user -v -run ".*Reset.*"
# Einzelnen Test ausführen
go test ./user -v -run "TestRequestPasswordReset_Success"
# Tests mit frischer Database bei jedem Lauf
go test ./user -v -run ".*Reset.*" -count=1
```
## Test-Ergebnisse
Alle 16 Tests bestehen erfolgreich:
- ✅ API-Handler-Tests (11 Tests)
- ✅ User-Model-Tests (5 Tests)
- ✅ Sicherheits-Tests (integriert)
- ✅ Database-Integration-Tests (integriert)
## Abgedeckte Szenarien
1. **Happy Path**: Normale Password-Reset-Workflows
2. **Error Cases**: Ungültige Eingaben, abgelaufene Token
3. **Security Cases**: E-Mail-Enumeration-Schutz, Token-Sicherheit
4. **Edge Cases**: Fehlende Parameter, Fallback-Verhalten
5. **Database Integration**: Migration, CRUD-Operationen, Constraints
Die Test-Suite gewährleistet eine vollständige Abdeckung aller Password-Reset-Funktionen mit fokus auf Sicherheit und Benutzerfreundlichkeit.
+4
View File
@@ -80,6 +80,10 @@ func (object *User) FindByEmail(email string) error {
return fmt.Errorf("database connection is nil")
}
if email == "" {
return fmt.Errorf("email cannot be empty")
}
err := database.DB.First(&object, "email = ?", email).Error
return err
}