From babd3d781d50a8a33bce065f48aac01f7397e2da Mon Sep 17 00:00:00 2001 From: Daan Meijer Date: Fri, 9 Oct 2026 07:48:07 +0200 Subject: [PATCH] Rebuild: test the corrupt-chunk report Co-Authored-By: Claude Opus 5.5 --- tests/functional/node_api.spec.ts | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/functional/node_api.spec.ts b/tests/functional/node_api.spec.ts index 78a31e4..b78f25e 100644 --- a/tests/functional/node_api.spec.ts +++ b/tests/functional/node_api.spec.ts @@ -84,4 +84,24 @@ test.group('Node API', (group) => { assert.equal(range.status, 'done') assert.isFalse(await Spool.has(rangeId, { from: 1, to: 100 })) }) + test('a chunk that does not inflate: reported, removed from the spool, the range goes back', async ({ client, assert }) => { + const [g] = await db.table('groups').insert({ name: GROUP, priority: 1 }).returning('id') + const [r] = await db.table('ranges').insert({ group_id: g.id, start_id: 1, end_id: 300, next_id: 1, spooled_chunks: 3 }).returning('id') + const rangeId = Number(r.id) + for (const span of Spool.chunksOf({ start: 1, end: 300 })) await Spool.write(rangeId, span, chunk(span.from + 10)) + const node = await Node.create({ name: 'n1' }) + const token = (await Node.accessTokens.create(node)).value!.release() + ;(await client.post('/api/v1/node/lease').bearerToken(token)).assertStatus(200) + + ;(await client.post(`/api/v1/node/ranges/${rangeId}/corrupt`).bearerToken(token).json({ from: 101 })).assertStatus(200) + assert.deepEqual( + await Promise.all(Spool.chunksOf({ start: 1, end: 300 }).map((span) => Spool.has(rangeId, span))), + [true, false, true] + ) + const range = await db.from('ranges').where('id', rangeId).first() + assert.equal(range.status, 'planned') + assert.isNull(range.node_id) + // No longer this node's: a second report is refused. + ;(await client.post(`/api/v1/node/ranges/${rangeId}/corrupt`).bearerToken(token).json({ from: 101 })).assertStatus(409) + }) })