Files
deklarix/internal/web/passwort_reset_handlers_test.go
noroot 7db4707bc5 feat: vollständige Firmendaten (Adresse, Abrechnung) bei Firmenanlage
Bei Firmenanlage (Registrierung + Betreiber-Firmenanlage) müssen jetzt
Adresse (Straße, PLZ, Ort, Land) und Abrechnungsdaten (Rechnungsemail,
optional USt-IdNr.) erfasst werden, nicht nur der Firmenname (Migration
0023). USt-IdNr. bewusst optional - Kleinunternehmer nach §19 UStG
haben keine. Neue Seite /verwaltung/firma (admin-only) zum Einsehen/
Nachtragen für bestehende Firmen. store.CreateAccount nimmt jetzt ein
AccountInput statt nur einen Namen entgegen (Signaturänderung betrifft
~20 Testaufrufe, mechanisch umgestellt). register.html/
betreiber_account_neu.html auf form-card/form-grid umgestellt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-01 11:36:05 +02:00

95 lines
3.3 KiB
Go

package web_test
import (
"net/http"
"net/url"
"regexp"
"testing"
)
var resetLinkPattern = regexp.MustCompile(`/passwort-zuruecksetzen/([a-f0-9]+)`)
func TestPasswortVergessenSendetLinkUndSetztNeuesPasswort(t *testing.T) {
fs := newFakeStore()
s, fm := newServerWithMailer(t, fs)
regResp := postForm(t, s, nil, "/register", mergeValues(url.Values{
"account_name": {"Reset-Firma"}, "email": {"reset@example.com"},
"password": {"altes-passwort"},
}, firmenPflichtfelder()))
if regResp.Code != http.StatusSeeOther {
t.Fatalf("register status = %d, want 303", regResp.Code)
}
vergessenResp := postForm(t, s, nil, "/passwort-vergessen", url.Values{"email": {"reset@example.com"}})
if vergessenResp.Code != http.StatusOK {
t.Fatalf("passwort-vergessen status = %d, want 200", vergessenResp.Code)
}
if len(fm.Sent) != 1 {
t.Fatalf("got %d gesendete Mails, want 1", len(fm.Sent))
}
match := resetLinkPattern.FindStringSubmatch(fm.Sent[0].Body)
if match == nil {
t.Fatalf("kein Reset-Link in Mail-Body gefunden: %q", fm.Sent[0].Body)
}
token := match[1]
getResp := getWithCookie(t, s, nil, "/passwort-zuruecksetzen/"+token)
if getResp.Code != http.StatusOK {
t.Fatalf("get reset form status = %d, want 200", getResp.Code)
}
resetResp := postForm(t, s, nil, "/passwort-zuruecksetzen/"+token, url.Values{"password": {"neues-passwort-123"}})
if resetResp.Code != http.StatusSeeOther {
t.Fatalf("reset status = %d, want 303, body: %s", resetResp.Code, resetResp.Body.String())
}
// Derselbe Link darf kein zweites Mal funktionieren.
reuseResp := postForm(t, s, nil, "/passwort-zuruecksetzen/"+token, url.Values{"password": {"noch-ein-passwort"}})
if reuseResp.Code != http.StatusNotFound {
t.Fatalf("reuse status = %d, want 404 (Token bereits verwendet)", reuseResp.Code)
}
// Altes Passwort funktioniert nicht mehr.
oldLoginResp := postForm(t, s, nil, "/login", url.Values{"email": {"reset@example.com"}, "password": {"altes-passwort"}})
if oldLoginResp.Code != http.StatusOK {
t.Fatalf("login mit altem Passwort status = %d, want 200 (abgelehnt)", oldLoginResp.Code)
}
// Neues Passwort funktioniert.
newLoginResp := postForm(t, s, nil, "/login", url.Values{"email": {"reset@example.com"}, "password": {"neues-passwort-123"}})
if newLoginResp.Code != http.StatusSeeOther {
t.Fatalf("login mit neuem Passwort status = %d, want 303", newLoginResp.Code)
}
}
func TestPasswortVergessenFuerUnbekannteEmailVerraetNichts(t *testing.T) {
fs := newFakeStore()
s, fm := newServerWithMailer(t, fs)
resp := postForm(t, s, nil, "/passwort-vergessen", url.Values{"email": {"gibt-es-nicht@example.com"}})
if resp.Code != http.StatusOK {
t.Fatalf("status = %d, want 200", resp.Code)
}
if len(fm.Sent) != 0 {
t.Fatalf("got %d gesendete Mails für unbekannte E-Mail, want 0", len(fm.Sent))
}
if !containsHinweis(resp.Body.String()) {
t.Fatalf("erwartete generische Erfolgsmeldung, body: %s", resp.Body.String())
}
}
func containsHinweis(body string) bool {
return regexp.MustCompile(`Falls diese E-Mail-Adresse`).MatchString(body)
}
func TestPasswortZuruecksetzenMitUngueltigemTokenGibt404(t *testing.T) {
fs := newFakeStore()
s := newServer(t, fs)
resp := getWithCookie(t, s, nil, "/passwort-zuruecksetzen/nicht-existierendes-token")
if resp.Code != http.StatusNotFound {
t.Fatalf("status = %d, want 404", resp.Code)
}
}