← back to AbramsOS

tests/extractor.test.js

50 lines

const test = require('node:test');
const assert = require('node:assert');
const { extract, inferMerchant, extractTotal, extractOrderNumber } = require('../lib/receipt-extractor');

test('extractTotal finds order total', () => {
  const { amount, currency } = extractTotal('Order Total: $42.99');
  assert.strictEqual(amount, 42.99);
  assert.strictEqual(currency, 'USD');
});

test('extractTotal handles thousands separator', () => {
  const { amount } = extractTotal('Grand Total: $1,234.56');
  assert.strictEqual(amount, 1234.56);
});

test('extractOrderNumber finds Amazon-style', () => {
  const id = extractOrderNumber('Your order #112-4455667-1234567 has shipped');
  assert.strictEqual(id, '112-4455667-1234567');
});

test('inferMerchant uses display name', () => {
  const r = inferMerchant({ from: '"Best Buy Orders" <orders@bestbuy.com>', subject: '' });
  assert.match(r.name, /Best Buy/);
});

test('extract returns null for non-receipt', () => {
  const summary = {
    headers: { subject: 'Verify your email', from: 'no-reply@some.com', date: new Date().toISOString() },
    body: { text: 'Click here to verify your email address.' },
  };
  assert.strictEqual(extract(summary), null);
});

test('extract returns purchase for shaped receipt', () => {
  const summary = {
    headers: {
      subject: 'Your Amazon.com order #112-7654321-7654321',
      from: '"Amazon.com" <auto-confirm@amazon.com>',
      date: new Date().toISOString(),
    },
    body: { text: 'Thanks for your order. Order Total: $24.99.', html: '' },
  };
  const e = extract(summary);
  assert.ok(e, 'should extract');
  assert.match(e.merchant, /Amazon/);
  assert.strictEqual(e.total, 24.99);
  assert.strictEqual(e.orderNumber, '112-7654321-7654321');
  assert.ok(e.confidence >= 0.7);
});