68 lines
3.1 KiB
Go
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")
|
|
}
|
|
}
|