package task import ( "os" "path/filepath" "testing" ) func TestCreateListAndReload(t *testing.T) { dir := t.TempDir() t.Setenv("XDG_DATA_HOME", dir) s1, err := Open("projkey") if err != nil { t.Fatalf("open: %v", err) } created, err := s1.Create(" Ship task sidebar ") if err != nil { t.Fatalf("create: %v", err) } if created.ID == "" || created.Title != "Ship task sidebar" || created.CreatedAt == "" || created.UpdatedAt == "" { t.Fatalf("created task incomplete: %+v", created) } s2, err := Open("projkey") if err != nil { t.Fatalf("reopen: %v", err) } got := s2.List() if len(got) != 1 { t.Fatalf("tasks len = %d, want 1 (%v)", len(got), got) } if got[0].ID != created.ID || got[0].Title != "Ship task sidebar" { t.Fatalf("reload mismatch: got %+v want %+v", got[0], created) } if _, err := os.Stat(s2.Path()); err != nil { t.Fatalf("stat tasks.json: %v", err) } } func TestCreateRequiresTitle(t *testing.T) { t.Setenv("XDG_DATA_HOME", t.TempDir()) s, err := Open("projkey") if err != nil { t.Fatalf("open: %v", err) } if _, err := s.Create(" "); err == nil { t.Fatalf("create with empty title should fail") } } func TestRenameTask(t *testing.T) { t.Setenv("XDG_DATA_HOME", t.TempDir()) s, err := Open("projkey") if err != nil { t.Fatalf("open: %v", err) } created, err := s.Create("Old") if err != nil { t.Fatalf("create: %v", err) } renamed, err := s.Rename(created.ID, "New") if err != nil { t.Fatalf("rename: %v", err) } if renamed.Title != "New" { t.Fatalf("title = %q, want New", renamed.Title) } got, ok := s.Get(created.ID) if !ok || got.Title != "New" { t.Fatalf("get after rename = %+v, %v", got, ok) } } func TestRegisterWorktreeDedupesByPath(t *testing.T) { t.Setenv("XDG_DATA_HOME", t.TempDir()) s, err := Open("projkey") if err != nil { t.Fatalf("open: %v", err) } task, err := s.Create("Worktree task") if err != nil { t.Fatalf("create: %v", err) } path := filepath.Join(t.TempDir(), "repo", "..", "repo") updated, err := s.RegisterWorktree(task.ID, Worktree{Path: path, Branch: "one", CreatedByProcessID: "p1"}) if err != nil { t.Fatalf("register: %v", err) } if len(updated.Worktrees) != 1 { t.Fatalf("worktrees len = %d, want 1", len(updated.Worktrees)) } clean := filepath.Clean(path) if updated.Worktrees[0].Path != clean { t.Fatalf("path = %q, want %q", updated.Worktrees[0].Path, clean) } updated, err = s.RegisterWorktree(task.ID, Worktree{Path: clean, Branch: "two"}) if err != nil { t.Fatalf("register duplicate: %v", err) } if len(updated.Worktrees) != 1 { t.Fatalf("duplicate should replace, got %+v", updated.Worktrees) } if got := updated.Worktrees[0]; got.Branch != "two" || got.CreatedByProcessID != "p1" { t.Fatalf("duplicate replace mismatch: %+v", got) } } func TestOpenRequiresProjectKey(t *testing.T) { if _, err := Open(""); err == nil { t.Fatalf("open with empty project key should fail") } }