import { describe, it, expect, beforeAll, afterAll } from 'vitest'; import fs from 'node:fs/promises'; import path from 'node:path'; import os from 'node:os'; import { Document, Paragraph, TextRun, Packer } from 'docx'; import { registerDocumentConverters } from '../../src/converters/document.js'; import { resolve } from '../../src/converters/registry.js'; import { detectInputMime } from '../../src/mime.js'; let tmpDir; let docxFixturePath; beforeAll(async () => { registerDocumentConverters(); tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'converter-document-')); const doc = new Document({ sections: [ { children: [new Paragraph({ children: [new TextRun('Hello from the fixture document')] })], }, ], }); const buffer = await Packer.toBuffer(doc); docxFixturePath = path.join(tmpDir, 'fixture.docx'); await fs.writeFile(docxFixturePath, buffer); }); afterAll(async () => { await fs.rm(tmpDir, { recursive: true, force: true }); }); describe('document converters', () => { it('converts DOCX to HTML containing the source text', async () => { const outputPath = path.join(tmpDir, 'output.html'); const entry = resolve('docx', 'html'); await entry.convert(docxFixturePath, outputPath); const html = await fs.readFile(outputPath, 'utf8'); expect(html).toContain('Hello from the fixture document'); }, 20000); it('converts TXT to a valid PDF', async () => { const inputPath = path.join(tmpDir, 'fixture.txt'); await fs.writeFile(inputPath, 'Plain text content for the PDF'); const outputPath = path.join(tmpDir, 'from-txt.pdf'); const entry = resolve('txt', 'pdf'); await entry.convert(inputPath, outputPath); const detected = await detectInputMime(outputPath); expect(detected.mime).toBe('application/pdf'); }, 20000); it('converts HTML to a valid PDF', async () => { const inputPath = path.join(tmpDir, 'fixture.html'); await fs.writeFile(inputPath, '

Hello HTML

'); const outputPath = path.join(tmpDir, 'from-html.pdf'); const entry = resolve('html', 'pdf'); await entry.convert(inputPath, outputPath); const detected = await detectInputMime(outputPath); expect(detected.mime).toBe('application/pdf'); }, 20000); it('converts DOCX to a valid PDF', async () => { const outputPath = path.join(tmpDir, 'from-docx.pdf'); const entry = resolve('docx', 'pdf'); await entry.convert(docxFixturePath, outputPath); const detected = await detectInputMime(outputPath); expect(detected.mime).toBe('application/pdf'); }, 20000); it('converts MD to HTML', async () => { const inputPath = path.join(tmpDir, 'fixture.md'); await fs.writeFile(inputPath, '# Heading\n\nSome **bold** text.'); const outputPath = path.join(tmpDir, 'from-md.html'); const entry = resolve('md', 'html'); await entry.convert(inputPath, outputPath); const html = await fs.readFile(outputPath, 'utf8'); expect(html).toContain('

Heading

'); expect(html).toContain('bold'); }); it('converts HTML to MD', async () => { const inputPath = path.join(tmpDir, 'fixture-for-md.html'); await fs.writeFile(inputPath, '

Heading

Some bold text.

'); const outputPath = path.join(tmpDir, 'from-html.md'); const entry = resolve('html', 'md'); await entry.convert(inputPath, outputPath); const markdown = await fs.readFile(outputPath, 'utf8'); expect(markdown).toContain('# Heading'); expect(markdown).toContain('**bold**'); }); });