test: add unit tests for config/env.go
Tests for AgentEnv(), ExportPrefix(), BuildStartupCommandWithEnv(), and helper functions (MergeEnv, FilterEnv, WithoutEnv, EnvToSlice). Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
committed by
Steve Yegge
parent
e9a013c0d2
commit
64e1448981
271
internal/config/env_test.go
Normal file
271
internal/config/env_test.go
Normal file
@@ -0,0 +1,271 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAgentEnv_Mayor(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "mayor",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/.beads",
|
||||
})
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "mayor")
|
||||
assertEnv(t, env, "BD_ACTOR", "mayor")
|
||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "mayor")
|
||||
assertEnv(t, env, "GT_ROOT", "/town")
|
||||
assertEnv(t, env, "BEADS_DIR", "/town/.beads")
|
||||
assertNotSet(t, env, "GT_RIG")
|
||||
assertNotSet(t, env, "BEADS_NO_DAEMON")
|
||||
}
|
||||
|
||||
func TestAgentEnv_Witness(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "witness",
|
||||
Rig: "myrig",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
})
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "witness")
|
||||
assertEnv(t, env, "GT_RIG", "myrig")
|
||||
assertEnv(t, env, "BD_ACTOR", "myrig/witness")
|
||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/witness")
|
||||
assertEnv(t, env, "GT_ROOT", "/town")
|
||||
assertEnv(t, env, "BEADS_DIR", "/town/myrig/.beads")
|
||||
}
|
||||
|
||||
func TestAgentEnv_Polecat(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "polecat",
|
||||
Rig: "myrig",
|
||||
AgentName: "Toast",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
BeadsNoDaemon: true,
|
||||
})
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "polecat")
|
||||
assertEnv(t, env, "GT_RIG", "myrig")
|
||||
assertEnv(t, env, "GT_POLECAT", "Toast")
|
||||
assertEnv(t, env, "BD_ACTOR", "myrig/polecats/Toast")
|
||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "Toast")
|
||||
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/Toast")
|
||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||
}
|
||||
|
||||
func TestAgentEnv_Crew(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "crew",
|
||||
Rig: "myrig",
|
||||
AgentName: "emma",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
BeadsNoDaemon: true,
|
||||
})
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "crew")
|
||||
assertEnv(t, env, "GT_RIG", "myrig")
|
||||
assertEnv(t, env, "GT_CREW", "emma")
|
||||
assertEnv(t, env, "BD_ACTOR", "myrig/crew/emma")
|
||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "emma")
|
||||
assertEnv(t, env, "BEADS_AGENT_NAME", "myrig/emma")
|
||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||
}
|
||||
|
||||
func TestAgentEnv_Refinery(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "refinery",
|
||||
Rig: "myrig",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
BeadsNoDaemon: true,
|
||||
})
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "refinery")
|
||||
assertEnv(t, env, "GT_RIG", "myrig")
|
||||
assertEnv(t, env, "BD_ACTOR", "myrig/refinery")
|
||||
assertEnv(t, env, "GIT_AUTHOR_NAME", "myrig/refinery")
|
||||
assertEnv(t, env, "BEADS_NO_DAEMON", "1")
|
||||
}
|
||||
|
||||
func TestAgentEnv_WithRuntimeConfigDir(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "polecat",
|
||||
Rig: "myrig",
|
||||
AgentName: "Toast",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
RuntimeConfigDir: "/home/user/.config/claude",
|
||||
})
|
||||
|
||||
assertEnv(t, env, "CLAUDE_CONFIG_DIR", "/home/user/.config/claude")
|
||||
}
|
||||
|
||||
func TestAgentEnv_WithoutRuntimeConfigDir(t *testing.T) {
|
||||
env := AgentEnv(AgentEnvConfig{
|
||||
Role: "polecat",
|
||||
Rig: "myrig",
|
||||
AgentName: "Toast",
|
||||
TownRoot: "/town",
|
||||
BeadsDir: "/town/myrig/.beads",
|
||||
})
|
||||
|
||||
assertNotSet(t, env, "CLAUDE_CONFIG_DIR")
|
||||
}
|
||||
|
||||
func TestAgentEnvSimple(t *testing.T) {
|
||||
env := AgentEnvSimple("polecat", "myrig", "Toast")
|
||||
|
||||
assertEnv(t, env, "GT_ROLE", "polecat")
|
||||
assertEnv(t, env, "GT_RIG", "myrig")
|
||||
assertEnv(t, env, "GT_POLECAT", "Toast")
|
||||
// Simple doesn't set TownRoot/BeadsDir
|
||||
assertEnv(t, env, "GT_ROOT", "")
|
||||
assertEnv(t, env, "BEADS_DIR", "")
|
||||
}
|
||||
|
||||
func TestExportPrefix(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
env map[string]string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "empty",
|
||||
env: map[string]string{},
|
||||
expected: "",
|
||||
},
|
||||
{
|
||||
name: "single var",
|
||||
env: map[string]string{"FOO": "bar"},
|
||||
expected: "export FOO=bar && ",
|
||||
},
|
||||
{
|
||||
name: "multiple vars sorted",
|
||||
env: map[string]string{
|
||||
"ZZZ": "last",
|
||||
"AAA": "first",
|
||||
"MMM": "middle",
|
||||
},
|
||||
expected: "export AAA=first MMM=middle ZZZ=last && ",
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result := ExportPrefix(tt.env)
|
||||
if result != tt.expected {
|
||||
t.Errorf("ExportPrefix() = %q, want %q", result, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildStartupCommandWithEnv(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
env map[string]string
|
||||
agentCmd string
|
||||
prompt string
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "no env no prompt",
|
||||
env: map[string]string{},
|
||||
agentCmd: "claude",
|
||||
prompt: "",
|
||||
expected: "claude",
|
||||
},
|
||||
{
|
||||
name: "env no prompt",
|
||||
env: map[string]string{"GT_ROLE": "polecat"},
|
||||
agentCmd: "claude",
|
||||
prompt: "",
|
||||
expected: "export GT_ROLE=polecat && claude",
|
||||
},
|
||||
{
|
||||
name: "env with prompt",
|
||||
env: map[string]string{"GT_ROLE": "polecat"},
|
||||
agentCmd: "claude",
|
||||
prompt: "gt prime",
|
||||
expected: `export GT_ROLE=polecat && claude "gt prime"`,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result := BuildStartupCommandWithEnv(tt.env, tt.agentCmd, tt.prompt)
|
||||
if result != tt.expected {
|
||||
t.Errorf("BuildStartupCommandWithEnv() = %q, want %q", result, tt.expected)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMergeEnv(t *testing.T) {
|
||||
a := map[string]string{"A": "1", "B": "2"}
|
||||
b := map[string]string{"B": "override", "C": "3"}
|
||||
|
||||
result := MergeEnv(a, b)
|
||||
|
||||
assertEnv(t, result, "A", "1")
|
||||
assertEnv(t, result, "B", "override")
|
||||
assertEnv(t, result, "C", "3")
|
||||
}
|
||||
|
||||
func TestFilterEnv(t *testing.T) {
|
||||
env := map[string]string{"A": "1", "B": "2", "C": "3"}
|
||||
|
||||
result := FilterEnv(env, "A", "C")
|
||||
|
||||
assertEnv(t, result, "A", "1")
|
||||
assertNotSet(t, result, "B")
|
||||
assertEnv(t, result, "C", "3")
|
||||
}
|
||||
|
||||
func TestWithoutEnv(t *testing.T) {
|
||||
env := map[string]string{"A": "1", "B": "2", "C": "3"}
|
||||
|
||||
result := WithoutEnv(env, "B")
|
||||
|
||||
assertEnv(t, result, "A", "1")
|
||||
assertNotSet(t, result, "B")
|
||||
assertEnv(t, result, "C", "3")
|
||||
}
|
||||
|
||||
func TestEnvToSlice(t *testing.T) {
|
||||
env := map[string]string{"A": "1", "B": "2"}
|
||||
|
||||
result := EnvToSlice(env)
|
||||
|
||||
if len(result) != 2 {
|
||||
t.Errorf("EnvToSlice() returned %d items, want 2", len(result))
|
||||
}
|
||||
|
||||
// Check both entries exist (order not guaranteed)
|
||||
found := make(map[string]bool)
|
||||
for _, s := range result {
|
||||
found[s] = true
|
||||
}
|
||||
if !found["A=1"] || !found["B=2"] {
|
||||
t.Errorf("EnvToSlice() = %v, want [A=1, B=2]", result)
|
||||
}
|
||||
}
|
||||
|
||||
// Helper functions
|
||||
|
||||
func assertEnv(t *testing.T, env map[string]string, key, expected string) {
|
||||
t.Helper()
|
||||
if got := env[key]; got != expected {
|
||||
t.Errorf("env[%q] = %q, want %q", key, got, expected)
|
||||
}
|
||||
}
|
||||
|
||||
func assertNotSet(t *testing.T, env map[string]string, key string) {
|
||||
t.Helper()
|
||||
if _, ok := env[key]; ok {
|
||||
t.Errorf("env[%q] should not be set, but is %q", key, env[key])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user