test.govlab/patterns/core/analyzers/schema.analyzer.test.ts

test.govlab/patterns/core/analyzers/schema.analyzer.test.ts is a file in Codebase Testing. 33 lines of code and 0 definitions.

import { describe, expect, it } from "vitest";
import { DataLoadError } from "@govlab/patterns/core/classifiers/schema.classifier.ts";
import type { FieldSchema } from "@govlab/patterns/types/schema.types.ts";
import { detectSchema } from "@govlab/patterns/core/analyzers/schema.analyzer.ts";

const LOW = 3;
const HIGH = 7;
const RATIO = 1.5;

const byName = function byName(schema: readonly FieldSchema[], name: string): FieldSchema | undefined {
    return schema.find((field) => field.name === name);
};

describe("detectSchema", () => {
    const schema = detectSchema([
        { color: "red", n: LOW, ratio: RATIO },
        { color: "blue", n: HIGH },
    ]);

    it("classifies scalar kinds and primitives", () => {
        expect(byName(schema, "color")).toMatchObject({ kind: "scalar", nullable: false, primitive: "string" });
        expect(byName(schema, "n")).toMatchObject({ kind: "scalar", primitive: "integer" });
    });

    it("marks a field absent from some records as nullable", () => {
        expect(byName(schema, "ratio")).toMatchObject({ nullable: true, primitive: "float" });
    });

    it("reads a field named in the float hint as float", () => {
        const records = [{ x: 1 }, { x: 2 }];
        const hinted = detectSchema(records, new Set(["x"]));
        const plain = detectSchema(records);
        expect(byName(hinted, "x")?.primitive).toBe("float");
        expect(byName(plain, "x")?.primitive).toBe("integer");
    });

    it("refuses a record that is not an object", () => {
        expect(() => detectSchema(["nope"])).toThrow(DataLoadError);
    });
});