diff --git a/src/features/team-mode/team-tasklist/dependencies.test.ts b/src/features/team-mode/team-tasklist/dependencies.test.ts new file mode 100644 index 000000000..4d2d47d6f --- /dev/null +++ b/src/features/team-mode/team-tasklist/dependencies.test.ts @@ -0,0 +1,47 @@ +/// + +import { describe, expect, test } from "bun:test" + +import type { Task } from "../types" +import { canClaim } from "./dependencies" + +function buildTask(id: string, status: Task["status"], blockedBy: string[] = []): Task { + const now = Date.now() + return { + version: 1, + id, + subject: `subject-${id}`, + description: `description-${id}`, + status, + blocks: [], + blockedBy, + createdAt: now, + updatedAt: now, + } +} + +describe("canClaim", () => { + test("returns false when a blocker is not completed", () => { + // given + const blockerTask = buildTask("2", "in_progress") + const dependentTask = buildTask("1", "pending", ["2"]) + + // when + const claimable = canClaim(dependentTask, [dependentTask, blockerTask]) + + // then + expect(claimable).toBe(false) + }) + + test("ignores missing blockers and completed blockers", () => { + // given + const completedBlockerTask = buildTask("2", "completed") + const dependentTask = buildTask("1", "pending", ["2", "999"]) + + // when + const claimable = canClaim(dependentTask, [dependentTask, completedBlockerTask]) + + // then + expect(claimable).toBe(true) + }) +}) diff --git a/src/features/team-mode/team-tasklist/dependencies.ts b/src/features/team-mode/team-tasklist/dependencies.ts new file mode 100644 index 000000000..4b4025a30 --- /dev/null +++ b/src/features/team-mode/team-tasklist/dependencies.ts @@ -0,0 +1,8 @@ +import type { Task } from "../types" + +export function canClaim(task: Task, allTasks: Task[]): boolean { + return task.blockedBy.every((blockerId) => { + const blockerTask = allTasks.find((candidateTask) => candidateTask.id === blockerId) + return blockerTask === undefined || blockerTask.status === "completed" + }) +}