diff options
| author | Peter Stone <thepeterstone@gmail.com> | 2026-03-06 23:55:07 +0000 |
|---|---|---|
| committer | Peter Stone <thepeterstone@gmail.com> | 2026-03-06 23:55:07 +0000 |
| commit | fd42a54d96fcd3342941caaeb61a4b0d5d3f1b4f (patch) | |
| tree | 0b9ef3b7f0ac3981aa310435d014c9f5e21089d4 /internal/storage/db_test.go | |
| parent | 7d4890cde802974b94db24071f63e7733c3670fd (diff) | |
recover: restore untracked work from recovery branch (no Gemini changes)
Recovered files with no Claude→Agent contamination:
- docs/adr/002-task-state-machine.md
- internal/api/logs.go/logs_test.go: task-level log streaming endpoint
- internal/api/validate.go/validate_test.go: POST /api/tasks/validate
- internal/api/server_test.go, storage/db_test.go: expanded test coverage
- scripts/reset-failed-tasks, reset-running-tasks
- web/app.js, index.html, style.css: frontend improvements
- web/test/: active-tasks-tab, delete-button, filter-tabs, sort-tasks tests
Manually applied from server.go diff (skipping Claude→Agent rename):
- taskLogStore field + validateCmdPath field
- DELETE /api/tasks/{id} route + handleDeleteTask
- GET /api/tasks/{id}/logs/stream route
- POST /api/tasks/{id}/resume route + handleResumeTimedOutTask
- handleCancelTask: allow cancelling PENDING/QUEUED tasks directly
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/storage/db_test.go')
| -rw-r--r-- | internal/storage/db_test.go | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/internal/storage/db_test.go b/internal/storage/db_test.go index 395574c..fcdc529 100644 --- a/internal/storage/db_test.go +++ b/internal/storage/db_test.go @@ -473,6 +473,64 @@ func TestStorage_UpdateTaskQuestion(t *testing.T) { } } +func TestDeleteTask_RemovesTaskAndExecutions(t *testing.T) { + db := testDB(t) + now := time.Now().UTC() + db.CreateTask(makeTestTask("del-task", now)) + db.CreateExecution(&Execution{ID: "del-exec-1", TaskID: "del-task", StartTime: now, Status: "COMPLETED"}) + db.CreateExecution(&Execution{ID: "del-exec-2", TaskID: "del-task", StartTime: now.Add(time.Minute), Status: "COMPLETED"}) + + if err := db.DeleteTask("del-task"); err != nil { + t.Fatalf("DeleteTask: %v", err) + } + + _, err := db.GetTask("del-task") + if err == nil { + t.Error("expected error getting deleted task, got nil") + } + + execs, err := db.ListExecutions("del-task") + if err != nil { + t.Fatalf("ListExecutions: %v", err) + } + if len(execs) != 0 { + t.Errorf("want 0 executions after delete, got %d", len(execs)) + } +} + +func TestDeleteTask_CascadesSubtasks(t *testing.T) { + db := testDB(t) + now := time.Now().UTC() + + parent := makeTestTask("parent-del", now) + child := makeTestTask("child-del", now) + child.ParentTaskID = "parent-del" + + db.CreateTask(parent) + db.CreateTask(child) + + if err := db.DeleteTask("parent-del"); err != nil { + t.Fatalf("DeleteTask: %v", err) + } + + _, err := db.GetTask("parent-del") + if err == nil { + t.Error("parent should be deleted") + } + _, err = db.GetTask("child-del") + if err == nil { + t.Error("child should be deleted when parent is deleted") + } +} + +func TestDeleteTask_NotFound(t *testing.T) { + db := testDB(t) + err := db.DeleteTask("nonexistent") + if err == nil { + t.Fatal("expected error for nonexistent task, got nil") + } +} + func TestStorage_GetLatestExecution(t *testing.T) { db := testDB(t) now := time.Now().UTC() |
