summaryrefslogtreecommitdiff
path: root/web/test/delete-button.test.mjs
diff options
context:
space:
mode:
authorPeter Stone <thepeterstone@gmail.com>2026-03-06 23:55:07 +0000
committerPeter Stone <thepeterstone@gmail.com>2026-03-06 23:55:07 +0000
commitfd42a54d96fcd3342941caaeb61a4b0d5d3f1b4f (patch)
tree0b9ef3b7f0ac3981aa310435d014c9f5e21089d4 /web/test/delete-button.test.mjs
parent7d4890cde802974b94db24071f63e7733c3670fd (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 'web/test/delete-button.test.mjs')
-rw-r--r--web/test/delete-button.test.mjs60
1 files changed, 60 insertions, 0 deletions
diff --git a/web/test/delete-button.test.mjs b/web/test/delete-button.test.mjs
new file mode 100644
index 0000000..b82b487
--- /dev/null
+++ b/web/test/delete-button.test.mjs
@@ -0,0 +1,60 @@
+// delete-button.test.mjs — visibility logic for the Delete button on task cards
+//
+// Run with: node --test web/test/delete-button.test.mjs
+
+import { describe, it } from 'node:test';
+import assert from 'node:assert/strict';
+
+// ── Logic under test ──────────────────────────────────────────────────────────
+// A delete button should be shown for any task that is not actively executing.
+// RUNNING and QUEUED tasks cannot be deleted via the API (409), so we hide the button.
+
+const NON_DELETABLE_STATES = new Set(['RUNNING', 'QUEUED']);
+
+function showDeleteButton(state) {
+ return !NON_DELETABLE_STATES.has(state);
+}
+
+// ── Tests ─────────────────────────────────────────────────────────────────────
+
+describe('delete button visibility', () => {
+ it('shows for PENDING', () => {
+ assert.equal(showDeleteButton('PENDING'), true);
+ });
+
+ it('shows for COMPLETED', () => {
+ assert.equal(showDeleteButton('COMPLETED'), true);
+ });
+
+ it('shows for FAILED', () => {
+ assert.equal(showDeleteButton('FAILED'), true);
+ });
+
+ it('shows for CANCELLED', () => {
+ assert.equal(showDeleteButton('CANCELLED'), true);
+ });
+
+ it('shows for TIMED_OUT', () => {
+ assert.equal(showDeleteButton('TIMED_OUT'), true);
+ });
+
+ it('shows for BUDGET_EXCEEDED', () => {
+ assert.equal(showDeleteButton('BUDGET_EXCEEDED'), true);
+ });
+
+ it('shows for READY', () => {
+ assert.equal(showDeleteButton('READY'), true);
+ });
+
+ it('shows for BLOCKED', () => {
+ assert.equal(showDeleteButton('BLOCKED'), true);
+ });
+
+ it('hides for RUNNING', () => {
+ assert.equal(showDeleteButton('RUNNING'), false);
+ });
+
+ it('hides for QUEUED', () => {
+ assert.equal(showDeleteButton('QUEUED'), false);
+ });
+});