Files
magpie/internal/agent/pi_dir_test.go
T

121 lines
4.3 KiB
Go

package agent
import (
"os"
"path/filepath"
"testing"
"github.com/yetone/magpie/internal/edit"
)
// #304: PI_CODING_AGENT_DIR moves Pi's agent folder (config.js,
// getAgentDir, "~" expanded), and a model set on Pi's row goes to
// settings.json and models.json there; ~/.pi is left alone. A relative
// one, or this machine's variable for a WSL distro's Pi, is not taken.
func TestPiAgentDir(t *testing.T) {
home := syncHome(t)
custom := filepath.Join(home, "dotfiles", "pi")
for _, c := range []struct{ env, want string }{
{"", filepath.Join(home, ".pi", "agent")},
{custom, custom},
{"~/dotfiles/pi", custom},
{"rel/pi", filepath.Join(home, ".pi", "agent")},
} {
t.Setenv("PI_CODING_AGENT_DIR", c.env)
if a := pi(home); a.Dir != c.want || a.Path != filepath.Join(c.want, "settings.json") {
t.Errorf("%q: %s", c.env, a.Dir)
}
}
t.Setenv("PI_CODING_AGENT_DIR", custom)
var a *Agent
for _, x := range All() {
if x.ID == "pi" {
a = x
}
}
if a == nil {
t.Fatal("no pi in All()")
}
os.MkdirAll(custom, 0o755)
os.WriteFile(filepath.Join(custom, "settings.json"), []byte(`{"theme": "dark", "defaultProvider": "xai", "defaultModel": "grok-4.6"}`), 0o644)
if f := a.Field("model"); f.Get() != "xai/grok-4.6" {
t.Fatalf("model %q", f.Get())
}
if err := a.Field("model").Set("magpie/relay/glm-4.6"); err != nil {
t.Fatal(err)
}
settings := filepath.Join(custom, "settings.json")
for k, want := range map[string]string{"defaultProvider": "magpie", "defaultModel": "relay/glm-4.6", "theme": "dark"} {
if v, _ := edit.GetJSON(settings, k); v != want {
t.Fatalf("%s = %q:\n%s", k, v, readFile(settings))
}
}
if v, _ := edit.GetJSON(filepath.Join(custom, "models.json"), "providers.magpie.baseUrl"); v == "" {
t.Fatalf("models.json:\n%s", readFile(filepath.Join(custom, "models.json")))
}
if c := a.Check(); c != "" {
t.Fatal(c)
}
if _, err := os.Stat(filepath.Join(home, ".pi")); !os.IsNotExist(err) {
t.Fatalf("~/.pi was touched: %v", err)
}
// a distro's Pi is at its home
root := t.TempDir()
d := distro{Name: "Ubuntu", Root: root, Home: "/home/me", Has: map[string]bool{"dir:.pi": true}, Mirrored: true, Running: true}
if w := wslAgent(wslKindOf("pi"), d); w.Dir != filepath.Join(root, "home", "me", ".pi", "agent") {
t.Fatalf("wsl: %s", w.Dir)
}
}
// omp reads PI_CODING_AGENT_DIR too, but only with no profile, and as
// given; PI_CONFIG_DIR renames ~/.omp and OMP_PROFILE (else PI_PROFILE)
// picks profiles/<name>/agent in it (pi-utils dirs.ts).
func TestOmpAgentDir(t *testing.T) {
home := syncHome(t)
custom := filepath.Join(home, "omp-here")
for _, c := range []struct{ agentDir, configDir, ompProfile, piProfile, want string }{
{"", "", "", "", filepath.Join(home, ".omp", "agent")},
{custom, "", "", "", custom},
{"~/omp-here", "", "", "", filepath.Join(home, ".omp", "agent")},
{"", ".omp-work", "", "", filepath.Join(home, ".omp-work", "agent")},
{custom, "", "work", "", filepath.Join(home, ".omp", "profiles", "work", "agent")},
{"", "", "", "home", filepath.Join(home, ".omp", "profiles", "home", "agent")},
{"", "", "default", "", filepath.Join(home, ".omp", "agent")},
{"", "", "Bad Name", "", filepath.Join(home, ".omp", "agent")},
} {
t.Setenv("PI_CODING_AGENT_DIR", c.agentDir)
t.Setenv("PI_CONFIG_DIR", c.configDir)
t.Setenv("OMP_PROFILE", c.ompProfile)
if c.ompProfile == "" {
os.Unsetenv("OMP_PROFILE")
}
t.Setenv("PI_PROFILE", c.piProfile)
if a := omp(home); a.Dir != c.want || a.Path != filepath.Join(c.want, "config.yml") {
t.Errorf("%+v: %s", c, a.Dir)
}
}
// OMP_PROFILE set but empty is the default profile, PI_PROFILE aside
t.Setenv("PI_CODING_AGENT_DIR", "")
t.Setenv("PI_CONFIG_DIR", "")
t.Setenv("OMP_PROFILE", "")
t.Setenv("PI_PROFILE", "home")
if a := omp(home); a.Dir != filepath.Join(home, ".omp", "agent") {
t.Errorf("empty OMP_PROFILE: %s", a.Dir)
}
t.Setenv("PI_CODING_AGENT_DIR", custom)
os.Unsetenv("OMP_PROFILE")
t.Setenv("PI_PROFILE", "")
if err := omp(home).Field("model").Set("magpie/relay/glm-4.6"); err != nil {
t.Fatal(err)
}
if v, _ := edit.GetYAML(filepath.Join(custom, "config.yml"), "modelRoles.default"); v != "magpie/relay/glm-4.6" {
t.Fatalf("config.yml:\n%s", readFile(filepath.Join(custom, "config.yml")))
}
if _, err := os.Stat(filepath.Join(home, ".omp")); !os.IsNotExist(err) {
t.Fatalf("~/.omp was touched: %v", err)
}
}