← back to AbramsOS
tests/rights-rules.test.js
45 lines
// Verifies pickCitedRules selects the right rule for each reason+routing combo.
const test = require('node:test');
const assert = require('node:assert');
require('dotenv').config();
const db = require('../lib/db');
const strategist = require('../lib/claim-strategist');
test.after(async () => { await db.pool.end(); });
test('returns_window_closing → merchant returns FTC money-back guide', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'returns_window_closing', routing: 'merchant', minAmount: 100 });
assert.ok(rules.length >= 1, 'should find at least one rule');
assert.ok(rules.some(r => /money-back|FTC/i.test(r.short_title) || /FTC/.test(r.citation)), 'should include the FTC guide');
});
test('returns_window_closing → issuer returns Reg Z claims-and-defenses', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'returns_window_closing', routing: 'issuer', minAmount: 100 });
assert.ok(rules.length >= 1);
assert.ok(rules.some(r => /1666i|claims-and-defenses/i.test(r.citation) || /Reg Z|FCBA/i.test(r.short_title)), 'should include FCBA/Reg Z');
});
test('warranty_expiry → manufacturer returns Magnuson-Moss', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'warranty_expiry', routing: 'manufacturer' });
assert.ok(rules.length >= 1);
assert.ok(rules.some(r => /Magnuson-Moss|2301/i.test(r.citation) || /Magnuson/i.test(r.short_title)));
});
test('recall_action_due → manufacturer returns CPSC remedy', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'recall_action_due', routing: 'manufacturer' });
assert.ok(rules.length >= 1);
assert.ok(rules.some(r => /CPSC/.test(r.citation)));
});
test('unknown reason returns 0 rules', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'unknown_reason_xyz', routing: 'merchant' });
assert.strictEqual(rules.length, 0);
});
test('limit caps results', async () => {
const rules = await strategist.pickCitedRules({ reasonCode: 'returns_window_closing', routing: 'merchant', limit: 1 });
assert.ok(rules.length <= 1);
});