package llm import ( "context" "errors" "net/http" "os" "path/filepath" "strings" "testing" "gitea.maximumdirect.net/eric/audita/v3/internal/core/config" ck "go.maximumdirect.net/configkit" ) type rejectingTransport struct{ t *testing.T } func (r rejectingTransport) RoundTrip(*http.Request) (*http.Response, error) { if r.t != nil { r.t.Error("resource inspection contacted a provider") } return nil, errors.New("provider access forbidden") } func TestExplanationYAMLIncludesSafeInheritanceEvidence(t *testing.T) { data := `version: 3 glossary_collections: common: entries: - id: a name: secret-value-not-for-explanation category: character derived: extends: common ` file := filepath.Join(t.TempDir(), "config.yml") if err := os.WriteFile(file, []byte(data), 0600); err != nil { t.Fatal(err) } loaded, err := config.Load(ck.Input{Source: ck.File(file)}, "") if err != nil { t.Fatalf("%v: %+v", err, err.(*ck.LoadError).Diagnostics()) } explanation, err := ExplanationYAML(loaded) if err != nil { t.Fatal(err) } text := string(explanation) if strings.Contains(text, "secret-value-not-for-explanation") { t.Fatal("explanation exposed an effective value") } if !strings.Contains(text, "/glossary_collections/derived/entries") || !strings.Contains(text, "inheritance:") || !strings.Contains(text, "/glossary_collections/common/entries") { t.Fatalf("inherited field evidence missing: %s", text) } } func TestRuntimeInspectionDoesNotRequireCredentialsOrProvider(t *testing.T) { loaded, err := config.Load(ck.Input{Source: ck.NoSource()}, "") if err != nil { t.Fatal(err) } if _, err := NewRuntime(context.Background(), loaded, &http.Client{Transport: rejectingTransport{t}}); err != nil { t.Fatal(err) } if _, err := ExplanationYAML(nil); err == nil { t.Fatal("nil configuration accepted") } }