test: TestTurnstileRoutes pins golem15.user.turnstile per mode
Replaces TestTurnstileRoutesSmoke: empty adds nothing; open, closed and a
space-padded closed add turnstile:{mode} to POST login and register only,
every other route keeps its middleware; invalid values fail naming the key.
This commit is contained in:
@@ -88,7 +88,12 @@ func turnstileOf(route recordedRoute) []string {
|
||||
return out
|
||||
}
|
||||
|
||||
func TestTurnstileRoutesSmoke(t *testing.T) {
|
||||
// TestTurnstileRoutes pins golem15.user.turnstile (D-07): empty adds no
|
||||
// middleware; open and closed (surrounding spaces trimmed) append
|
||||
// turnstile:{mode} to POST /_user/api/v1/login and /register only, leaving
|
||||
// every other route's middleware as it is with the key empty; any other
|
||||
// value fails Routes naming the key.
|
||||
func TestTurnstileRoutes(t *testing.T) {
|
||||
off, err := recordUserRoutes(t, "")
|
||||
if err != nil {
|
||||
t.Fatalf("empty turnstile: Routes error %v", err)
|
||||
@@ -96,51 +101,58 @@ func TestTurnstileRoutesSmoke(t *testing.T) {
|
||||
if len(off) == 0 {
|
||||
t.Fatal("no routes recorded")
|
||||
}
|
||||
guarded := map[string]bool{
|
||||
http.MethodPost + " /_user/api/v1/login": true,
|
||||
http.MethodPost + " /_user/api/v1/register": true,
|
||||
}
|
||||
seen := 0
|
||||
for _, route := range off {
|
||||
if got := turnstileOf(route); len(got) > 0 {
|
||||
t.Errorf("empty turnstile: %s %s carries %v", route.method, route.path, got)
|
||||
}
|
||||
}
|
||||
|
||||
closed, err := recordUserRoutes(t, "closed")
|
||||
if err != nil {
|
||||
t.Fatalf("closed turnstile: Routes error %v", err)
|
||||
}
|
||||
if len(closed) != len(off) {
|
||||
t.Fatalf("closed turnstile: %d routes, want %d", len(closed), len(off))
|
||||
}
|
||||
guarded := map[string]bool{"/_user/api/v1/login": true, "/_user/api/v1/register": true}
|
||||
for i, route := range closed {
|
||||
got := turnstileOf(route)
|
||||
if guarded[route.path] && route.method == http.MethodPost {
|
||||
if len(got) != 1 || got[0] != "turnstile:closed" {
|
||||
t.Errorf("closed turnstile: POST %s middleware %v, want one turnstile:closed", route.path, route.middleware)
|
||||
}
|
||||
if strings.Join(route.middleware[:len(route.middleware)-1], ",") != strings.Join(off[i].middleware, ",") {
|
||||
t.Errorf("closed turnstile: POST %s middleware %v, want %v plus turnstile:closed", route.path, route.middleware, off[i].middleware)
|
||||
}
|
||||
continue
|
||||
}
|
||||
if route.method != off[i].method || route.path != off[i].path ||
|
||||
strings.Join(route.middleware, ",") != strings.Join(off[i].middleware, ",") {
|
||||
t.Errorf("closed turnstile: %s %s %v changed from %s %s %v",
|
||||
route.method, route.path, route.middleware, off[i].method, off[i].path, off[i].middleware)
|
||||
if guarded[route.method+" "+route.path] {
|
||||
seen++
|
||||
}
|
||||
}
|
||||
|
||||
open, err := recordUserRoutes(t, "open")
|
||||
if err != nil {
|
||||
t.Fatalf("open turnstile: Routes error %v", err)
|
||||
if seen != len(guarded) {
|
||||
t.Fatalf("found %d of the guarded routes, want %d", seen, len(guarded))
|
||||
}
|
||||
for _, route := range open {
|
||||
if guarded[route.path] {
|
||||
if got := turnstileOf(route); len(got) != 1 || got[0] != "turnstile:open" {
|
||||
t.Errorf("open turnstile: %s middleware %v", route.path, route.middleware)
|
||||
|
||||
cases := []struct {
|
||||
name, mode, want string
|
||||
}{
|
||||
{name: "open", mode: "open", want: "turnstile:open"},
|
||||
{name: "closed", mode: "closed", want: "turnstile:closed"},
|
||||
{name: "closed with spaces", mode: " closed ", want: "turnstile:closed"},
|
||||
}
|
||||
for _, c := range cases {
|
||||
t.Run(c.name, func(t *testing.T) {
|
||||
got, err := recordUserRoutes(t, c.mode)
|
||||
if err != nil {
|
||||
t.Fatalf("Routes error %v", err)
|
||||
}
|
||||
}
|
||||
if len(got) != len(off) {
|
||||
t.Fatalf("%d routes, want %d", len(got), len(off))
|
||||
}
|
||||
for i, route := range got {
|
||||
base := off[i]
|
||||
if route.method != base.method || route.path != base.path {
|
||||
t.Fatalf("route %d is %s %s, want %s %s", i, route.method, route.path, base.method, base.path)
|
||||
}
|
||||
want := base.middleware
|
||||
if guarded[route.method+" "+route.path] {
|
||||
want = append(append([]string{}, base.middleware...), c.want)
|
||||
}
|
||||
if strings.Join(route.middleware, ",") != strings.Join(want, ",") {
|
||||
t.Errorf("%s %s middleware %v, want %v", route.method, route.path, route.middleware, want)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
if _, err := recordUserRoutes(t, "bogus"); err == nil || !strings.Contains(err.Error(), "golem15.user.turnstile") {
|
||||
t.Fatalf("bogus turnstile: error %v, want one naming golem15.user.turnstile", err)
|
||||
for _, bad := range []string{"bogus", "Closed", "on", "true"} {
|
||||
if _, err := recordUserRoutes(t, bad); err == nil || !strings.Contains(err.Error(), "golem15.user.turnstile") {
|
||||
t.Errorf("turnstile %q: error %v, want one naming golem15.user.turnstile", bad, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user