Why: A busy 409 used to enqueue a new id, so the retry created a second user message after the server had already stored the first. Evidence: vitest run passed, 13 files and 69 tests, including the outbox retry case. Impact: Data layer only. sendMessage and outbox flush reuse the queued message id as requestId. No screen changes. Refs: Dev feature/pi-durable-borrow Co-authored-by: Cursor <cursoragent@cursor.com>
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
deliveryRequestId, enqueueMessage, enqueueMessageFront, newQueuedMessage, promoteQueuedMessage,
|
|
removeQueuedMessage, replaceQueuedText,
|
|
} from '../src/outbox'
|
|
|
|
describe('outbox', () => {
|
|
it('appends, edits, promotes, and removes', () => {
|
|
const a = newQueuedMessage('a', [], [])
|
|
const b = newQueuedMessage('b', ['f1'], ['note.md'])
|
|
let q = enqueueMessage(enqueueMessage([], a), b)
|
|
expect(q.map(x => x.text)).toEqual(['a', 'b'])
|
|
q = replaceQueuedText(q, a.id, 'a2')
|
|
expect(q[0].text).toBe('a2')
|
|
q = promoteQueuedMessage(q, b.id)
|
|
expect(q.map(x => x.text)).toEqual(['b', 'a2'])
|
|
q = removeQueuedMessage(q, b.id)
|
|
expect(q.map(x => x.text)).toEqual(['a2'])
|
|
})
|
|
|
|
it('puts a busy conflict back at the front without duplicating', () => {
|
|
const a = newQueuedMessage('a', [], [])
|
|
const b = newQueuedMessage('b', [], [])
|
|
const q = enqueueMessageFront(enqueueMessage([], a), b)
|
|
const again = enqueueMessageFront(q, b)
|
|
expect(again.map(x => x.id)).toEqual([b.id, a.id])
|
|
})
|
|
|
|
it('reuses the queued id as the request id when the send is retried', () => {
|
|
const item = newQueuedMessage('hi', ['f1'], ['note.md'])
|
|
const queued = enqueueMessageFront([], item)
|
|
expect(deliveryRequestId(queued[0])).toBe(item.id)
|
|
const retried = enqueueMessageFront(queued, { ...item, text: item.text })
|
|
expect(deliveryRequestId(retried[0])).toBe(item.id)
|
|
expect(retried).toHaveLength(1)
|
|
})
|
|
})
|