import test from 'node:test' import assert from 'node:assert/strict' const { createEvidenceUploadQueue } = await import(new URL('../utils/evidence-upload-queue.js', import.meta.url).href) test('evidence queue exposes upload progress and successful durable result', async () => { const changes = [] const queue = createEvidenceUploadQueue({ upload: async (item, progress) => { progress(45) return { fileId: 81, fileName: `${item.evidenceType}.jpg` } }, onChange: (items) => changes.push(items) }) queue.add({ id: 'empty-1', inboundId: 12, evidenceType: 'PHOTO_STEP_1', localPath: 'tmp/empty.jpg' }) const result = await queue.flush() assert.equal(result[0].status, 'SUCCEEDED') assert.equal(result[0].progress, 100) assert.equal(result[0].result.fileId, 81) assert.ok(changes.some((items) => items[0].status === 'UPLOADING' && items[0].progress === 45)) }) test('failed evidence remains observable and can be retried without a duplicate entry', async () => { let attempts = 0 const queue = createEvidenceUploadQueue({ upload: async () => { attempts += 1 if (attempts === 1) throw new Error('网络中断') return { fileId: 82 } } }) const entry = queue.add({ id: 'half-1', inboundId: 12, evidenceType: 'PHOTO_STEP_2', localPath: 'tmp/half.jpg' }) await queue.flush() assert.equal(queue.latest('PHOTO_STEP_2').status, 'FAILED') assert.equal(queue.latest('PHOTO_STEP_2').error, '网络中断') assert.equal(queue.retry(entry.id), true) await queue.flush() assert.equal(queue.latest('PHOTO_STEP_2').status, 'SUCCEEDED') assert.equal(queue.latest('PHOTO_STEP_2').attempts, 2) assert.equal(queue.snapshot().length, 1) }) test('same evidence type appends and explicit void preserves the old photo', async () => { const queue = createEvidenceUploadQueue({ upload: async () => { throw new Error('失败') } }) queue.add({ id: 'old', inboundId: 12, evidenceType: 'SEAL', localPath: 'tmp/old.jpg' }) await queue.flush() queue.add({ id: 'new', inboundId: 12, evidenceType: 'SEAL', localPath: 'tmp/new.jpg' }) assert.equal(queue.snapshot().find((item) => item.id === 'old').status, 'FAILED') assert.equal(queue.latest('SEAL').id, 'new') assert.equal(queue.voidEntry('old', '照片模糊', 'worker-1'), true) assert.equal(queue.snapshot().find((item) => item.id === 'old').status, 'VOIDED') assert.equal(queue.snapshot().find((item) => item.id === 'old').voidReason, '照片模糊') })