GuDingZiChan/backend/src/services/__tests__/printService.authorization.test.ts

59 lines
1.9 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import prisma from '../../utils/prisma'
import { cancelQueuedPrintJob, PrintServiceError } from '../printService'
test('非管理员只能取消本人仍在排队的打印任务', async () => {
const originalFindUnique = prisma.printJob.findUnique
const originalUpdateMany = prisma.printJob.updateMany
let capturedWhere: any = null
;(prisma.printJob.findUnique as any) = async () => ({
id: 12,
status: 'queued',
requested_by: 7,
payload_json: '{}'
})
;(prisma.printJob.updateMany as any) = async ({ where }: any) => {
capturedWhere = where
return { count: 1 }
}
try {
await assert.rejects(
() => cancelQueuedPrintJob(12, 8, false),
(error: unknown) => error instanceof PrintServiceError && error.statusCode === 403
)
await cancelQueuedPrintJob(12, 7, false)
assert.equal(capturedWhere.requested_by, 7)
await cancelQueuedPrintJob(12, 99, true)
assert.equal('requested_by' in capturedWhere, false)
} finally {
;(prisma.printJob.findUnique as any) = originalFindUnique
;(prisma.printJob.updateMany as any) = originalUpdateMany
}
})
test('取消打印任务使用 queued 条件更新防止与打印终端领取竞争', async () => {
const originalFindUnique = prisma.printJob.findUnique
const originalUpdateMany = prisma.printJob.updateMany
;(prisma.printJob.findUnique as any) = async () => ({
id: 12,
status: 'queued',
requested_by: 7,
payload_json: '{}'
})
;(prisma.printJob.updateMany as any) = async () => ({ count: 0 })
try {
await assert.rejects(
() => cancelQueuedPrintJob(12, 7, false),
(error: unknown) => error instanceof PrintServiceError && error.statusCode === 409
)
} finally {
;(prisma.printJob.findUnique as any) = originalFindUnique
;(prisma.printJob.updateMany as any) = originalUpdateMany
}
})