Files
pj_admin_cloud/tests/log-export.test.cjs
T
dzc d86bc810cc fix:图片访问
fix:权限修改
2026-10-29 14:26:56 +08:00

94 lines
4.7 KiB
JavaScript

const { test } = require("node:test")
const assert = require("node:assert/strict")
const fs = require("node:fs")
const path = require("node:path")
const ts = require("typescript")
const vue = require("vue")
const { parse, compileScript, compileTemplate } = require("@vue/compiler-sfc")
const root = path.join(__dirname, "../src")
function load(source, mocks, globals = {}) {
const compiled = ts.transpileModule(source, {
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2021 },
}).outputText
const mod = { exports: {} }
new Function("module", "exports", "require", ...Object.keys(globals), compiled)(mod, mod.exports,
key => key in mocks ? mocks[key] : require(key), ...Object.values(globals))
return mod.exports
}
function setup() {
const requests = [], progress = [], downloads = [], errors = []
const submitted = { taskId: "a".repeat(32), redisKey: "admin:export:log", status: "PENDING" }
const request = options => { requests.push(options); return Promise.resolve({ data: submitted }) }
const tasks = load(fs.readFileSync(path.join(root, "api/asyncTask.ts"), "utf8"), {
"/@/utils/request": { default: request },
})
const api = load(fs.readFileSync(path.join(root, "api/admin/log.ts"), "utf8"), {
"/@/utils/request": { default: request }, "/@/api/asyncTask": tasks,
})
const messages = { useMessage: () => ({ error: message => errors.push(message) }) }
const hook = load(fs.readFileSync(path.join(root, "hooks/batchExport.ts"), "utf8"), {
vue, "/@/components/AsyncTaskProgress.vue": {}, "/@/hooks/message": messages,
"/@/utils/exportDownload": { downloadExportFile: (...args) => downloads.push(args) },
})
const descriptor = parse(fs.readFileSync(path.join(root, "views/admin/log/index.vue"), "utf8")).descriptor
assert.deepEqual(compileTemplate({ source: descriptor.template.content, filename: "log.vue", id: "log" }).errors, [])
const page = load(compileScript(descriptor, { id: "log" }).content, {
vue, "/@/api/admin/log": api,
"/@/components/AsyncTaskProgress.vue": {}, "/@/hooks/batchExport": hook,
"vue-i18n": { useI18n: () => ({ t: key => key }) },
"/@/hooks/table": { useTable: () => ({ getDataList() {}, tableStyle: {} }) },
"/@/hooks/message": messages, "/@/hooks/dict": { useDict: () => ({ log_type: [] }) },
}, {
ref: vue.ref, reactive: vue.reactive, defineAsyncComponent: vue.defineAsyncComponent,
onMounted() {}, useRoute: () => ({ query: {} }),
})
const state = page.default.setup({}, { expose() {} })
state.exportProgressRef.value = {
startSubmitting: name => progress.push(name), start: value => progress.push(value),
show: () => progress.push("show"), submissionFailed: message => assert.fail(message),
}
return { state, requests, progress, downloads, errors, submitted }
}
test("日志异步导出固定类型、时间和应用筛选,重复点击继续查看进度,成功后下载", async () => {
const { state, requests, progress, downloads, submitted } = setup()
Object.assign(state.state.queryForm, {
logType: "9", serviceId: "sms", current: 3, size: 10,
createTime: ["2026-10-29 00:00:00", "2026-10-29 23:59:59"],
})
await state.exportExcel()
assert.equal(requests.length, 1)
assert.equal(requests[0].url, "/admin/log/export-async")
assert.equal(requests[0].method, "post")
assert.deepEqual(requests[0].data, {
logType: "9", serviceId: "sms", createTime: ["2026-10-29 00:00:00", "2026-10-29 23:59:59"],
})
assert.equal(state.state.queryForm.current, 3)
assert.equal(state.state.queryForm.size, 10)
assert.equal(state.exportTaskConfig.progressUrl, "/admin/async-task/progress")
assert.equal(state.exportTaskConfig.redisKey, "admin:export:log")
assert.deepEqual(progress, ["操作日志", submitted])
state.state.queryForm.createTime[0] = "2026-10-28 00:00:00"
await state.exportExcel()
assert.equal(requests.length, 1)
assert.equal(requests[0].data.createTime[0], "2026-10-29 00:00:00")
assert.equal(progress.at(-1), "show")
state.handleExportSuccess({ resultFileUrl: "/admin/sys-file/oss/file?fileName=logs.xlsx", resultFileName: "操作日志.xlsx" })
assert.deepEqual(downloads, [["/admin/sys-file/oss/file?fileName=logs.xlsx", "操作日志.xlsx"]])
})
test("未选择或清空日志时间时提交空数组,任务失败后可以重新导出", async () => {
const { state, requests, errors } = setup()
await state.exportExcel()
assert.deepEqual(requests[0].data, { logType: "", createTime: [], serviceId: "" })
assert.equal(state.state.queryForm.createTime, "")
state.handleExportFailure({ message: "当前筛选条件没有可导出的日志" })
assert.deepEqual(errors, ["当前筛选条件没有可导出的日志"])
state.state.queryForm.createTime = null
await state.exportExcel()
assert.equal(requests.length, 2)
assert.deepEqual(requests[1].data.createTime, [])
})