From 8f78b37cf21e12dc75755bfd5d8193a28e3e0b29 Mon Sep 17 00:00:00 2001 From: Tony75546885 Date: Sat, 20 Jun 2026 22:26:19 +0200 Subject: [PATCH] test: fix flaky 'limit reset per Local storage' test Replace setTimeout-based timing with node:test mock.timers for deterministic behavior. The test was skipped since it relied on real-time delays which made it flaky in CI. Closes #698 (inline TODO) --- test/route-rate-limit.test.js | 40 +++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/test/route-rate-limit.test.js b/test/route-rate-limit.test.js index c240150..d53a460 100644 --- a/test/route-rate-limit.test.js +++ b/test/route-rate-limit.test.js @@ -695,10 +695,9 @@ test('variable max contenders', async (t) => { } }) -// // TODO this test gets extremely flaky because of setTimeout -// // rewrite using https://www.npmjs.com/package/@sinonjs/fake-timers -test('limit reset per Local storage', { skip: true }, async (t) => { - t.plan(12) +test('limit reset per Local storage', async (t) => { + const clock = mock.timers + clock.enable(0) const fastify = Fastify() await fastify.register(rateLimit, { global: false }) @@ -717,19 +716,28 @@ test('limit reset per Local storage', { skip: true }, async (t) => { } ) - setTimeout(doRequest.bind(null, 4), 0) - setTimeout(doRequest.bind(null, 3), 1000) - setTimeout(doRequest.bind(null, 2), 2000) - setTimeout(doRequest.bind(null, 1), 3000) - setTimeout(doRequest.bind(null, 0), 4000) - setTimeout(doRequest.bind(null, 4), 4100) + let res - function doRequest (resetValue) { - fastify.inject('/', (err, res) => { - t.error(err) - t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], resetValue) - }) - } + res = await fastify.inject('/') + t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], '4') + + clock.tick(1000) + res = await fastify.inject('/') + t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], '3') + + clock.tick(1000) + res = await fastify.inject('/') + t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], '2') + + clock.tick(1000) + res = await fastify.inject('/') + t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], '1') + + clock.tick(1000) + res = await fastify.inject('/') + t.assert.deepStrictEqual(res.headers['x-ratelimit-reset'], '4') + + clock.reset() }) test('hide rate limit headers', async (t) => {