package cognitive_providers_test import ( "context" "io" "net/http" "net/http/httptest" "strings" "testing" "git.cin.su/m/Assistant/adapters/models" "git.cin.su/m/Assistant/contracts/capability" capabilitydomain "git.cin.su/m/Assistant/modules/capability/domain" ) func TestCPUDiscoveryIsReadOnlyAndCredentialFree(t *testing.T) { requests := 0 server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { requests++ if r.Method != http.MethodGet || r.URL.Path != "/v1/models" || r.Header.Get("Authorization") != "" { t.Fatalf("unexpected request %s %s auth=%q", r.Method, r.URL.Path, r.Header.Get("Authorization")) } _, _ = io.WriteString(w, `{"data":[{"id":"same-name","created":`+string(rune('0'+requests))+`,"owned_by":"local","meta":{"n_ctx":2048,"n_params":3,"size":10,"ftype":"Q4"}}]}`) })) defer server.Close() adapter, err := models.NewOpenAICompatibleLocalAdapter(server.URL+"/v1", nil) if err != nil { t.Fatal(err) } discovered, probe := adapter.Discover(context.Background()) if probe.Health != capability.HealthAvailable || len(discovered) != 1 || requests != 1 { t.Fatalf("probe=%+v models=%+v requests=%d", probe, discovered, requests) } second, probe := adapter.Discover(context.Background()) if probe.Health != capability.HealthAvailable || len(second) != 1 || second[0].Fingerprint != discovered[0].Fingerprint { t.Fatalf("volatile created field changed fingerprint: %s != %s", second[0].Fingerprint, discovered[0].Fingerprint) } } func TestOllamaDiscoveryDoesNotRunInference(t *testing.T) { paths := []string{} server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { paths = append(paths, r.URL.Path) switch r.URL.Path { case "/api/version": _, _ = io.WriteString(w, `{"version":"1.2.3"}`) case "/api/tags": _, _ = io.WriteString(w, `{"models":[{"name":"same-name","model":"same-name","size":20,"digest":"digest-a","details":{"format":"gguf","quantization_level":"Q4","context_length":4096},"capabilities":["completion"]}]}`) default: t.Fatalf("unexpected expensive endpoint %s", r.URL.Path) } })) defer server.Close() adapter, err := models.NewOllamaAdapter(server.URL, nil) if err != nil { t.Fatal(err) } discovered, probe := adapter.Discover(context.Background()) if probe.Health != capability.HealthAvailable || len(discovered) != 1 || strings.Join(paths, ",") != "/api/version,/api/tags" { t.Fatalf("probe=%+v models=%+v paths=%v", probe, discovered, paths) } } func TestDiscoveryIsIdempotentAndProviderScoped(t *testing.T) { base := capability.CognitiveDiscoverySnapshot{ProviderInstanceID: "cpu", ProviderKind: "kind", EndpointRef: "endpoint", Enabled: true, OwnerPrincipalID: "owner", CapabilityID: "creator-advisory", DataPolicy: capability.DataPolicyLocalOnly, LimitPolicyRef: "limits", Health: capability.HealthAvailable, ObservedAtUnixMillis: 1, Models: []capability.DiscoveredModelSnapshot{{ProviderModelID: "same-name", Fingerprint: "digest-a", MaxContextBytes: 100, Modalities: []capability.ModelModality{capability.ModalityText}, Capabilities: []capability.ModelCapability{capability.CapabilityUnknown}, Installed: capability.OperationalYes, Loaded: capability.OperationalNotObserved, Invokable: capability.OperationalNotObserved}}} first, err := capabilitydomain.BuildDiscoveryRegistration(base) if err != nil { t.Fatal(err) } second, err := capabilitydomain.BuildDiscoveryRegistration(base) if err != nil { t.Fatal(err) } if first.Models[0].ID != second.Models[0].ID || first.Models[0].Revision != second.Models[0].Revision || first.Bindings[0].Activation != capability.ActivationInactive { t.Fatalf("discovery not idempotent/inactive: %+v %+v", first, second) } gpu := base gpu.ProviderInstanceID = "gpu" other, _ := capabilitydomain.BuildDiscoveryRegistration(gpu) if first.Models[0].ID == other.Models[0].ID { t.Fatal("same model name collided across providers") } changed := base changed.Models = append([]capability.DiscoveredModelSnapshot(nil), base.Models...) changed.Models[0].Fingerprint = "digest-b" revision, _ := capabilitydomain.BuildDiscoveryRegistration(changed) if revision.Models[0].Revision == first.Models[0].Revision { t.Fatal("digest change silently reused revision") } }