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