Tests in user package
This commit is contained in:
@@ -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.
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user