From f1642b3c93a92546f32ea30cfa910489f853b44d Mon Sep 17 00:00:00 2001 From: Bruno Bornsztein Date: Wed, 22 Apr 2026 06:44:57 -0500 Subject: [PATCH 1/2] Add tests for form default project behavior - TestNewFormModelDefaultsToLastUsedProject: Verifies that when a last used project exists in the database, the form defaults to it - TestNewFormModelDefaultsToPersonalWithoutDatabase: Verifies that when no database is available, the form defaults to 'personal' - TestNewFormModelLastUsedOverridesWorkingDir: Verifies that last used project takes priority over working directory detection --- internal/ui/form_test.go | 60 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) 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) + } +} From 6c27a87b8997259514c8b4e3730e6c28526d6b97 Mon Sep 17 00:00:00 2001 From: Bruno Bornsztein Date: Wed, 22 Apr 2026 06:52:07 -0500 Subject: [PATCH 2/2] Save last used project when updating task UpdateTask now calls SetLastUsedProject when the project field is set, ensuring that editing a task with a different project updates the last used project preference. This fixes the issue where the new task form was defaulting to 'personal' instead of the previously used project. Also adds test TestUpdateTaskSavesLastProject to verify this behavior. --- internal/db/tasks.go | 5 +++++ internal/db/tasks_test.go | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) 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()