- Löschfristen (Migration 0020): pro Mandant einstellbar statt fest im Regelwerk, da die DSGVO selbst keine festen Fristen nennt (Art. 5 Abs. 1 lit. e). Jede Firma wird mit risikogestaffelten Vorschlagswerten vorbelegt, loeschfrist_max_tage wird jetzt tatsächlich hart gegen Werkzeuge gefiltert (schließt rules/OPEN.md Punkt 4). - Neues internal/mail-Paket (SMTP-Versand + Test-Doppel) und darauf aufbauend Passwort-Zurücksetzen (Migration 0019) - bisher nur als Absicht in der Rollentabelle genannt, nie gebaut. - dpf_zertifiziert für alle 20 Katalogeinträge gegen das offizielle DPF-Register recherchiert und in der Produktions-DB aktualisiert (12 zertifiziert, 5 recherchiert-nicht-gefunden, 3 nicht anwendbar). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package store_test
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/netcell-it/deklarix/internal/store"
|
|
)
|
|
|
|
func TestPasswordResetTokenLifecycle(t *testing.T) {
|
|
s := openTestStore(t)
|
|
ctx := context.Background()
|
|
accID := testAccountID(t, s)
|
|
userID := testUserID(t, s, accID)
|
|
|
|
tok, err := s.CreatePasswordResetToken(ctx, userID, "test-token-123")
|
|
if err != nil {
|
|
t.Fatalf("CreatePasswordResetToken: %v", err)
|
|
}
|
|
if tok.UserID != userID || tok.Token != "test-token-123" {
|
|
t.Fatalf("PasswordResetToken = %+v, unerwartete Werte", tok)
|
|
}
|
|
|
|
got, err := s.GetValidPasswordResetToken(ctx, "test-token-123")
|
|
if err != nil || got.ID != tok.ID {
|
|
t.Fatalf("GetValidPasswordResetToken = %+v, err=%v", got, err)
|
|
}
|
|
|
|
if err := s.MarkPasswordResetTokenUsed(ctx, tok.ID); err != nil {
|
|
t.Fatalf("MarkPasswordResetTokenUsed: %v", err)
|
|
}
|
|
|
|
// Ein verbrauchter Token gilt nicht mehr als gültig.
|
|
if _, err := s.GetValidPasswordResetToken(ctx, "test-token-123"); !errors.Is(err, store.ErrNotFound) {
|
|
t.Fatalf("err nach Verbrauch = %v, want ErrNotFound", err)
|
|
}
|
|
|
|
// Ein unbekannter Token ist von Anfang an ErrNotFound.
|
|
if _, err := s.GetValidPasswordResetToken(ctx, "existiert-nicht"); !errors.Is(err, store.ErrNotFound) {
|
|
t.Fatalf("err für unbekannten Token = %v, want ErrNotFound", err)
|
|
}
|
|
}
|
|
|
|
func TestSetUserPassword(t *testing.T) {
|
|
s := openTestStore(t)
|
|
ctx := context.Background()
|
|
accID := testAccountID(t, s)
|
|
userID := testUserID(t, s, accID)
|
|
|
|
if err := s.SetUserPassword(ctx, userID, "neuer-hash"); err != nil {
|
|
t.Fatalf("SetUserPassword: %v", err)
|
|
}
|
|
got, err := s.GetUser(ctx, userID)
|
|
if err != nil || got.PasswordHash != "neuer-hash" {
|
|
t.Fatalf("GetUser nach SetUserPassword = %+v, err=%v", got, err)
|
|
}
|
|
}
|