Files
pda-uniapp/tests/evidence-upload-queue.test.mjs
T
2026-08-10 11:29:03 +08:00

59 lines
2.4 KiB
JavaScript

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, '照片模糊')
})