Auf Nutzerfeedback: die erste Version zeigte alle bekannten Vorlagen als
gestapelte Formulare auf einer Seite. Jetzt wie Werkzeugkatalog/
Nutzerverwaltung: eine Liste (GET .../email-vorlagen) mit Klick auf eine
eigene Bearbeiten-Seite je Typ (GET/POST .../email-vorlagen/{typ}) -
skaliert sauber, wenn mit der Zeit weitere Benachrichtigungstypen
dazukommen, statt eine immer länger werdende Formular-Stapel-Seite.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
114 lines
4.6 KiB
Go
114 lines
4.6 KiB
Go
package web_test
|
|
|
|
import (
|
|
"net/http"
|
|
"net/url"
|
|
"regexp"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestAdminKannEigeneEmailVorlageSpeichernUndZuruecksetzen(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Test-Mandant", "admin@example.com", "admin")
|
|
|
|
listResp := getWithCookie(t, s, cookie, "/verwaltung/email-vorlagen")
|
|
if listResp.Code != http.StatusOK {
|
|
t.Fatalf("Liste-Status = %d, want 200", listResp.Code)
|
|
}
|
|
if !strings.Contains(listResp.Body.String(), "/verwaltung/email-vorlagen/passwort_zuruecksetzen") {
|
|
t.Fatalf("erwartet Link zur Bearbeiten-Seite, body: %s", listResp.Body.String())
|
|
}
|
|
|
|
getResp := getWithCookie(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen")
|
|
if getResp.Code != http.StatusOK {
|
|
t.Fatalf("GET Bearbeiten-Seite status = %d, want 200", getResp.Code)
|
|
}
|
|
if !strings.Contains(getResp.Body.String(), "Plattform-Standard, nicht angepasst") {
|
|
t.Fatalf("erwartet Hinweis auf geerbten Plattform-Standard, body: %s", getResp.Body.String())
|
|
}
|
|
|
|
saveResp := postForm(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen", url.Values{
|
|
"betreff": {"Mein eigener Betreff"}, "text": {"Mein eigener Text {{link}}"},
|
|
})
|
|
if saveResp.Code != http.StatusSeeOther {
|
|
t.Fatalf("save status = %d, want 303, body: %s", saveResp.Code, saveResp.Body.String())
|
|
}
|
|
|
|
afterResp := getWithCookie(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen")
|
|
body := afterResp.Body.String()
|
|
if !strings.Contains(body, "Mein eigener Betreff") {
|
|
t.Fatalf("gespeicherter Betreff fehlt, body: %s", body)
|
|
}
|
|
if !strings.Contains(body, "(eigene Vorlage)") {
|
|
t.Fatalf("erwartet Hinweis auf eigene Vorlage, body: %s", body)
|
|
}
|
|
|
|
resetResp := postForm(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen/zuruecksetzen", url.Values{})
|
|
if resetResp.Code != http.StatusSeeOther {
|
|
t.Fatalf("reset status = %d, want 303", resetResp.Code)
|
|
}
|
|
finalResp := getWithCookie(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen")
|
|
if strings.Contains(finalResp.Body.String(), "Mein eigener Betreff") {
|
|
t.Fatal("nach Zurücksetzen ist die eigene Vorlage immer noch aktiv")
|
|
}
|
|
}
|
|
|
|
func TestBetreiberKannPlattformStandardBearbeiten(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Betreiber-Firma", "betreiber@example.com", "betreiber")
|
|
|
|
saveResp := postForm(t, s, cookie, "/betreiber/email-vorlagen/passwort_zuruecksetzen", url.Values{
|
|
"betreff": {"Neuer Plattform-Betreff"}, "text": {"Neuer Plattform-Text {{link}}"},
|
|
})
|
|
if saveResp.Code != http.StatusSeeOther {
|
|
t.Fatalf("save status = %d, want 303, body: %s", saveResp.Code, saveResp.Body.String())
|
|
}
|
|
|
|
getResp := getWithCookie(t, s, cookie, "/betreiber/email-vorlagen/passwort_zuruecksetzen")
|
|
if !strings.Contains(getResp.Body.String(), "Neuer Plattform-Betreff") {
|
|
t.Fatalf("neuer Plattform-Standard fehlt, body: %s", getResp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestNichtAdminKannEmailVorlagenNichtBearbeiten(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Test-Mandant", "mitarbeiter@example.com", "mitarbeiter")
|
|
|
|
resp := getWithCookie(t, s, cookie, "/verwaltung/email-vorlagen")
|
|
if resp.Code != http.StatusNotFound {
|
|
t.Fatalf("status = %d, want 404", resp.Code)
|
|
}
|
|
}
|
|
|
|
func TestPasswortVergessenNutztMandantenspezifischeVorlage(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s, fm := newServerWithMailer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Vorlage-Firma", "vorlage-admin@example.com", "admin")
|
|
|
|
if resp := postForm(t, s, cookie, "/verwaltung/email-vorlagen/passwort_zuruecksetzen", url.Values{
|
|
"betreff": {"Firmenspezifischer Betreff"}, "text": {"Hallo! Link: {{link}} Ende."},
|
|
}); resp.Code != http.StatusSeeOther {
|
|
t.Fatalf("save status = %d, want 303", resp.Code)
|
|
}
|
|
|
|
if resp := postForm(t, s, nil, "/passwort-vergessen", url.Values{"email": {"vorlage-admin@example.com"}}); resp.Code != http.StatusOK {
|
|
t.Fatalf("passwort-vergessen status = %d, want 200", resp.Code)
|
|
}
|
|
if len(fm.Sent) != 1 {
|
|
t.Fatalf("got %d gesendete Mails, want 1", len(fm.Sent))
|
|
}
|
|
if fm.Sent[0].Subject != "Firmenspezifischer Betreff" {
|
|
t.Fatalf("Subject = %q, want die firmenspezifische Vorlage", fm.Sent[0].Subject)
|
|
}
|
|
if !strings.Contains(fm.Sent[0].Body, "Hallo! Link: ") || strings.Contains(fm.Sent[0].Body, "{{link}}") {
|
|
t.Fatalf("Body = %q, want Platzhalter ersetzt und Rest der eigenen Vorlage erhalten", fm.Sent[0].Body)
|
|
}
|
|
if !regexp.MustCompile(`/passwort-zuruecksetzen/[a-f0-9]+`).MatchString(fm.Sent[0].Body) {
|
|
t.Fatalf("kein Reset-Link im Body gefunden: %q", fm.Sent[0].Body)
|
|
}
|
|
}
|