test.govlab/patterns/core/validators/graph.validator.test.ts
test.govlab/patterns/core/validators/graph.validator.test.ts is a file in Codebase Testing. 43 lines of code and 0 definitions.
import { GraphError, validateGraph } from "@govlab/patterns/core/validators/graph.validator.ts";
import { analysisNode, findingNode, sourceNode } from "@govlab/patterns/core/factories/node.factory.ts";
import { describe, expect, it } from "vitest";
import type { Node } from "@govlab/patterns/types/graph.types.ts";
import { coordinate } from "@govlab/patterns/core/factories/axis.factory.ts";
import { stepsBack } from "@govlab/patterns/configuration/strings/graph.strings.ts";
const at = function at(reasoning: string): ReturnType<typeof coordinate> {
return coordinate({ analysis: "frequency", ontology: "probability", reasoning, representation: "symbolic" });
};
const validNodes = function validNodes(): Node[] {
const analysis = analysisNode("color", "frequency");
return [sourceNode(), analysis, findingNode(analysis.id, "frequency", at("explanation"))];
};
describe("validateGraph", () => {
it("accepts a well-formed records to analysis to finding graph", () => {
expect(() => {
validateGraph(validNodes());
}).not.toThrow();
});
it("refuses a node produced twice", () => {
const nodes = validNodes();
expect(() => {
validateGraph([...nodes, ...nodes.slice(1, 2)]);
}).toThrow(GraphError);
});
it("refuses a node that consumes a missing producer", () => {
expect(() => {
validateGraph([sourceNode(), findingNode("color:missing", "x", at("explanation"))]);
}).toThrow(GraphError);
});
it("refuses an edge that steps back on the reasoning axis", () => {
const analysis = analysisNode("color", "frequency");
const back = findingNode(analysis.id, "back", at("observation"));
expect(() => {
validateGraph([sourceNode(), analysis, back]);
}).toThrow(stepsBack(analysis.id, back.id));
});
it("refuses an analysis node that no finding consumes", () => {
expect(() => {
validateGraph([sourceNode(), analysisNode("color", "frequency")]);
}).toThrow(GraphError);
});
});