test(32.1-05): keep implied MCP scopes off the subject

- MCPDispatch expands the credential and leaves subject.Scopes unchanged
This commit is contained in:
2026-10-28 16:10:03 +01:00
parent 193a381ece
commit 756797c2c4

View File

@@ -154,6 +154,30 @@ func TestMCPImpliesWriteDoesNotGrantRead(t *testing.T) {
}
}
// TestMCPImpliesNotPersisted pins that MCPDispatch expands scopes only on
// the credential it returns. The subject's grant slice is the same backing
// array afterwards.
func TestMCPImpliesNotPersisted(t *testing.T) {
_, guard := impliesApp(t, impliesServersRead())
ctx := context.Background()
subject := pact.MCPSubject{Guard: "user", UserID: 7, ClientID: "oauth-client", Scopes: []string{"read"}}
orig := subject.Scopes
dispatch, err := guard.MCPDispatch(ctx, subject, "GET")
if err != nil {
t.Fatal(err)
}
credential, isToken := dispatch.Credential.(*models.APIToken)
if !isToken || !credential.HasScope("servers:read") || !credential.HasScope("read") {
t.Fatalf("credential = %+v, want the expanded scopes on the credential only", dispatch.Credential)
}
if len(subject.Scopes) != 1 || &subject.Scopes[0] != &orig[0] || subject.Scopes[0] != "read" {
t.Fatalf("subject.Scopes = %v, want the original grant slice", subject.Scopes)
}
if slices.Contains(subject.Scopes, "servers:read") {
t.Fatal("implied name was written onto subject.Scopes")
}
}
// TestMCPImpliesAlreadyPresent does not append a declared name the grant
// already holds, and does not append a catalog name whose Implies is empty.
func TestMCPImpliesAlreadyPresent(t *testing.T) {