Files
task-master/internal/config/loader_test.go
T

123 lines
3.0 KiB
Go

package config_test
import (
"encoding/json"
"os"
"path/filepath"
"testing"
"task/internal/config"
)
func TestDefaultsAndApplyDefaults(t *testing.T) {
home := "/tmp/fake-home"
cfg := config.Defaults(home)
if cfg.ActiveProject != config.DefaultProject {
t.Fatalf("ActiveProject = %q", cfg.ActiveProject)
}
wantData := filepath.Join(home, ".local", "share", config.AppName)
if cfg.DataDir != wantData {
t.Fatalf("DataDir = %q, want %q", cfg.DataDir, wantData)
}
partial := config.Config{}
partial.ApplyDefaults(home)
if partial.ActiveProject != config.DefaultProject || partial.DataDir != wantData {
t.Fatalf("ApplyDefaults failed: %+v", partial)
}
}
func TestSaveRoundTrip(t *testing.T) {
home := t.TempDir()
t.Setenv("HOME", home)
t.Setenv("TASK_MASTER_HOME", "")
t.Setenv("TASK_MASTER_DATA_DIR", "")
cfg := config.Defaults(home)
cfg.ActiveProject = "work"
if err := config.Save(&cfg); err != nil {
t.Fatalf("Save: %v", err)
}
path := config.Path(home)
data, err := os.ReadFile(path)
if err != nil {
t.Fatalf("ReadFile: %v", err)
}
var got config.Config
if err := json.Unmarshal(data, &got); err != nil {
t.Fatalf("Unmarshal: %v", err)
}
if got.ActiveProject != "work" {
t.Fatalf("ActiveProject = %q", got.ActiveProject)
}
}
func TestLoadOrCreate(t *testing.T) {
home := t.TempDir()
t.Setenv("HOME", home)
t.Setenv("TASK_MASTER_HOME", "")
t.Setenv("TASK_MASTER_DATA_DIR", "")
cfg, err := config.LoadOrCreate()
if err != nil {
t.Fatalf("LoadOrCreate: %v", err)
}
if cfg.ActiveProject != config.DefaultProject {
t.Fatalf("ActiveProject = %q", cfg.ActiveProject)
}
cfgPath := config.Path(home)
if _, err := os.Stat(cfgPath); err != nil {
t.Fatalf("config file missing: %v", err)
}
projectDir := filepath.Join(cfg.DataDir, "projects", cfg.ActiveProject)
if st, err := os.Stat(projectDir); err != nil || !st.IsDir() {
t.Fatalf("project dir missing: %v", err)
}
// Second call loads existing
cfg2, err := config.LoadOrCreate()
if err != nil {
t.Fatalf("LoadOrCreate 2: %v", err)
}
if cfg2.DataDir != cfg.DataDir {
t.Fatalf("DataDir mismatch")
}
}
func TestTASK_MASTER_HOME(t *testing.T) {
sandbox := t.TempDir()
t.Setenv("TASK_MASTER_HOME", sandbox)
t.Setenv("TASK_MASTER_DATA_DIR", "")
cfg, err := config.LoadOrCreate()
if err != nil {
t.Fatalf("LoadOrCreate: %v", err)
}
wantCfg := config.Path(sandbox)
if _, err := os.Stat(wantCfg); err != nil {
t.Fatalf("config under sandbox missing: %v", err)
}
wantData := filepath.Join(sandbox, ".local", "share", config.AppName)
if cfg.DataDir != wantData {
t.Fatalf("DataDir = %q, want %q", cfg.DataDir, wantData)
}
}
func TestTASK_MASTER_DATA_DIR(t *testing.T) {
home := t.TempDir()
data := t.TempDir()
t.Setenv("HOME", home)
t.Setenv("TASK_MASTER_HOME", "")
t.Setenv("TASK_MASTER_DATA_DIR", data)
cfg, err := config.LoadOrCreate()
if err != nil {
t.Fatalf("LoadOrCreate: %v", err)
}
if cfg.DataDir != data {
t.Fatalf("DataDir = %q, want %q", cfg.DataDir, data)
}
}