Files
nexarch/dms/internal/modulecall/modulecall_test.go
patrickandClaude Sonnet 5 8686423112
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
INT-16: tenant-kontext in modul-rueckkanaelen (modulecall, retentionclient, destroy-callback)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 00:20:27 +02:00

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)
}
}