package config_test import ( "fmt" "log" "os" "strings" "testing" "rickub.com/bots-garden/ori/internal/config" ) func TestFromArgsDefaults(t *testing.T) { cfg, err := config.FromArgs(nil) if err != nil { t.Fatalf("FromArgs(nil) returned an error: %v", err) } if cfg.Addr != ":8888" { t.Errorf("default Addr = %q, want %q", cfg.Addr, ":8888") } wd, _ := os.Getwd() if cfg.Cwd != wd { t.Errorf("default Cwd = %q, want current directory %q", cfg.Cwd, wd) } want := strings.Fields(config.DefaultAgentCommand) if strings.Join(cfg.AgentCommand, " ") != strings.Join(want, " ") { t.Errorf("default AgentCommand = %v, want %v", cfg.AgentCommand, want) } } func TestFromArgsOverrides(t *testing.T) { dir := t.TempDir() cfg, err := config.FromArgs([]string{"--addr", ":9000", "--cwd", dir, "--agent-cmd", "gemini --experimental-acp"}) if err != nil { t.Fatalf("FromArgs returned an error: %v", err) } if cfg.Addr != ":9000" { t.Errorf("Addr = %q, want %q", cfg.Addr, ":9000") } if cfg.Cwd != dir { t.Errorf("Cwd = %q, want %q", cfg.Cwd, dir) } if len(cfg.AgentCommand) != 2 || cfg.AgentCommand[0] != "gemini" || cfg.AgentCommand[1] != "--experimental-acp" { t.Errorf("AgentCommand = %v, want [gemini --experimental-acp]", cfg.AgentCommand) } } func TestFromArgsRejectsEmptyAgentCommand(t *testing.T) { if _, err := config.FromArgs([]string{"--agent-cmd", " "}); err == nil { t.Fatal("FromArgs accepted an empty --agent-cmd, want an error") } } func TestFromArgsRejectsMissingCwd(t *testing.T) { if _, err := config.FromArgs([]string{"--cwd", "/does/not/exist"}); err == nil { t.Fatal("FromArgs accepted a non-existent --cwd, want an error") } } func TestFromArgsRejectsFileAsCwd(t *testing.T) { file := t.TempDir() + "/plain-file" if err := os.WriteFile(file, []byte("x"), 0o644); err != nil { t.Fatal(err) } if _, err := config.FromArgs([]string{"--cwd", file}); err == nil { t.Fatal("FromArgs accepted a plain file as --cwd, want an error") } } func TestFromArgsRejectsUnknownFlag(t *testing.T) { if _, err := config.FromArgs([]string{"--nope"}); err == nil { t.Fatal("FromArgs accepted an unknown flag, want an error") } } func ExampleFromArgs() { cfg, err := config.FromArgs([]string{"--addr", ":9000"}) if err != nil { log.Fatal(err) } fmt.Println(cfg.Addr) // Output: :9000 } // TestDefaultAgentCommandIsClaudeAgentACP pins the adapter ori spawns by default. // The Zed adapter (@zed-industries/claude-code-acp) bundles a Claude Code CLI // too old for current models (2.1.44 < 2.1.251 required); the Agent Client // Protocol adapter ships a current CLI through its SDK. A change here must be // deliberate and mirrored in template/Dockerfile and kits/ori/spec.yaml. func TestDefaultAgentCommandIsClaudeAgentACP(t *testing.T) { const want = "npx -y @agentclientprotocol/claude-agent-acp" if config.DefaultAgentCommand != want { t.Errorf("DefaultAgentCommand = %q, want %q", config.DefaultAgentCommand, want) } if strings.Contains(config.DefaultAgentCommand, "zed-industries") { t.Errorf("DefaultAgentCommand still points at the Zed adapter: %q", config.DefaultAgentCommand) } }