function id(value) { return value == null ? '' : String(value) } export async function run(context) { const module = 'audit' const base = '/api/platform/v1/audit/logs' const pageResponse = await context.request('GET', `${base}?page=1&size=20`) const page = context.apiSuccess(module, '查询平台操作日志首页', pageResponse) const records = Array.isArray(page?.records) ? page.records : [] const total = Number(page?.total) context.assert(module, '日志分页完整且标识字段齐全', pageResponse, Number(page?.page) === 1 && Number(page?.size) === 20 && Number.isFinite(total) && records.length === Math.min(20, total) && records.every((row) => id(row.id) && row.eventType && row.occurredAt), `page=${page?.page},size=${page?.size},total=${page?.total},records=${records.length}`) context.assert(module, '日志列表不返回变更前后快照', pageResponse, records.every((row) => !Object.hasOwn(row, 'beforeData') && !Object.hasOwn(row, 'afterData')), `records=${records.length}`) if (records[0]) { const detailResponse = await context.request('GET', `${base}/${encodeURIComponent(records[0].id)}`) const detail = context.apiSuccess(module, '查询当前日志详情', detailResponse) context.assert(module, '日志详情与列表身份一致', detailResponse, id(detail?.id) === id(records[0].id) && Object.hasOwn(detail || {}, 'httpMethod'), `id=${detail?.id},eventType=${detail?.eventType}`) } else { context.addCoverageGap(module, 'audit', '日志详情', '测试环境当前没有审计日志;先执行本轮业务写入后重跑', 'not-implemented', { blocking: false }) } const missingResponse = await context.request('GET', `${base}/999999999999999`) context.assert(module, '不存在的日志详情被拒绝', missingResponse, (missingResponse.http === 200 && ['A0403', 'A0404'].includes(String(missingResponse.body?.code))) || missingResponse.http === 404, `HTTP=${missingResponse.http},code=${missingResponse.body?.code ?? 'missing'}`) }