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);
});
});