Files
baiyue-firstleg/scripts/admin-test-env-modules/downloads.mjs
T
2026-08-08 10:11:04 +08:00

44 lines
2.9 KiB
JavaScript

function wait(milliseconds) { return new Promise((resolve) => setTimeout(resolve, milliseconds)) }
function isXlsx(response) {
return response.http === 200 && response.bytes?.length > 4 && response.bytes[0] === 0x50 && response.bytes[1] === 0x4b
}
export async function run(context) {
const module = 'downloads'
const createResponse = await context.request('POST', '/api/platform/v1/files/export-tasks', {
exportType: 'CUSTOMER_LIST', format: 'XLSX', taskName: `Admin全量验收-${context.marker}`,
parameters: { keyword: context.marker },
})
const task = context.apiSuccess(module, '创建客户列表导出任务', createResponse)
const taskId = task?.id == null ? '' : String(task.id)
context.assert(module, '导出任务创建字段正确', createResponse,
taskId && task?.exportType === 'CUSTOMER_LIST' && task?.format === 'XLSX',
`taskId=${taskId || 'missing'}, status=${task?.status ?? 'missing'}`)
if (!taskId) throw new Error('导出任务创建失败')
context.createdResources.exportTask = { id: taskId }
const listResponse = await context.request('GET', '/api/platform/v1/files/export-tasks?page=1&size=20&exportType=CUSTOMER_LIST')
const page = context.apiSuccess(module, '查询下载中心任务列表', listResponse)
context.assert(module, '下载中心列表包含新任务', listResponse,
page?.records?.some((item) => String(item.id) === taskId), `records=${page?.records?.length ?? 'n/a'}`)
let latestResponse = createResponse
let latest = task
for (let attempt = 0; attempt < 30 && !['SUCCEEDED', 'FAILED', 'EXPIRED'].includes(latest?.status); attempt += 1) {
await wait(2000)
latestResponse = await context.request('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}`)
if (latestResponse.http === 200 && String(latestResponse.body?.code) === '200') latest = latestResponse.body.data
}
context.addStep(module, '轮询导出任务直到终态', latestResponse,
latest?.status === 'SUCCEEDED', `status=${latest?.status ?? 'missing'}, processedRows=${latest?.processedRows ?? 'n/a'}`)
if (latest?.status !== 'SUCCEEDED') return
const detailResponse = await context.request('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}`)
const detail = context.apiSuccess(module, '查询导出任务详情', detailResponse)
context.assert(module, '导出详情行数和文件元数据正确', detailResponse,
String(detail?.id) === taskId && Number.isFinite(Number(detail?.processedRows)) && Number(detail?.sizeBytes) > 0,
`processedRows=${detail?.processedRows ?? 'n/a'}, sizeBytes=${detail?.sizeBytes ?? 'n/a'}`)
const downloadResponse = await context.requestBinary('GET', `/api/platform/v1/files/export-tasks/${encodeURIComponent(taskId)}/download`)
context.addStep(module, '下载并校验客户列表 XLSX', downloadResponse, isXlsx(downloadResponse),
`bytes=${downloadResponse.bytes?.length ?? 0}, contentType=${downloadResponse.contentType || 'missing'}`)
}