package pier_test import ( "net/http" "slices" "testing" "git.golem15.com/golem15/summercms/modules/pact" "git.golem15.com/golem15/summercms/modules/pier" ) // TestPRMUsesAdvertisedScopes pins D-04: a verifier that implements // MCPAdvertisedScopes supplies the protected-resource scopes, including a // declared name. func TestPRMUsesAdvertisedScopes(t *testing.T) { declared := []string{"read", "write", "ai", "offline_access", "backend", "acme:read"} app := newApp(t, appSpec{ verifier: advertisedVerifier{scopes: declared}, guards: []pact.MCPGuard{&acmeGuard{}}, }) in := startInstance(t, app, prmPlugin()) got := prmScopes(t, in.srv.URL) if !slices.Equal(got, declared) || !slices.Contains(got, "acme:read") { t.Fatalf("PRM scopes = %v, want %v", got, declared) } } // TestPRMFallsBackToPRMScopes pins D-04: a verifier that does not implement // MCPAdvertisedScopes leaves the fixed list, which includes backend. func TestPRMFallsBackToPRMScopes(t *testing.T) { app := newApp(t, appSpec{ verifier: acmeVerifier{}, guards: []pact.MCPGuard{&acmeGuard{}}, }) in := startInstance(t, app, prmPlugin()) got := prmScopes(t, in.srv.URL) if !slices.Equal(got, pier.PRMScopes) || !slices.Contains(got, "backend") { t.Fatalf("PRM scopes = %v, want %v", got, pier.PRMScopes) } } func prmPlugin() routePlugin { return routePlugin{ id: "test.acme", routes: []testRoute{{ method: http.MethodGet, path: "/acme/items", mw: []string{"acme.auth"}, h: func(http.ResponseWriter, *http.Request) {}, }}, tools: []pact.MCPTool{{ Name: "show", Method: http.MethodGet, Path: "/acme/items", Input: struct{}{}, }}, } }