Schließt eine echte Lücke: der Betreiber-Bereich konnte Accounts
bisher nur lesend anzeigen, eine neue Firma entstand ausschließlich
über die öffentliche Selbstregistrierung. GET/POST
/betreiber/accounts/neu legt jetzt eine Firma samt erstem admin-Login
direkt vom Betreiber aus an (z. B. für vertriebsunterstütztes
Onboarding oder Testkonten) — erzeugt einen audit_log-Eintrag. POST
/betreiber/accounts/{id}/umbenennen korrigiert den Firmennamen
(store.UpdateAccount). Bewusst kein Löschen: ein Hard-Delete würde
gegen die Fremdschlüssel aus antrag/app_user/audit_log laufen und
Historie zerstören — dasselbe Prinzip wie bei Nutzern (deaktivieren
statt löschen), ein Sperren/Deaktivieren für Accounts fehlt aber noch
und hängt an der noch nicht getroffenen Abrechnungsarchitektur.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
99 lines
3.2 KiB
Go
99 lines
3.2 KiB
Go
package web_test
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestBetreiberKannFirmaAnlegen(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
betreiberCookie := seedAccountWithRole(t, fs, "Deklarix Betreiber", "betreiber@example.com", "betreiber")
|
|
|
|
resp := postForm(t, s, betreiberCookie, "/betreiber/accounts", url.Values{
|
|
"account_name": {"Neue Firma GmbH"}, "email": {"admin@neue-firma.example.com"}, "password": {"ein-langes-passwort"},
|
|
})
|
|
if resp.Code != http.StatusSeeOther {
|
|
t.Fatalf("status = %d, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
|
|
user, err := fs.GetUserByEmail(context.Background(), "admin@neue-firma.example.com")
|
|
if err != nil {
|
|
t.Fatalf("GetUserByEmail: %v", err)
|
|
}
|
|
if user.Role != "admin" {
|
|
t.Errorf("Role = %q, want admin", user.Role)
|
|
}
|
|
acc, err := fs.GetAccount(context.Background(), user.AccountID)
|
|
if err != nil {
|
|
t.Fatalf("GetAccount: %v", err)
|
|
}
|
|
if acc.Name != "Neue Firma GmbH" {
|
|
t.Errorf("Name = %q, want Neue Firma GmbH", acc.Name)
|
|
}
|
|
|
|
// Der neue Login funktioniert tatsächlich.
|
|
loginResp := postForm(t, s, nil, "/login", url.Values{
|
|
"email": {"admin@neue-firma.example.com"}, "password": {"ein-langes-passwort"},
|
|
})
|
|
if loginResp.Code != http.StatusSeeOther {
|
|
t.Fatalf("login status = %d, body: %s", loginResp.Code, loginResp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestBetreiberFirmaAnlegenRejectsMissingFields(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
betreiberCookie := seedAccountWithRole(t, fs, "Deklarix Betreiber", "betreiber@example.com", "betreiber")
|
|
|
|
resp := postForm(t, s, betreiberCookie, "/betreiber/accounts", url.Values{"account_name": {"Nur Name"}})
|
|
if resp.Code != http.StatusOK {
|
|
t.Fatalf("status = %d, want 200 (Formular mit Fehler)", resp.Code)
|
|
}
|
|
if !strings.Contains(resp.Body.String(), "Pflicht") {
|
|
t.Errorf("expected a validation error, got: %s", resp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestBetreiberKannFirmaUmbenennen(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
betreiberCookie := seedAccountWithRole(t, fs, "Deklarix Betreiber", "betreiber@example.com", "betreiber")
|
|
acc, err := fs.CreateAccount(context.Background(), "Alter Name")
|
|
if err != nil {
|
|
t.Fatalf("CreateAccount: %v", err)
|
|
}
|
|
|
|
resp := postForm(t, s, betreiberCookie, "/betreiber/accounts/"+acc.ID+"/umbenennen", url.Values{"name": {"Neuer Name"}})
|
|
if resp.Code != http.StatusSeeOther {
|
|
t.Fatalf("status = %d, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
|
|
got, err := fs.GetAccount(context.Background(), acc.ID)
|
|
if err != nil {
|
|
t.Fatalf("GetAccount: %v", err)
|
|
}
|
|
if got.Name != "Neuer Name" {
|
|
t.Errorf("Name = %q, want Neuer Name", got.Name)
|
|
}
|
|
|
|
detail := getWithCookie(t, s, betreiberCookie, "/betreiber/accounts/"+acc.ID)
|
|
if !strings.Contains(detail.Body.String(), "Neuer Name") {
|
|
t.Errorf("expected the new name on the detail page, got: %s", detail.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestMitarbeiterCannotCreateFirma(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
cookie := seedAccountWithRole(t, fs, "Test-Mandant", "mitarbeiter@example.com", "mitarbeiter")
|
|
|
|
resp := getWithCookie(t, s, cookie, "/betreiber/accounts/neu")
|
|
if resp.Code != http.StatusNotFound {
|
|
t.Fatalf("status = %d, want 404 for role mitarbeiter", resp.Code)
|
|
}
|
|
}
|