package config import ( "strings" "testing" "gitea.maximumdirect.net/eric/notarius/internal/core/diagnostics" "gitea.maximumdirect.net/eric/notarius/internal/framework/pipeline" ) func TestApplyEnvOverridesOperationalAndLLMValues(t *testing.T) { cfg := Default() cfg.Pipelines["example"] = pipeline.PipelineProfile{ID: "example", Input: pipeline.Binding("before")} err := cfg.applyEnvOverridesWithLookup(mapLookup(map[string]string{ "NOTARIUS_LLM_DEFAULT_API_KEY": "secret", "NOTARIUS_LLM_DEFAULT_BASE_URL": "https://example.invalid/v1", "NOTARIUS_LLM_DEFAULT_MODEL": "test-model", "NOTARIUS_LLM_DEFAULT_TIMEOUT_SECONDS": "120", "NOTARIUS_LLM_DEFAULT_MAX_RETRIES": "5", "NOTARIUS_LLM_DEFAULT_MAX_CONCURRENCY": "2", "NOTARIUS_TOTAL_LLM_CONCURRENCY": "3", "NOTARIUS_WORK_DIR": "/tmp/notarius-env", "NOTARIUS_DIAGNOSTICS_RETENTION": "never", "NOTARIUS_PIPELINE_INPUT": "after", })) if err != nil { t.Fatalf("ApplyEnvOverrides: %v", err) } profile := cfg.LLMProfiles[pipeline.DefaultLLMProfile] if profile.APIKey != "secret" || profile.BaseURL != "https://example.invalid/v1" || profile.Model != "test-model" { t.Fatalf("unexpected LLM profile strings: %+v", profile) } if profile.TimeoutSeconds != 120 || profile.MaxRetries != 5 || profile.MaxConcurrency != 2 { t.Fatalf("unexpected LLM profile numeric values: %+v", profile) } if cfg.Concurrency.TotalLLM != 3 { t.Fatalf("unexpected total concurrency: %d", cfg.Concurrency.TotalLLM) } if cfg.Diagnostics.WorkDir != "/tmp/notarius-env" || cfg.Diagnostics.Retention != diagnostics.RetentionNever { t.Fatalf("unexpected diagnostics config: %+v", cfg.Diagnostics) } if cfg.Pipelines["example"].Input.Module != "before" { t.Fatalf("environment overrides must not change pipeline wiring: %+v", cfg.Pipelines["example"]) } } func TestApplyEnvOverridesRejectsInvalidIntegers(t *testing.T) { cfg := Default() err := cfg.applyEnvOverridesWithLookup(mapLookup(map[string]string{ "NOTARIUS_TOTAL_LLM_CONCURRENCY": "many", })) if err == nil || !strings.Contains(err.Error(), "NOTARIUS_TOTAL_LLM_CONCURRENCY") { t.Fatalf("expected named integer error, got %v", err) } } func TestLoadFromEnvUsesDefaultConfig(t *testing.T) { t.Setenv("NOTARIUS_LLM_DEFAULT_MODEL", "env-model") cfg, err := LoadFromEnv() if err != nil { t.Fatalf("LoadFromEnv: %v", err) } if cfg.LLMProfiles[pipeline.DefaultLLMProfile].Model != "env-model" { t.Fatalf("expected env model, got %+v", cfg.LLMProfiles[pipeline.DefaultLLMProfile]) } }