CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
package modulecall
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestApplyRequiresTenantAndBindsToInstance(t *testing.T) {
|
|
newReq := func() *http.Request { return httptest.NewRequest(http.MethodPost, "/x", nil) }
|
|
cases := []struct {
|
|
name string
|
|
tc Context
|
|
instance string
|
|
want error
|
|
}{
|
|
{"ok", Context{Tenant: "acme", User: "u1"}, "acme", nil},
|
|
{"ok ohne nutzer", Context{Tenant: "acme"}, "acme", nil},
|
|
{"tenant fehlt", Context{}, "acme", ErrTenantRequired},
|
|
{"instanz ohne tenant", Context{Tenant: "acme"}, "", ErrTenantRequired},
|
|
{"fremder tenant", Context{Tenant: "globex"}, "acme", ErrTenantMismatch},
|
|
{"nutzer mit steuerzeichen", Context{Tenant: "acme", User: "u\n1"}, "acme", ErrTenantRequired},
|
|
{"tenant zu lang", Context{Tenant: strings.Repeat("a", 129)}, strings.Repeat("a", 129), ErrTenantRequired},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
req := newReq()
|
|
err := Apply(req, c.tc, c.instance)
|
|
if !errors.Is(err, c.want) {
|
|
t.Fatalf("err = %v, want %v", err, c.want)
|
|
}
|
|
if err == nil && req.Header.Get(HeaderTenant) != c.tc.Tenant {
|
|
t.Fatalf("header = %q", req.Header.Get(HeaderTenant))
|
|
}
|
|
if err != nil && req.Header.Get(HeaderTenant) != "" {
|
|
t.Fatal("header trotz fehler gesetzt")
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestFromRequest(t *testing.T) {
|
|
req := func(tenant string) *http.Request {
|
|
r := httptest.NewRequest(http.MethodPost, "/x", nil)
|
|
if tenant != "" {
|
|
r.Header.Set(HeaderTenant, tenant)
|
|
}
|
|
r.Header.Set(HeaderUser, "u1")
|
|
return r
|
|
}
|
|
tc, err := FromRequest(req("acme"), "acme")
|
|
if err != nil || tc.Tenant != "acme" || tc.User != "u1" {
|
|
t.Fatalf("tc = %+v, err = %v", tc, err)
|
|
}
|
|
if _, err := FromRequest(req(""), "acme"); !errors.Is(err, ErrTenantRequired) {
|
|
t.Fatalf("err = %v", err)
|
|
}
|
|
if tc, err := FromRequest(req("globex"), "acme"); !errors.Is(err, ErrTenantMismatch) || tc.Tenant != "globex" {
|
|
t.Fatalf("tc = %+v, err = %v", tc, err)
|
|
}
|
|
if _, err := FromRequest(req("acme"), ""); !errors.Is(err, ErrTenantRequired) {
|
|
t.Fatalf("err = %v", err)
|
|
}
|
|
}
|