summaryrefslogtreecommitdiff
path: root/internal/appconfig
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-09-19 22:56:10 +0300
committerPaul Buetow <paul@buetow.org>2025-09-19 22:56:10 +0300
commit1065d7a991d3b5c103bcc986a84867db28cb4720 (patch)
tree00824c2b7b7b3016f235205bed9483b638340de6 /internal/appconfig
parent6feda08653a80a7609df2e8b80e98ede15f86a61 (diff)
Diffstat (limited to 'internal/appconfig')
-rw-r--r--internal/appconfig/config_alias_test.go36
-rw-r--r--internal/appconfig/config_env_model_test.go37
2 files changed, 73 insertions, 0 deletions
diff --git a/internal/appconfig/config_alias_test.go b/internal/appconfig/config_alias_test.go
new file mode 100644
index 0000000..6cc5bda
--- /dev/null
+++ b/internal/appconfig/config_alias_test.go
@@ -0,0 +1,36 @@
+package appconfig
+
+import (
+ "log"
+ "os"
+ "path/filepath"
+ "testing"
+)
+
+func TestOpenAIPresets_AliasResolution(t *testing.T) {
+ dir := t.TempDir()
+ t.Setenv("XDG_CONFIG_HOME", dir)
+ cfgDir := filepath.Join(dir, "hexai")
+ if err := os.MkdirAll(cfgDir, 0o755); err != nil {
+ t.Fatalf("mkdir: %v", err)
+ }
+ toml := `
+[provider]
+name = "openai"
+
+[openai]
+model = "codex"
+
+[openai.presets]
+codex = "gpt-5-codex"
+`
+ path := filepath.Join(cfgDir, "config.toml")
+ if err := os.WriteFile(path, []byte(toml), 0o644); err != nil {
+ t.Fatalf("write: %v", err)
+ }
+ cfg := Load(log.New(os.Stderr, "test ", 0))
+ if cfg.OpenAIModel != "gpt-5-codex" {
+ t.Fatalf("expected alias to resolve to gpt-5-codex, got %q", cfg.OpenAIModel)
+ }
+}
+
diff --git a/internal/appconfig/config_env_model_test.go b/internal/appconfig/config_env_model_test.go
new file mode 100644
index 0000000..2db2bb5
--- /dev/null
+++ b/internal/appconfig/config_env_model_test.go
@@ -0,0 +1,37 @@
+package appconfig
+
+import (
+ "log"
+ "os"
+ "testing"
+)
+
+// Test that HEXAI_MODEL applies to provider model fields and that
+// provider-specific envs take precedence when both are set.
+func TestEnv_GenericModelOverrideAndPrecedence(t *testing.T) {
+ t.Setenv("HEXAI_MODEL", "gpt-5-codex")
+ t.Setenv("HEXAI_PROVIDER", "openai")
+ // No provider-specific env set yet: HEXAI_MODEL should flow into OpenAIModel
+ cfg := Load(log.New(os.Stderr, "test ", 0))
+ if cfg.OpenAIModel != "gpt-5-codex" {
+ t.Fatalf("expected OpenAIModel=gpt-5-codex via HEXAI_MODEL, got %q", cfg.OpenAIModel)
+ }
+
+ // Now set a provider-specific model; it should win over HEXAI_MODEL
+ t.Setenv("HEXAI_OPENAI_MODEL", "gpt-5-thinking")
+ cfg2 := Load(log.New(os.Stderr, "test ", 0))
+ if cfg2.OpenAIModel != "gpt-5-thinking" {
+ t.Fatalf("expected OpenAIModel from HEXAI_OPENAI_MODEL to win, got %q", cfg2.OpenAIModel)
+ }
+}
+
+// Test that HEXAI_MODEL_FORCE overrides provider-specific envs (used by CLI --model).
+func TestEnv_ModelForce_OverridesProviderSpecific(t *testing.T) {
+ t.Setenv("HEXAI_OPENAI_MODEL", "gpt-5-main")
+ t.Setenv("HEXAI_MODEL_FORCE", "gpt-5-codex")
+ t.Setenv("HEXAI_PROVIDER", "openai")
+ cfg := Load(log.New(os.Stderr, "test ", 0))
+ if cfg.OpenAIModel != "gpt-5-codex" {
+ t.Fatalf("expected OpenAIModel forced to gpt-5-codex, got %q", cfg.OpenAIModel)
+ }
+}