Add offline-first task-master TUI with tickets, board lists, and undo.
Charm-based CLI with JSON persistence, status/list filters, external editor editing, command-history undo/redo, and glamour markdown without AutoStyle OSC hangs. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user