import { test, expect } from "../../fixtures/test-base"; import { KanbanPage } from "../../pages/kanban-page"; test.describe("Workflow steps", () => { test("task appears in correct column after API move", async ({ testPage, apiClient, seedData, }) => { // Seed a task (lands in the start step by default) const task = await apiClient.createTask(seedData.workspaceId, "Workflow Move Task", { workflow_id: seedData.workflowId, workflow_step_id: seedData.startStepId, }); // Find a non-start step to move to const targetStep = seedData.steps.find((s) => !s.is_start_step); if (!targetStep) { test.skip(true, "No non-start step available to test move"); return; } // Move the task via API await apiClient.moveTask(task.id, seedData.workflowId, targetStep.id); // Navigate to kanban and verify the card is visible const kanban = new KanbanPage(testPage); await kanban.goto(); const card = kanban.taskCardByTitle("Workflow Move Task"); await expect(card).toBeVisible(); }); test("multiple tasks can be seeded into different steps", async ({ testPage, apiClient, seedData, }) => { const startStep = seedData.steps.find((s) => s.is_start_step) ?? seedData.steps[0]; const otherStep = seedData.steps.find((s) => s.id !== startStep.id); if (!otherStep) { test.skip(true, "Need at least 2 workflow steps"); return; } // Create tasks and move one await apiClient.createTask(seedData.workspaceId, "Step A Task", { workflow_id: seedData.workflowId, workflow_step_id: seedData.startStepId, }); const taskB = await apiClient.createTask(seedData.workspaceId, "Step B Task", { workflow_id: seedData.workflowId, workflow_step_id: seedData.startStepId, }); await apiClient.moveTask(taskB.id, seedData.workflowId, otherStep.id); const kanban = new KanbanPage(testPage); await kanban.goto(); await expect(kanban.taskCardByTitle("Step A Task")).toBeVisible(); await expect(kanban.taskCardByTitle("Step B Task")).toBeVisible(); }); test("an unstarted feeder task fills available WIP capacity", async ({ testPage, apiClient, seedData, }) => { const workflow = await apiClient.createWorkflow(seedData.workspaceId, "Feeder pull workflow"); const waiting = await apiClient.createWorkflowStep(workflow.id, "Waiting", 0, { is_start_step: true, }); const review = await apiClient.createWorkflowStep(workflow.id, "Review", 1); await apiClient.updateWorkflowStep(review.id, { wip_limit: 2, pull_from_step_id: waiting.id, }); await apiClient.createTask(seedData.workspaceId, "Unstarted feeder task", { workflow_id: workflow.id, workflow_step_id: waiting.id, }); await apiClient.saveUserSettings({ workspace_id: seedData.workspaceId, workflow_filter_id: workflow.id, repository_ids: [], }); const kanban = new KanbanPage(testPage); await kanban.goto(); await expect(kanban.taskCardInColumn("Unstarted feeder task", review.id)).toBeVisible(); await expect(kanban.taskCardInColumn("Unstarted feeder task", waiting.id)).toHaveCount(0); }); });