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