← back to AbramsOS
tests/extractor-regression.test.js
52 lines
// Golden-file regression tests for tier-1 receipt extractor.
// Adds new fixture? Drop a JSON file in tests/fixtures/receipts/ with shape:
// { fixture, expected: { merchant, total, orderNumber, minConfidence, shouldExtract? }, summary }
// The test discovers all *.json files in that dir.
const test = require('node:test');
const assert = require('node:assert');
const fs = require('node:fs');
const path = require('node:path');
const { extract } = require('../lib/receipt-extractor');
const FIXTURES_DIR = path.join(__dirname, 'fixtures', 'receipts');
const fixtures = fs.readdirSync(FIXTURES_DIR)
.filter(f => f.endsWith('.json'))
.map(f => ({ file: f, data: JSON.parse(fs.readFileSync(path.join(FIXTURES_DIR, f), 'utf8')) }));
test(`fixtures discovered (${fixtures.length})`, () => {
assert.ok(fixtures.length >= 5, `expected at least 5 fixtures, found ${fixtures.length}`);
});
for (const { file, data } of fixtures) {
const { fixture, expected, summary } = data;
test(`fixture · ${fixture}`, () => {
const r = extract(summary);
if (expected.shouldExtract === false) {
assert.strictEqual(r, null, `${fixture}: expected null (non-receipt), got ${JSON.stringify(r)}`);
return;
}
assert.ok(r, `${fixture}: expected extraction, got null`);
if (expected.merchant) {
assert.match(r.merchant, new RegExp(expected.merchant, 'i'),
`${fixture}: merchant '${r.merchant}' doesn't match '${expected.merchant}'`);
}
if (expected.total != null) {
assert.strictEqual(r.total, expected.total,
`${fixture}: total ${r.total} ≠ expected ${expected.total}`);
}
if (expected.orderNumber) {
assert.strictEqual(r.orderNumber, expected.orderNumber,
`${fixture}: orderNumber '${r.orderNumber}' ≠ '${expected.orderNumber}'`);
}
if (expected.minConfidence != null) {
assert.ok(r.confidence >= expected.minConfidence,
`${fixture}: confidence ${r.confidence} < ${expected.minConfidence}`);
}
});
}