import { describe, expect, it } from "vitest"; import { parseData } from "../../src/core/data"; describe("data parser", () => { it("parses CSV inference and NDJSON", () => { const csv = parseData("name,n\nAda,3", "csv"); expect(csv.rows[0]).toEqual({ name: "Ada", n: 3, }); expect(csv.evidence.csv).toMatchObject({ rawRows: [["Ada", "3"]], cells: expect.arrayContaining([ expect.objectContaining({ field: "n", raw: "3", inferred: "number" }), ]), }); expect(parseData('{"a":1}\n{"a":2}', "ndjson").rows).toHaveLength(2); }); it("makes inference explicit and preserves unsafe-number evidence", () => { expect( parseData("id,empty\n9007199254740993,null", "csv", { csvInference: "safe", inferNulls: false, }).rows[0], ).toEqual({ id: "9007199254740993", empty: "null" }); const json = parseData( '{"id":9007199254740993,"decimal":0.12345678901234567,"exact":"9007199254740993"}', "json", ); expect(json.evidence.jsonNumbers).toEqual([ expect.objectContaining({ raw: "9007199254740993", risk: "unsafe-integer", }), expect.objectContaining({ raw: "0.12345678901234567", risk: "precision-risk", }), ]); expect(() => parseData('{"id":9007199254740993}', "json", { rejectUnsafeJsonNumbers: true, }), ).toThrow(/precision risk/iu); }); it("converts static XML and rejects entities", () => { expect( parseData( "AB", "xml", ).root, ).toEqual({ items: { item: [ { "@id": "1", "#text": "A" }, { "@id": "2", "#text": "B" }, ], }, }); expect(() => parseData(']>&y;', "xml"), ).toThrow(/entity/iu); }); });