56 lines
2.1 KiB
TypeScript
56 lines
2.1 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
|
|
import prisma from '../../utils/prisma'
|
|
import { updateSendingDeliveryIfLeaseOwned } from '../dingtalkDeliveryService'
|
|
|
|
test('租约已被新 Worker 接管时,旧 Worker 不能覆盖成功、失败或重试状态', async () => {
|
|
const originalUpdateMany = prisma.dingTalkDelivery.updateMany
|
|
const originalUpdate = prisma.dingTalkDelivery.update
|
|
const persisted = {
|
|
id: 81,
|
|
status: 'sending',
|
|
lease_owner: 'new-worker:81'
|
|
}
|
|
const attempts: any[] = []
|
|
let unconditionalUpdateCount = 0
|
|
|
|
;(prisma.dingTalkDelivery.updateMany as any) = async (args: any) => {
|
|
attempts.push(args)
|
|
const ownsCurrentLease = args.where.id === persisted.id &&
|
|
args.where.status === persisted.status &&
|
|
args.where.lease_owner === persisted.lease_owner
|
|
if (!ownsCurrentLease) return { count: 0 }
|
|
Object.assign(persisted, args.data)
|
|
return { count: 1 }
|
|
}
|
|
;(prisma.dingTalkDelivery.update as any) = async () => {
|
|
unconditionalUpdateCount += 1
|
|
return persisted
|
|
}
|
|
|
|
try {
|
|
const results = await Promise.all([
|
|
updateSendingDeliveryIfLeaseOwned(persisted.id, { status: 'sent' }),
|
|
updateSendingDeliveryIfLeaseOwned(persisted.id, { status: 'failed' }),
|
|
updateSendingDeliveryIfLeaseOwned(persisted.id, { status: 'retrying' })
|
|
])
|
|
|
|
assert.deepEqual(results, [false, false, false])
|
|
assert.equal(attempts.length, 3)
|
|
for (const attempt of attempts) {
|
|
assert.deepEqual(Object.keys(attempt.where).sort(), ['id', 'lease_owner', 'status'])
|
|
assert.equal(attempt.where.id, persisted.id)
|
|
assert.equal(attempt.where.status, 'sending')
|
|
assert.notEqual(attempt.where.lease_owner, persisted.lease_owner)
|
|
assert.ok(String(attempt.where.lease_owner).length > 0)
|
|
}
|
|
assert.equal(persisted.status, 'sending')
|
|
assert.equal(persisted.lease_owner, 'new-worker:81')
|
|
assert.equal(unconditionalUpdateCount, 0)
|
|
} finally {
|
|
;(prisma.dingTalkDelivery.updateMany as any) = originalUpdateMany
|
|
;(prisma.dingTalkDelivery.update as any) = originalUpdate
|
|
}
|
|
})
|