import { describe, expect, it } from "vitest"; import JSZip from "jszip"; import { extractDocx } from "./extract"; const numberedDocument = ` First itemlink Second item `; const numberedDefinitions = ` `; const relationships = ``; function createDocxZip(entries: Record): Promise { const zip = new JSZip(); for (const [name, content] of Object.entries(entries)) zip.file(name, content); return zip.generateAsync({ type: "uint8array" }); } describe("DOCX extraction", () => { it("extracts numbering identity and link targets in paragraph order", async () => { const bytes = await createDocxZip({ "word/document.xml": numberedDocument, "word/numbering.xml": numberedDefinitions, "word/_rels/document.xml.rels": relationships, }); const result = await extractDocx(bytes); expect(result.paragraphs).toEqual([ { text: "First itemlink", numbering: { numId: "42", level: "1", format: "lowerLetter", marker: "%2)" } }, { text: "Second item", numbering: { numId: "42", level: "0", format: "decimal", marker: "%1." } }, ]); expect(result.links).toEqual(["https://example.com/item"]); expect(result.numberedParagraphs).toBe(2); }); it("handles valid DOCX archives without optional XML entries", async () => { const bytes = await createDocxZip({ "word/document.xml": numberedDocument }); const result = await extractDocx(bytes); expect(result.paragraphs.map((paragraph) => paragraph.numbering)).toEqual([null, null]); expect(result.links).toEqual([]); expect(result.numberingDefinitions).toBe(0); expect(result.numberedParagraphs).toBe(0); }); });