test.govlab/docs/core/plugins/diagram.sequence.plugin.test.ts

test.govlab/docs/core/plugins/diagram.sequence.plugin.test.ts is a file in Codebase Testing. 40 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import type { DetectedProtocol } from "@govlab/docs/types/graph.types.ts";
import type { DiagramContext } from "@govlab/docs/types/figure.types.ts";
import { diagram } from "@govlab/docs/core/plugins/diagram.sequence.plugin.ts";
import { mermaidHardening } from "@govlab/docs/core/analyzers/diagram.analyzer.ts";

const withProtocol = function withProtocol(protocol: DetectedProtocol | null): DiagramContext {
    return {
        codeGraph: { edges: [], nodes: [], protocol, state: null },
        layout: { cluster: false, direction: "TD", nodeCap: 15, perAxis: false },
        moduleDeps: [],
        moduleName: "@govlab/demo",
        shape: "leaf",
    };
};

describe("the sequence diagram", () => {
    it("needs at least two awaited messages", () => {
        const thin = withProtocol({
            messages: [{ async: true, text: "save", to: "store" }],
            participants: ["store"],
            self: "run",
        });
        expect(diagram.appliesTo(thin)).toBe(false);
    });

    it("emits a hardened sequence diagram naming the calling function", () => {
        const context = withProtocol({
            messages: [
                { async: true, text: "charge", to: "gateway" },
                { async: true, text: "store", to: "vault" },
                { async: true, text: "sendReceipt", to: "email" },
            ],
            participants: ["gateway", "vault", "email"],
            self: "processPayment",
        });
        expect(diagram.appliesTo(context)).toBe(true);
        const mermaid = diagram.render(context)?.mermaid ?? "";
        expect(mermaid.startsWith("sequenceDiagram")).toBe(true);
        expect(mermaid).toContain("processPayment");
        expect(mermaidHardening(["```mermaid", mermaid, "```"].join("\n"))).toStrictEqual([]);
    });
});