Files
Assistant/tests/cognitive_advisory/contract_test.go
m f9cdd67229
CI / test (push) Successful in 12s
CI / test (pull_request) Successful in 11s
feat: add cognitive advisory contract
2026-08-16 20:05:12 +03:00

68 lines
3.1 KiB
Go

package cognitive_advisory_test
import (
"encoding/json"
"strings"
"testing"
"git.cin.su/m/Assistant/adapters/models"
"git.cin.su/m/Assistant/contracts/authority"
"git.cin.su/m/Assistant/contracts/capability"
"git.cin.su/m/Assistant/contracts/cognitive"
"git.cin.su/m/Assistant/contracts/identity"
"git.cin.su/m/Assistant/platform/ids"
)
func validRequest() cognitive.AdvisoryRequest {
return cognitive.AdvisoryRequest{Version: cognitive.CreatorAdvisoryV1, RequestID: cognitive.RequestID(ids.ID("request-1")), ActorID: identity.ActorID(ids.ID("actor")), PrincipalID: identity.PrincipalID(ids.ID("principal")), ScopeID: authority.ScopeID(ids.ID("scope")), Message: "What should I review?", Context: []cognitive.ContextExcerpt{{ID: cognitive.ContextExcerptID(ids.ID("excerpt-1")), SourceKind: "prospective-item", SourceID: "item-1", Revision: 1, Sensitivity: cognitive.SensitivityPrivateAllowed, Text: "Review tomorrow"}}, Locale: "en", MaxOutputBytes: 4096, ProviderBindingID: capability.CapabilityBindingID(ids.ID("fake-binding")), ProviderBindingRevision: 1}
}
func TestDeterministicAdvisoryIsExplicitlyUnavailable(t *testing.T) {
request := validRequest()
response, err := models.DeterministicAdvisoryUnavailable(request)
if err != nil {
t.Fatal(err)
}
if response.FinishReason != cognitive.FinishProviderUnavailable || response.AdvisoryText != "" {
t.Fatalf("unexpected fake response: %+v", response)
}
if err := models.ValidateAdvisoryResponse(request, response); err != nil {
t.Fatal(err)
}
raw, err := json.Marshal(response)
if err != nil {
t.Fatal(err)
}
for _, forbidden := range []string{"ActionProposal", "ToolCall", "AuthorityGrant"} {
if strings.Contains(string(raw), forbidden) {
t.Fatalf("response contains forbidden field %s", forbidden)
}
}
}
func TestAdvisoryRejectsUnsafeContextAndCitations(t *testing.T) {
tests := []struct {
name string
mutate func(*cognitive.AdvisoryRequest)
}{
{"secret", func(r *cognitive.AdvisoryRequest) { r.Context[0].Sensitivity = cognitive.SensitivitySecret }},
{"unknown", func(r *cognitive.AdvisoryRequest) { r.Context[0].Sensitivity = cognitive.SensitivityUnknown }},
{"duplicate", func(r *cognitive.AdvisoryRequest) { r.Context = append(r.Context, r.Context[0]) }},
{"oversized-message", func(r *cognitive.AdvisoryRequest) { r.Message = strings.Repeat("x", models.MaxAdvisoryMessageBytes+1) }},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
request := validRequest()
test.mutate(&request)
if err := models.ValidateAdvisoryRequest(request); err == nil {
t.Fatal("unsafe request accepted")
}
})
}
request := validRequest()
response := cognitive.AdvisoryResponse{Version: cognitive.CreatorAdvisoryV1, RequestID: request.RequestID, ProviderBindingID: request.ProviderBindingID, ProviderBindingRevision: 1, AdvisoryText: "answer", ReferencedExcerptIDs: []cognitive.ContextExcerptID{cognitive.ContextExcerptID(ids.ID("not-supplied"))}, FinishReason: cognitive.FinishCompleted}
if err := models.ValidateAdvisoryResponse(request, response); err == nil {
t.Fatal("unknown citation accepted")
}
}