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 { PDFDocument, StandardFonts } from 'pdf-lib'; import { registerDocumentConverters } from '../../src/converters/document.js'; import { resolve } from '../../src/converters/registry.js'; let tmpDir; let pdfFixturePath; beforeAll(async () => { registerDocumentConverters(); tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'converter-document-from-pdf-')); const pdfDoc = await PDFDocument.create(); const page = pdfDoc.addPage([600, 400]); const font = await pdfDoc.embedFont(StandardFonts.Helvetica); page.drawText('Extractable fixture text', { x: 50, y: 350, size: 24, font }); const bytes = await pdfDoc.save(); pdfFixturePath = path.join(tmpDir, 'fixture.pdf'); await fs.writeFile(pdfFixturePath, bytes); }); afterAll(async () => { await fs.rm(tmpDir, { recursive: true, force: true }); }); describe('PDF source document converters', () => { it('extracts text from PDF to TXT', async () => { const outputPath = path.join(tmpDir, 'output.txt'); const entry = resolve('pdf', 'txt'); await entry.convert(pdfFixturePath, outputPath); const text = await fs.readFile(outputPath, 'utf8'); expect(text).toContain('Extractable fixture text'); }); it('extracts text from PDF to HTML', async () => { const outputPath = path.join(tmpDir, 'output.html'); const entry = resolve('pdf', 'html'); await entry.convert(pdfFixturePath, outputPath); const html = await fs.readFile(outputPath, 'utf8'); expect(html).toContain('Extractable fixture text'); expect(html).toContain('
'); }); it('extracts text from PDF to MD', async () => { const outputPath = path.join(tmpDir, 'output.md'); const entry = resolve('pdf', 'md'); await entry.convert(pdfFixturePath, outputPath); const markdown = await fs.readFile(outputPath, 'utf8'); expect(markdown).toContain('Extractable fixture text'); }); it('reconstructs PDF text into a DOCX (best-effort)', async () => { const outputPath = path.join(tmpDir, 'output.docx'); const entry = resolve('pdf', 'docx'); await entry.convert(pdfFixturePath, outputPath); const stat = await fs.stat(outputPath); expect(stat.size).toBeGreaterThan(0); const mammoth = await import('mammoth'); const result = await mammoth.default.convertToHtml({ path: outputPath }); expect(result.value).toContain('Extractable fixture text'); }); });