package web_test import ( "context" "net/http" "net/url" "strings" "testing" ) func TestMitarbeiterCannotAccessNutzerverwaltung(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/nutzer") if resp.Code != http.StatusNotFound { t.Fatalf("status = %d, want 404 for role mitarbeiter on /verwaltung/nutzer", resp.Code) } } func TestAdminCanCreateUserWithMandantenRolle(t *testing.T) { fs := newFakeStore() s := newServer(t, fs) adminCookie := seedAccountWithRole(t, fs, "Test-Mandant", "admin@example.com", "admin") resp := postForm(t, s, adminCookie, "/verwaltung/nutzer", url.Values{ "email": {"neu@example.com"}, "password": {"ein-langes-passwort"}, "role": {"verantwortlicher"}, }) if resp.Code != http.StatusSeeOther { t.Fatalf("status = %d, want 303, body: %s", resp.Code, resp.Body.String()) } u, err := fs.GetUserByEmail(context.Background(), "neu@example.com") if err != nil { t.Fatalf("GetUserByEmail: %v", err) } if u.Role != "verantwortlicher" { t.Errorf("Role = %q, want verantwortlicher", u.Role) } list := getWithCookie(t, s, adminCookie, "/verwaltung/nutzer") if !strings.Contains(list.Body.String(), "neu@example.com") { t.Errorf("expected the new user in the Nutzerliste, got: %s", list.Body.String()) } } func TestAdminCannotCreateBetreiberUser(t *testing.T) { fs := newFakeStore() s := newServer(t, fs) adminCookie := seedAccountWithRole(t, fs, "Test-Mandant", "admin@example.com", "admin") resp := postForm(t, s, adminCookie, "/verwaltung/nutzer", url.Values{ "email": {"versuch@example.com"}, "password": {"ein-langes-passwort"}, "role": {"betreiber"}, }) if resp.Code != http.StatusOK { t.Fatalf("status = %d, want 200 (Formular mit Fehler) for role betreiber", resp.Code) } if _, err := fs.GetUserByEmail(context.Background(), "versuch@example.com"); err == nil { t.Error("expected no user to be created for an invalid role") } } func TestAdminCreateUserRejectsDuplicateEmail(t *testing.T) { fs := newFakeStore() s := newServer(t, fs) adminCookie := seedAccountWithRole(t, fs, "Test-Mandant", "admin@example.com", "admin") resp := postForm(t, s, adminCookie, "/verwaltung/nutzer", url.Values{ "email": {"admin@example.com"}, "password": {"ein-langes-passwort"}, "role": {"mitarbeiter"}, }) if resp.Code != http.StatusOK { t.Fatalf("status = %d, want 200 (Formular mit Fehler) for duplicate email", resp.Code) } }