import { test } from 'node:test'; import assert from 'node:assert/strict'; import { ipBackoff } from '../../src/auth/rate-limit.js'; test('first failure → small delay; repeated failures → exponential up to 30s', () => { ipBackoff.reset('1.2.3.4'); assert.equal(ipBackoff.delayMs('1.2.3.4'), 0); ipBackoff.recordFailure('1.2.3.4'); assert.equal(ipBackoff.delayMs('1.2.3.4'), 1000); ipBackoff.recordFailure('1.2.3.4'); assert.equal(ipBackoff.delayMs('1.2.3.4'), 2000); ipBackoff.recordFailure('1.2.3.4'); assert.equal(ipBackoff.delayMs('1.2.3.4'), 4000); for (let i = 0; i < 10; i++) ipBackoff.recordFailure('1.2.3.4'); assert.equal(ipBackoff.delayMs('1.2.3.4'), 30000); }); test('successful login resets the counter', () => { ipBackoff.reset('5.6.7.8'); ipBackoff.recordFailure('5.6.7.8'); ipBackoff.recordFailure('5.6.7.8'); ipBackoff.recordSuccess('5.6.7.8'); assert.equal(ipBackoff.delayMs('5.6.7.8'), 0); });