148 lines
6.7 KiB
Go
148 lines
6.7 KiB
Go
package cognitive_registry_test
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.cin.su/m/Assistant/contracts/capability"
|
|
capabilitydomain "git.cin.su/m/Assistant/modules/capability/domain"
|
|
)
|
|
|
|
func validCandidate() capability.ResolvedCognitiveBinding {
|
|
return capability.ResolvedCognitiveBinding{
|
|
Binding: capability.CognitiveBinding{ID: "binding-1", Revision: 3, CapabilityID: "creator-advisory", OwnerPrincipalID: "principal-1", ProviderInstanceID: "provider-1", ProviderRevision: 2, ModelDescriptorID: "model-1", ModelRevision: 4, DataPolicy: capability.DataPolicyExternalMessageOnly, Qualification: capability.QualificationValidated, Activation: capability.ActivationActive, Health: capability.HealthAvailable, LimitPolicyRef: "limits-1"},
|
|
Provider: capability.ProviderInstance{ID: "provider-1", Revision: 2, Kind: "external-responses-v1", EndpointRef: "endpoint-1", CredentialRef: "credential-1", Enabled: true, Qualification: capability.QualificationValidated, Health: capability.HealthAvailable, ObservedAtUnixMillis: 1},
|
|
Model: capability.ModelDescriptor{ID: "model-1", Revision: 4, ProviderInstanceID: "provider-1", ProviderModelID: "snapshot-1", Fingerprint: "fingerprint-1", MaxContextBytes: 32768, Modalities: []capability.ModelModality{capability.ModalityText}, Capabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, Qualification: capability.QualificationValidated, Health: capability.HealthAvailable, ObservedAtUnixMillis: 1},
|
|
}
|
|
}
|
|
|
|
func requirement() capability.CognitiveRequirement {
|
|
return capability.CognitiveRequirement{CapabilityID: "creator-advisory", OwnerPrincipalID: "principal-1", DataPolicy: capability.DataPolicyExternalMessageOnly, RequiredModalities: []capability.ModelModality{capability.ModalityText}, RequiredCapabilities: []capability.ModelCapability{capability.CapabilityAdvisory}, InputBytes: 100, MaxOutputBytes: 1000}
|
|
}
|
|
|
|
func TestRegisteredButDisabledProviderCannotBeInvoked(t *testing.T) {
|
|
candidate := validCandidate()
|
|
candidate.Provider.Enabled = false
|
|
if _, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{candidate}); err == nil {
|
|
t.Fatal("disabled provider was selected")
|
|
}
|
|
}
|
|
|
|
func TestDiscoveredInactiveBindingCannotBeInvoked(t *testing.T) {
|
|
candidate := validCandidate()
|
|
candidate.Binding.Qualification = capability.QualificationDiscovered
|
|
candidate.Binding.Activation = capability.ActivationInactive
|
|
if _, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{candidate}); err == nil {
|
|
t.Fatal("discovered inactive binding was selected")
|
|
}
|
|
}
|
|
|
|
func TestValidatedActiveBindingCanBeSelected(t *testing.T) {
|
|
selected, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{validCandidate()})
|
|
if err != nil || selected.Binding.ID != "binding-1" {
|
|
t.Fatalf("selected=%+v err=%v", selected, err)
|
|
}
|
|
}
|
|
|
|
func TestRetiredBindingCannotBeInvoked(t *testing.T) {
|
|
candidate := validCandidate()
|
|
candidate.Binding.Activation = capability.ActivationRetired
|
|
if _, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{candidate}); err == nil {
|
|
t.Fatal("retired binding was selected")
|
|
}
|
|
}
|
|
|
|
func TestHealthTransitionsChangeEligibility(t *testing.T) {
|
|
for _, state := range []capability.HealthState{capability.HealthUnknown, capability.HealthDegraded, capability.HealthUnavailable} {
|
|
candidate := validCandidate()
|
|
candidate.Binding.Health = state
|
|
if _, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{candidate}); err == nil {
|
|
t.Fatalf("binding health %s was selected", state)
|
|
}
|
|
}
|
|
if _, err := capabilitydomain.SelectCognitiveBinding(requirement(), []capability.ResolvedCognitiveBinding{validCandidate()}); err != nil {
|
|
t.Fatalf("available binding rejected: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestCreatorWebHasNoConcreteProviderModelOrBindingSelection(t *testing.T) {
|
|
root := filepath.Clean(filepath.Join("..", "..", "cmd", "creator-web"))
|
|
err := filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error {
|
|
if err != nil || entry.IsDir() || strings.HasSuffix(path, "_test.go") {
|
|
return err
|
|
}
|
|
contents, readErr := os.ReadFile(path)
|
|
if readErr != nil {
|
|
return readErr
|
|
}
|
|
lower := strings.ToLower(string(contents))
|
|
for _, forbidden := range []string{"openai", "ollama", "providerbindingid", "advisory_binding_mode", "gpt-"} {
|
|
if strings.Contains(lower, forbidden) {
|
|
t.Errorf("%s contains concrete selection token %q", path, forbidden)
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func TestRegistryPersistenceContainsReferencesNotCredentialMaterial(t *testing.T) {
|
|
for _, path := range []string{filepath.Join("..", "..", "database", "migrations", "012_capability_cognitive_registry.sql"), filepath.Join("..", "..", "contracts", "capability", "cognitive_registry.go")} {
|
|
contents, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
lower := strings.ToLower(string(contents))
|
|
if !strings.Contains(lower, "credentialref") && !strings.Contains(lower, "credential_ref") {
|
|
t.Fatalf("%s lacks credential reference", path)
|
|
}
|
|
for _, forbidden := range []string{"api_key", "access_token", "credential_bytes", "plaintext_password"} {
|
|
if strings.Contains(lower, forbidden) {
|
|
t.Fatalf("%s stores forbidden credential material field %q", path, forbidden)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMigrationUsesOnlyCapabilityOwnerRoleAndSchema(t *testing.T) {
|
|
path := filepath.Join("..", "..", "database", "migrations", "012_capability_cognitive_registry.sql")
|
|
contents, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
lower := strings.ToLower(string(contents))
|
|
if strings.Count(lower, "set role capability_role") != 1 {
|
|
t.Fatal("migration must execute under capability_role")
|
|
}
|
|
for _, schema := range []string{"authority.", "commit.", "continuity.", "identity.", "situation.", "work."} {
|
|
if strings.Contains(lower, schema) {
|
|
t.Fatalf("migration touches foreign owner schema %s", schema)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestAuthorityAndCommitRemainCognitiveIndependent(t *testing.T) {
|
|
for _, directory := range []string{"authority", "commit"} {
|
|
for _, parent := range []string{"contracts", "modules"} {
|
|
root := filepath.Join("..", "..", parent, directory)
|
|
_ = filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error {
|
|
if err != nil || entry.IsDir() {
|
|
return err
|
|
}
|
|
contents, readErr := os.ReadFile(path)
|
|
if readErr != nil {
|
|
return readErr
|
|
}
|
|
if strings.Contains(string(contents), "contracts/cognitive") || strings.Contains(string(contents), "cognitive_registry") {
|
|
t.Errorf("%s depends on cognitive registry", path)
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
}
|
|
}
|