← back to AbramsOS
tests/commitment-extractor.test.js
72 lines
const test = require('node:test');
const assert = require('node:assert');
const { extract, computeWindowEnd } = require('../lib/commitment-extractor');
function summary(text) {
return { headers: { subject: '', from: '', date: new Date().toISOString() }, body: { text, html: '' } };
}
test('30-day money-back guarantee', () => {
const r = extract(summary('Thanks for your order! 30-day money-back guarantee included.'));
assert.ok(r.length >= 1);
const m = r.find(x => x.commitment_type === 'money_back_guarantee');
assert.ok(m, 'should detect money_back_guarantee');
assert.strictEqual(m.window_days, 30);
assert.strictEqual(m.promised_outcome, 'refund');
});
test('returns within 60 days', () => {
const r = extract(summary('You may return within 60 days of purchase for a full refund.'));
const m = r.find(x => x.commitment_type === 'returns_window');
assert.ok(m);
assert.strictEqual(m.window_days, 60);
});
test('satisfaction guaranteed', () => {
const r = extract(summary('100% satisfaction guaranteed within 90 days or your money back.'));
const m = r.find(x => x.commitment_type === 'satisfaction_guarantee');
assert.ok(m);
assert.ok(m.window_days >= 30);
});
test('lifetime warranty sentinel', () => {
const r = extract(summary('All our products carry a lifetime warranty.'));
const m = r.find(x => x.commitment_type === 'returns_window');
assert.ok(m);
assert.strictEqual(m.window_days, 36500);
});
test('extracts conditions ("with original receipt")', () => {
const r = extract(summary('30-day money-back guarantee with original receipt and unworn items.'));
const m = r[0];
assert.match(m.conditions, /original/i);
assert.match(m.conditions, /unused/i);
});
test('price match policy detected', () => {
const r = extract(summary('Found it cheaper? We offer a price-match guarantee within 14 days.'));
assert.ok(r.find(x => x.commitment_type === 'price_match'));
});
test('no commitment in plain confirmation', () => {
const r = extract(summary('Your order is on its way. Tracking number: 1Z999.'));
assert.strictEqual(r.length, 0);
});
test('dedupe: same phrase wins once', () => {
const r = extract(summary('30-day money-back guarantee. 30-day money-back guarantee.'));
const mb = r.filter(x => x.commitment_type === 'money_back_guarantee');
assert.strictEqual(mb.length, 1);
});
test('computeWindowEnd produces correct deadline', () => {
const purchase = new Date('2026-01-01T00:00:00Z');
const end = computeWindowEnd(purchase, 30);
assert.strictEqual(end.toISOString().slice(0, 10), '2026-01-31');
});
test('computeWindowEnd null on bad input', () => {
assert.strictEqual(computeWindowEnd(null, 30), null);
assert.strictEqual(computeWindowEnd(new Date(), null), null);
});