diff --git a/internal/db/tasks.go b/internal/db/tasks.go index eaeaeba2..72f96d2a 100644 --- a/internal/db/tasks.go +++ b/internal/db/tasks.go @@ -518,6 +518,11 @@ func (db *DB) UpdateTask(t *Task) error { } } + // Update last used project if project is set + if t.Project != "" { + db.SetLastUsedProject(t.Project) + } + return nil } diff --git a/internal/db/tasks_test.go b/internal/db/tasks_test.go index 8edb9214..58e91d7c 100644 --- a/internal/db/tasks_test.go +++ b/internal/db/tasks_test.go @@ -1852,6 +1852,49 @@ func TestCreateTaskSavesLastProject(t *testing.T) { } } +func TestUpdateTaskSavesLastProject(t *testing.T) { + tmpDir := t.TempDir() + dbPath := filepath.Join(tmpDir, "test.db") + + db, err := Open(dbPath) + if err != nil { + t.Fatalf("failed to open database: %v", err) + } + defer db.Close() + defer os.Remove(dbPath) + + if err := db.CreateProject(&Project{Name: "work", Path: tmpDir + "/work"}); err != nil { + t.Fatalf("failed to create work project: %v", err) + } + + task := &Task{ + Title: "Test Task", + Status: StatusBacklog, + Project: "personal", + } + if err := db.CreateTask(task); err != nil { + t.Fatalf("failed to create task: %v", err) + } + + lastProject, _ := db.GetLastUsedProject() + if lastProject != "personal" { + t.Errorf("expected 'personal' after create, got %q", lastProject) + } + + task.Project = "work" + if err := db.UpdateTask(task); err != nil { + t.Fatalf("failed to update task: %v", err) + } + + lastProject, err = db.GetLastUsedProject() + if err != nil { + t.Fatalf("failed to get last used project: %v", err) + } + if lastProject != "work" { + t.Errorf("expected 'work' after update, got %q", lastProject) + } +} + func TestGetExecutorUsageByProject(t *testing.T) { // Create temporary database tmpDir := t.TempDir() diff --git a/internal/ui/form_test.go b/internal/ui/form_test.go index a31c01cb..7adc5e55 100644 --- a/internal/ui/form_test.go +++ b/internal/ui/form_test.go @@ -1,6 +1,7 @@ package ui import ( + "path/filepath" "strings" "testing" @@ -1161,3 +1162,62 @@ func TestFilterProjectsEmptyQueryShowsAll(t *testing.T) { t.Errorf("expected current project 'workflow' to be pre-selected, got %q", m.projectFiltered[m.projectFilteredIdx]) } } + +func TestNewFormModelDefaultsToLastUsedProject(t *testing.T) { + tmpDir := t.TempDir() + dbPath := filepath.Join(tmpDir, "test.db") + + database, err := db.Open(dbPath) + if err != nil { + t.Fatalf("failed to open database: %v", err) + } + defer database.Close() + + if err := database.CreateProject(&db.Project{Name: "work", Path: tmpDir}); err != nil { + t.Fatalf("failed to create work project: %v", err) + } + + if err := database.SetLastUsedProject("work"); err != nil { + t.Fatalf("failed to set last used project: %v", err) + } + + m := NewFormModel(database, 100, 50, "", nil) + + if m.project != "work" { + t.Errorf("expected default project to be 'work' (last used), got %q", m.project) + } +} + +func TestNewFormModelDefaultsToPersonalWithoutDatabase(t *testing.T) { + m := NewFormModel(nil, 100, 50, "", nil) + + if m.project != "personal" { + t.Errorf("expected default project to be 'personal', got %q", m.project) + } +} + +func TestNewFormModelLastUsedOverridesWorkingDir(t *testing.T) { + tmpDir1 := t.TempDir() + tmpDir2 := t.TempDir() + dbPath := filepath.Join(tmpDir1, "test.db") + + database, err := db.Open(dbPath) + if err != nil { + t.Fatalf("failed to open database: %v", err) + } + defer database.Close() + + if err := database.CreateProject(&db.Project{Name: "work", Path: tmpDir2}); err != nil { + t.Fatalf("failed to create work project: %v", err) + } + + if err := database.SetLastUsedProject("work"); err != nil { + t.Fatalf("failed to set last used project: %v", err) + } + + m := NewFormModel(database, 100, 50, tmpDir1, nil) + + if m.project != "work" { + t.Errorf("expected project to be 'work' (last used should override working dir), got %q", m.project) + } +}