GuDingZiChan/backend/src/services/__tests__/dingtalkDeliveryService.lease.test.ts

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
}
})