pdf-parse
Version:
Pure TypeScript, cross-platform module for extracting text, images, and tabular data from PDFs. Run directly in your browser or in Node!
115 lines (98 loc) • 3.6 kB
JavaScript
import { strict as assert } from 'node:assert';
import { exec } from 'node:child_process';
import { dirname, resolve } from 'node:path';
import { test } from 'node:test';
import { fileURLToPath } from 'node:url';
import { promisify } from 'node:util';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const execAsync = promisify(exec);
const cli = resolve(__dirname, 'cli.mjs');
test('prints help message and exits with 0', async () => {
const { stdout, stderr, error } = await execAsync(`node ${cli} --help`);
assert.ifError(error);
assert.strictEqual(stderr, '');
assert.match(stdout, /Usage: pdf-parse <command> <file> \[options\]/);
assert.match(stdout, /Commands:/);
assert.match(stdout, /check/);
assert.match(stdout, /info/);
assert.match(stdout, /text/);
assert.match(stdout, /image/);
assert.match(stdout, /screenshot/);
assert.match(stdout, /table/);
});
test('prints version and exits with 0', async () => {
const { stdout, stderr, error } = await execAsync(`node ${cli} --version`);
assert.ifError(error);
assert.strictEqual(stderr, '');
assert.match(stdout, /\d+\.\d+\.\d+/); // Version format like 1.0.0
});
test('exits with 1 on missing file argument', async () => {
await assert.rejects(execAsync(`node ${cli} info`), (err) => {
assert.match(err.stderr, /Error: PDF file path or URL is required/);
assert.strictEqual(err.code, 1);
return true;
});
});
test('exits with 1 on unknown command', async () => {
await assert.rejects(execAsync(`node ${cli} invalid test.pdf`), (err) => {
assert.match(err.stderr, /Error: Unknown command 'invalid'/);
assert.match(err.stderr, /Available commands:/);
assert.strictEqual(err.code, 1);
return true;
});
});
test('exits with 1 when check command used with local file', async () => {
// Create a dummy file for testing
const fs = await import('node:fs/promises');
const dummyFile = resolve(__dirname, 'dummy.pdf');
await fs.writeFile(dummyFile, 'dummy content');
try {
await assert.rejects(execAsync(`node ${cli} check ${dummyFile}`), (err) => {
assert.match(err.stderr, /Error: check command only works with URLs/);
assert.strictEqual(err.code, 1);
return true;
});
} finally {
// Clean up
await fs.unlink(dummyFile).catch(() => {});
}
});
test('recognizes all valid commands', async () => {
const commands = ['check', 'info', 'text', 'image', 'screenshot', 'ss', 'table'];
for (const cmd of commands) {
await assert.rejects(execAsync(`node ${cli} ${cmd}`), (err) => {
// Should fail due to missing file, not unknown command
assert.match(err.stderr, /PDF file path or URL is required/);
assert.strictEqual(err.code, 1);
return true;
});
}
});
test('parses options correctly', async () => {
// Create a dummy file for testing
const fs = await import('node:fs/promises');
const dummyFile = resolve(__dirname, 'dummy.pdf');
await fs.writeFile(dummyFile, 'dummy content');
try {
await assert.rejects(
execAsync(`node ${cli} info ${dummyFile} --format json --pages 1-3 --output result.json`),
(err) => {
// Should fail due to invalid PDF content, not option parsing error
assert.match(err.stderr, /Error:/);
assert.strictEqual(err.code, 1);
return true;
},
);
} finally {
// Clean up
await fs.unlink(dummyFile).catch(() => {});
}
});
test('screenshot command accepts ss alias', async () => {
await assert.rejects(execAsync(`node ${cli} ss`), (err) => {
assert.match(err.stderr, /PDF file path or URL is required/);
assert.strictEqual(err.code, 1);
return true;
});
});