import test, { beforeEach } from 'node:test'; import assert from 'node:assert/strict'; import { __resetIdempotencyStoreForTests, buildIdempotencyKey, readIdempotentResult, writeIdempotentResult, } from '../src/services/idempotency-store.js'; beforeEach(() => { process.env.IDEMPOTENCY_STORE = 'memory'; delete process.env.IDEMPOTENCY_DATABASE_URL; __resetIdempotencyStoreForTests(); }); test('buildIdempotencyKey composes user route and client key', () => { const key = buildIdempotencyKey({ userId: 'user-1', route: '/commands/orders/create', idempotencyKey: 'req-abc', }); assert.equal(key, 'user-1:/commands/orders/create:req-abc'); }); test('memory idempotency store returns existing payload for duplicate key', async () => { const compositeKey = buildIdempotencyKey({ userId: 'user-1', route: '/commands/orders/create', idempotencyKey: 'req-abc', }); const first = await writeIdempotentResult({ compositeKey, userId: 'user-1', route: '/commands/orders/create', idempotencyKey: 'req-abc', payload: { accepted: true, commandId: 'c-1' }, statusCode: 200, }); const second = await writeIdempotentResult({ compositeKey, userId: 'user-1', route: '/commands/orders/create', idempotencyKey: 'req-abc', payload: { accepted: true, commandId: 'c-2' }, statusCode: 200, }); const read = await readIdempotentResult(compositeKey); assert.equal(first.payload.commandId, 'c-1'); assert.equal(second.payload.commandId, 'c-1'); assert.equal(read.payload.commandId, 'c-1'); });