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) } }