package main import ( "context" "encoding/json" "net/http" "net/http/httptest" "strings" "testing" "time" "git.cin.su/m/Assistant/adapters/models" "git.cin.su/m/Assistant/contracts/capability" "git.cin.su/m/Assistant/contracts/cognitive" "git.cin.su/m/Assistant/contracts/identity" ) type discoveryTestProvider struct{} func (discoveryTestProvider) Probe(context.Context) models.ProviderProbe { return models.ProviderProbe{Health: capability.HealthAvailable} } func (discoveryTestProvider) Discover(context.Context) ([]models.DiscoveredModel, models.ProviderProbe) { return []models.DiscoveredModel{{ProviderModelID: "local-model", Fingerprint: "fingerprint-1", Capabilities: []capability.ModelCapability{capability.CapabilityAdvisory}}}, models.ProviderProbe{Health: capability.HealthAvailable} } func (discoveryTestProvider) Advise(context.Context, cognitive.AdvisoryRequest) (cognitive.AdvisoryResponse, error) { return cognitive.AdvisoryResponse{}, nil } func TestDiscoveryStatusIsReadOnlyAndDoesNotExposeCredentialMetadata(t *testing.T) { service := discoveryService{ providers: map[string]providerRegistration{"cpu": {ProviderInstanceID: "provider-1", Kind: "openai-compatible-chat-v1", CredentialRef: "credential://must-not-be-returned", Discovery: discoveryTestProvider{}}}, owner: identity.PrincipalID("owner-1"), now: func() time.Time { return time.UnixMilli(1234) }, } response := httptest.NewRecorder() service.handler(response, httptest.NewRequest(http.MethodGet, "/v1/provider-discovery/status", nil)) if response.Code != http.StatusOK { t.Fatalf("status=%d", response.Code) } body := response.Body.String() var result []discoveryStatus if err := json.NewDecoder(strings.NewReader(body)).Decode(&result); err != nil { t.Fatal(err) } if len(result) != 1 || result[0].Provider != "cpu" || result[0].Health != capability.HealthAvailable || len(result[0].Models) != 1 || result[0].ObservedAtUnixMillis != 1234 { t.Fatalf("unexpected discovery status: %+v", result) } if strings.Contains(body, "must-not-be-returned") || strings.Contains(body, "credential://") { t.Fatalf("credential metadata leaked in discovery status: %s", body) } }