116 lines
4.4 KiB
Go
116 lines
4.4 KiB
Go
package config
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/notarius/internal/framework/contracts"
|
|
"gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline"
|
|
)
|
|
|
|
func TestRedactedConfigRemovesAPIKeyValues(t *testing.T) {
|
|
cfg := Default()
|
|
cfg.LLMProfiles[pipeline.DefaultLLMProfile] = LLMProfile{
|
|
Provider: "openai-compatible",
|
|
BaseURL: "https://example.invalid/v1",
|
|
Model: "test-model",
|
|
APIKey: "secret",
|
|
APIKeyEnv: "NOTARIUS_TEST_API_KEY",
|
|
TimeoutSeconds: 600,
|
|
MaxRetries: 3,
|
|
MaxConcurrency: 1,
|
|
}
|
|
cfg.LLMProfiles["other"] = LLMProfile{APIKey: "other-secret", Model: "other-model"}
|
|
|
|
redacted := cfg.Redacted()
|
|
|
|
if redacted.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != redactedSecret {
|
|
t.Fatalf("expected default API key redacted, got %+v", redacted.LLMProfiles[pipeline.DefaultLLMProfile])
|
|
}
|
|
if redacted.LLMProfiles["other"].APIKey != redactedSecret {
|
|
t.Fatalf("expected other API key redacted, got %+v", redacted.LLMProfiles["other"])
|
|
}
|
|
if redacted.LLMProfiles[pipeline.DefaultLLMProfile].Model != "test-model" {
|
|
t.Fatalf("expected non-secret fields preserved, got %+v", redacted.LLMProfiles[pipeline.DefaultLLMProfile])
|
|
}
|
|
if cfg.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != "secret" {
|
|
t.Fatalf("redaction mutated original config")
|
|
}
|
|
}
|
|
|
|
func TestConfigRedactedDiagnosticsPayloadRedactsAPIKeys(t *testing.T) {
|
|
cfg := Default()
|
|
profile := cfg.LLMProfiles[pipeline.DefaultLLMProfile]
|
|
profile.APIKey = "secret"
|
|
profile.Model = "test-model"
|
|
cfg.LLMProfiles[pipeline.DefaultLLMProfile] = profile
|
|
|
|
payload, ok := cfg.RedactedDiagnosticsPayload().(Config)
|
|
if !ok {
|
|
t.Fatalf("expected Config payload, got %T", cfg.RedactedDiagnosticsPayload())
|
|
}
|
|
if payload.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != redactedSecret {
|
|
t.Fatalf("expected API key redacted, got %+v", payload.LLMProfiles[pipeline.DefaultLLMProfile])
|
|
}
|
|
if payload.LLMProfiles[pipeline.DefaultLLMProfile].Model != "test-model" {
|
|
t.Fatalf("expected non-secret fields preserved, got %+v", payload.LLMProfiles[pipeline.DefaultLLMProfile])
|
|
}
|
|
if cfg.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != "secret" {
|
|
t.Fatalf("redacted diagnostics payload mutated original config")
|
|
}
|
|
}
|
|
|
|
func TestEffectiveConfigRedactedDiagnosticsPayloadRedactsAndCopies(t *testing.T) {
|
|
cfg := validConfig()
|
|
profile := cfg.LLMProfiles[pipeline.DefaultLLMProfile]
|
|
profile.APIKey = "secret"
|
|
cfg.LLMProfiles[pipeline.DefaultLLMProfile] = profile
|
|
lane := cfg.Pipelines["example"].Artifacts["events"]
|
|
lane.Extract.Options = map[string]any{"temperature": 0.2}
|
|
lane.References = map[string]string{"roster": "./roster.yml"}
|
|
cfg.Pipelines["example"].Artifacts["events"] = lane
|
|
|
|
effective, err := cfg.Resolve(ResolveInput{
|
|
PipelineID: "example",
|
|
Only: []string{"events"},
|
|
Catalog: fakeCatalog(t, pipeline.ModuleSpec{
|
|
Key: "fake/extract",
|
|
Stage: pipeline.StageExtract,
|
|
Requires: []string{"chunks"},
|
|
Provides: []string{"artifact"},
|
|
ReferenceSlots: []contracts.ReferenceSlot{
|
|
{Name: "roster"},
|
|
},
|
|
}),
|
|
})
|
|
if err != nil {
|
|
t.Fatalf("Resolve: %v", err)
|
|
}
|
|
|
|
payload, ok := effective.RedactedDiagnosticsPayload().(EffectiveConfig)
|
|
if !ok {
|
|
t.Fatalf("expected EffectiveConfig payload, got %T", effective.RedactedDiagnosticsPayload())
|
|
}
|
|
if payload.Config.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != redactedSecret {
|
|
t.Fatalf("expected nested API key redacted, got %+v", payload.Config.LLMProfiles[pipeline.DefaultLLMProfile])
|
|
}
|
|
if cfg.LLMProfiles[pipeline.DefaultLLMProfile].APIKey != "secret" {
|
|
t.Fatalf("redacted diagnostics payload mutated source config")
|
|
}
|
|
if payload.PipelineID != effective.PipelineID || payload.ResolvedPipeline.Digest != effective.ResolvedPipeline.Digest {
|
|
t.Fatalf("expected pipeline metadata preserved, got %+v", payload)
|
|
}
|
|
|
|
payload.Only[0] = "changed"
|
|
if effective.Only[0] != "events" {
|
|
t.Fatalf("expected only lanes to be copied")
|
|
}
|
|
payload.ResolvedPipeline.ArtifactLanes[0].Extract.Options["temperature"] = 1.0
|
|
if effective.ResolvedPipeline.ArtifactLanes[0].Extract.Options["temperature"] != 0.2 {
|
|
t.Fatalf("expected resolved pipeline options to be copied")
|
|
}
|
|
payload.ResolvedPipeline.ArtifactLanes[0].References[0].Source = "./changed.yml"
|
|
if effective.ResolvedPipeline.ArtifactLanes[0].References[0].Source != "./roster.yml" {
|
|
t.Fatalf("expected resolved pipeline references to be copied")
|
|
}
|
|
}
|