Files
baiyue-firstleg/scripts/admin-test-env-modules/download-center.mjs
T
2026-10-08 17:07:57 +08:00

32 lines
2.4 KiB
JavaScript

import { parseXlsx } from './finance-downloads.mjs'
// Internal acceptance helper; callers retain their own fixture and deployment authorization.
export async function verifyDownloadCenterExport(context, module, exportType, parameters, headers, tokens = [], expectedStatus = 'SUCCEEDED') {
const options = { scenario: 'download-center-export', deploymentBlocker: true }
const base = '/api/platform/v1/files/export-tasks'
const created = await context.request('POST', base, { exportType, format: 'XLSX', taskName: `${context.marker}-${exportType}`, parameters })
const task = context.apiSuccess(module, `${exportType}创建下载任务`, created, '', options)
if (!task?.id) throw new Error('下载任务创建失败')
let state = task
for (let attempt = 0; attempt < 45 && !['SUCCEEDED', 'FAILED', 'EXPIRED'].includes(state.status); attempt++) {
if (attempt) await new Promise(resolve => setTimeout(resolve, 2000))
const response = await context.request('GET', `${base}/${encodeURIComponent(String(task.id))}`)
state = context.apiSuccess(module, `${exportType}查询下载任务`, response, '', options)
if (!state) throw new Error('下载任务查询失败')
}
context.assert(module, `${exportType}后台生成完成`, created, state.status === expectedStatus, state.failureMessage || state.status, options)
if (expectedStatus === 'FAILED' && state.status === 'FAILED') {
context.assert(module, `${exportType}失败原因可见`, created, Boolean(state.failureMessage), state.failureMessage || '', options)
return created
}
if (state.status !== 'SUCCEEDED') throw new Error(`导出未完成:${state.status}`)
const response = await context.requestBinary('GET', `${base}/${encodeURIComponent(String(task.id))}/download`)
context.assert(module, `${exportType}下载XLSX`, response, response.http === 200 && String(response.contentType).includes('spreadsheetml'), `bytes=${response.bytes?.length || 0}`, options)
const workbook = parseXlsx(response.bytes)
const content = workbook.rows.flat().join('|')
const valid = headers.every(header => workbook.headers.includes(header)) && tokens.every(token => content.includes(String(token)))
context.assert(module, `${exportType}表头与marker内容`, response, valid, `headers=${workbook.headers.join('|')}`, options)
if (!valid) throw new Error('导出文件缺少预期字段或本轮业务数据')
return response
}