import { parseComfyWorkflow } from "../../src/types/comfyWorkflow"; import { defaultGraph } from "../../src/scripts/defaultGraph"; import fs from "fs"; const WORKFLOW_DIR = "tests-ui/workflows"; describe("parseComfyWorkflow", () => { it("parses valid workflow", async () => { fs.readdirSync(WORKFLOW_DIR).forEach(async (file) => { if (file.endsWith(".json")) { const data = fs.readFileSync(`${WORKFLOW_DIR}/${file}`, "utf-8"); await expect(parseComfyWorkflow(data)).resolves.not.toThrow(); } }); }); it("workflow.nodes", async () => { const workflow = JSON.parse(JSON.stringify(defaultGraph)); workflow.nodes = undefined; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.nodes = null; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.nodes = []; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); }); it("workflow.version", async () => { const workflow = JSON.parse(JSON.stringify(defaultGraph)); workflow.version = undefined; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.version = "1.0.1"; // Invalid format. await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.version = 1; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); }); it("workflow.extra", async () => { const workflow = JSON.parse(JSON.stringify(defaultGraph)); workflow.extra = undefined; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); workflow.extra = null; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); workflow.extra = {}; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); workflow.extra = { foo: "bar" }; // Should accept extra fields. await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); }); it("workflow.nodes.pos", async () => { const workflow = JSON.parse(JSON.stringify(defaultGraph)); workflow.nodes[0].pos = [1, 2, 3]; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.nodes[0].pos = [1, 2]; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); // Should automatically transform the legacy format object to array. workflow.nodes[0].pos = { "0": 3, "1": 4 }; let parsedWorkflow = await parseComfyWorkflow(JSON.stringify(workflow)); expect(parsedWorkflow.nodes[0].pos).toEqual([3, 4]); workflow.nodes[0].pos = { 0: 3, 1: 4 }; parsedWorkflow = await parseComfyWorkflow(JSON.stringify(workflow)); expect(parsedWorkflow.nodes[0].pos).toEqual([3, 4]); }); it("workflow.nodes.widget_values", async () => { const workflow = JSON.parse(JSON.stringify(defaultGraph)); workflow.nodes[0].widgets_values = ["foo", "bar"]; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); workflow.nodes[0].widgets_values = "foo"; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).rejects.toThrow(); workflow.nodes[0].widgets_values = undefined; await expect( parseComfyWorkflow(JSON.stringify(workflow)) ).resolves.not.toThrow(); // The object format of widgets_values is used by VHS nodes to perform // dynamic widgets display. workflow.nodes[0].widgets_values = { foo: "bar" }; const parsedWorkflow = await parseComfyWorkflow(JSON.stringify(workflow)); expect(parsedWorkflow.nodes[0].widgets_values).toEqual({ foo: "bar" }); }); });