Löst einen Blocker im Kernablauf: eine frisch registrierte Firma hat nur einen admin-Login und konnte damit bislang keinen einzigen eingereichten Antrag sehen oder entscheiden, weil requireFachebene nur verantwortlicher/pruefer durchließ. Die Spezifikation will admin+ KI-Verantwortlicher ohnehin auf derselben Person (siehe CLAUDE.md, Offene Punkte) — statt eines Datenmodell-Umbaus (roles-Array oder zwei app_user-Zeilen pro Person) bekommt admin jetzt pragmatisch dieselben Fachebene-Rechte wie verantwortlicher (hatEntscheidungsrecht in fachebene_handlers.go). pruefer bleibt unverändert nur lesend. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
73 lines
2.3 KiB
Go
73 lines
2.3 KiB
Go
package web_test
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// TestAdminHatFachebeneRechte prüft die pragmatische Lösung für "Admin
|
|
// und KI-Verantwortlicher auf derselben Person" (siehe CLAUDE.md,
|
|
// Offene Punkte / requireFachebene): ein admin sieht den Posteingang
|
|
// und kann entscheiden, genau wie ein verantwortlicher.
|
|
func TestAdminSiehtPosteingang(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
_, adminCookie := seedFallImAccount(t, fs, s, "admin")
|
|
|
|
resp := getWithCookie(t, s, adminCookie, "/faelle")
|
|
if resp.Code != http.StatusOK {
|
|
t.Fatalf("status = %d, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
if !strings.Contains(resp.Body.String(), "Angebotstexte generieren") {
|
|
t.Errorf("expected the open antrag in the Posteingang, got: %s", resp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestAdminSiehtEntscheidenFormular(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
antragID, adminCookie := seedFallImAccount(t, fs, s, "admin")
|
|
|
|
resp := getWithCookie(t, s, adminCookie, "/faelle/"+antragID)
|
|
if resp.Code != http.StatusOK {
|
|
t.Fatalf("status = %d, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
if !strings.Contains(resp.Body.String(), `name="entscheidung"`) {
|
|
t.Errorf("expected the Entscheiden form for admin, got: %s", resp.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestAdminKannEntscheiden(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
antragID, adminCookie := seedFallImAccount(t, fs, s, "admin")
|
|
|
|
resp := postForm(t, s, adminCookie, "/faelle/"+antragID+"/entscheiden", url.Values{"entscheidung": {"rueckfrage"}})
|
|
if resp.Code != http.StatusSeeOther {
|
|
t.Fatalf("status = %d, body: %s", resp.Code, resp.Body.String())
|
|
}
|
|
antrag, err := fs.GetAntrag(context.Background(), antragID)
|
|
if err != nil {
|
|
t.Fatalf("GetAntrag: %v", err)
|
|
}
|
|
if antrag.Status != "entschieden" {
|
|
t.Errorf("Status = %q, want entschieden", antrag.Status)
|
|
}
|
|
}
|
|
|
|
func TestAdminSiehtRegisterUndWiedervorlage(t *testing.T) {
|
|
fs := newFakeStore()
|
|
s := newServer(t, fs)
|
|
adminCookie := seedAccountWithRole(t, fs, "Test-Mandant", "admin@example.com", "admin")
|
|
|
|
for _, path := range []string{"/registereintraege", "/wiedervorlage"} {
|
|
resp := getWithCookie(t, s, adminCookie, path)
|
|
if resp.Code != http.StatusOK {
|
|
t.Errorf("GET %s status = %d, want 200 for admin", path, resp.Code)
|
|
}
|
|
}
|
|
}
|