Files
kandev/apps/web/components/settings/workflow-dirty-state.test.ts
T
2026-08-07 15:22:44 +01:00

62 lines
2.0 KiB
TypeScript

import { describe, expect, it } from "vitest";
import type { Workflow, WorkflowStep } from "@/lib/types/http";
import {
isWorkflowFieldDirty,
isWorkflowStepDirty,
isWorkflowStepValueDirty,
} from "./workflow-dirty-state";
const workflow = {
id: "workflow-1",
workspace_id: "workspace-1",
name: "Workflow",
description: "",
created_at: "",
updated_at: "",
} as Workflow;
const step = {
id: "step-1",
workflow_id: workflow.id,
name: "Todo",
color: "bg-slate-500",
position: 0,
allow_manual_move: true,
created_at: "",
updated_at: "",
} as WorkflowStep;
describe("workflow dirty state", () => {
it("marks fields on a new workflow dirty", () => {
expect(isWorkflowFieldDirty(workflow, undefined, "name")).toBe(true);
});
it("marks only a changed workflow field dirty", () => {
const draft = { ...workflow, name: "Renamed" };
expect(isWorkflowFieldDirty(draft, workflow, "name")).toBe(true);
expect(isWorkflowFieldDirty(draft, workflow, "agent_profile_id")).toBe(false);
expect(isWorkflowFieldDirty(draft, workflow, "prompt")).toBe(false);
});
it("marks a changed workflow prompt dirty", () => {
const draft = { ...workflow, prompt: "If the PR is merged or closed, move the Task to Done." };
expect(isWorkflowFieldDirty(draft, workflow, "prompt")).toBe(true);
expect(isWorkflowFieldDirty(draft, { ...workflow, prompt: "" }, "prompt")).toBe(true);
expect(isWorkflowFieldDirty(draft, draft, "prompt")).toBe(false);
});
it("marks new and changed steps dirty", () => {
expect(isWorkflowStepDirty(step, undefined)).toBe(true);
expect(isWorkflowStepDirty({ ...step, name: "Doing" }, step)).toBe(true);
expect(isWorkflowStepDirty(step, step)).toBe(false);
});
it("compares only the selected step value", () => {
const draft = { ...step, name: "Doing", wip_limit: 2 };
expect(isWorkflowStepValueDirty(draft, step, (item) => item.name)).toBe(true);
expect(isWorkflowStepValueDirty(draft, step, (item) => item.color)).toBe(false);
});
});