package config import ( "os" "path/filepath" "testing" ) func load(t *testing.T, yaml string) (Config, error) { t.Helper() t.Helper() p := filepath.Join(t.TempDir(), "c.yaml") os.WriteFile(p, []byte("auth_token: aaaaaaaaaaaaaaaaaaaa\n"+yaml), 0o600) return Load(p) } func TestPresetDahl(t *testing.T) { t.Setenv("DAHL_API_KEY", "dahl_test") c, err := load(t, "llm:\n provider: dahl\n") if err != nil { t.Fatal(err) } if c.LLM.BaseURL != "https://inference.dahl.global/v1" || c.LLM.Model != "MiniMaxAI/MiniMax-M2.7" || c.LLM.APIKey != "dahl_test" { t.Fatalf("%+v", c.LLM) } } func TestPresetGonkaRouterViaEnv(t *testing.T) { t.Setenv("BYTECLAW_LLM_PROVIDER", "GonkaRouter") t.Setenv("GONKAROUTER_API_KEY", "sk-g") c, err := load(t, "") if err != nil { t.Fatal(err) } if c.LLM.Provider != "gonkarouter" || c.LLM.BaseURL != "https://api.gonkarouter.io/v1" || c.LLM.Model != "MiniMaxAI/MiniMax-M2.7" || c.LLM.APIKey != "sk-g" { t.Fatalf("%+v", c.LLM) } } func TestPresetExplicitValuesWin(t *testing.T) { t.Setenv("GONKAROUTER_API_KEY", "from-env") c, err := load(t, "llm:\n provider: gonkarouter\n model: zai-org/GLM-5.3-Flash\n api_key: explicit\n") if err != nil { t.Fatal(err) } if c.LLM.Model != "zai-org/GLM-5.3-Flash" || c.LLM.APIKey != "explicit" || c.LLM.BaseURL != "https://api.gonkarouter.io/v1" { t.Fatalf("%+v", c.LLM) } } func TestPresetDefaultIsOpenAI(t *testing.T) { c, err := load(t, "") if err != nil || c.LLM.Provider != "openai" || c.LLM.BaseURL != "https://api.openai.com/v1" { t.Fatalf("%+v %v", c.LLM, err) } } func TestPresetUnknownAndCustom(t *testing.T) { if _, err := load(t, "llm:\n provider: nope\n"); err == nil { t.Fatal("unknown provider must fail") } if _, err := load(t, "llm:\n provider: custom\n"); err == nil { t.Fatal("custom without base_url/model must fail validation") } c, err := load(t, "llm:\n provider: custom\n base_url: http://x/v1\n model: m\n") if err != nil || c.LLM.BaseURL != "http://x/v1" { t.Fatalf("%+v %v", c.LLM, err) } } func TestAllPresetsComplete(t *testing.T) { for n, p := range Presets { if p.Name != n || p.BaseURL == "" || p.DefaultModel == "" || p.Source == "" { t.Errorf("incomplete preset %q: %+v", n, p) } } } // TestMain keeps tests hermetic when the developer shell has BYTECLAW_* or provider keys set. func TestMain(m *testing.M) { for _, k := range []string{"BYTECLAW_LISTEN", "BYTECLAW_DATA_DIR", "BYTECLAW_WORKSPACE", "BYTECLAW_LLM_PROVIDER", "BYTECLAW_LLM_BASE_URL", "BYTECLAW_LLM_API_KEY", "BYTECLAW_LLM_MODEL", "BYTECLAW_ALLOWED_ORIGINS", "BYTECLAW_AUTH_TOKEN", "OPENAI_API_KEY", "OPENROUTER_API_KEY", "DAHL_API_KEY", "GONKAROUTER_API_KEY"} { os.Unsetenv(k) } os.Exit(m.Run()) }