Files
patterm/internal/task/task_test.go
T
2026-06-24 12:28:56 +01:00

114 lines
2.9 KiB
Go

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