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