From 67d12848ed83117849f661f21e6df32b987e85c7 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 30 Aug 2025 08:59:45 +0200 Subject: [PATCH] Tests in user package --- backend/user/PASSWORD_RESET_TESTS.md | 97 ---------------------------- backend/user/model.go | 4 ++ 2 files changed, 4 insertions(+), 97 deletions(-) delete mode 100644 backend/user/PASSWORD_RESET_TESTS.md diff --git a/backend/user/PASSWORD_RESET_TESTS.md b/backend/user/PASSWORD_RESET_TESTS.md deleted file mode 100644 index e99df8d..0000000 --- a/backend/user/PASSWORD_RESET_TESTS.md +++ /dev/null @@ -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. diff --git a/backend/user/model.go b/backend/user/model.go index e4e35a5..3a4a4a0 100644 --- a/backend/user/model.go +++ b/backend/user/model.go @@ -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 }