68 lines
3.5 KiB
JavaScript
68 lines
3.5 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
|
|
}
|
|
|
|
test("部门导出提交名称筛选快照,复用人员导出的进度和下载流程", async () => {
|
|
const requests = []
|
|
const progress = []
|
|
const downloads = []
|
|
const submitted = { taskId: "a".repeat(32), redisKey: "admin:export:dept", 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/dept.ts"), "utf8"), {
|
|
"/@/utils/request": { default: request }, "/@/api/asyncTask": tasks,
|
|
})
|
|
const hook = load(fs.readFileSync(path.join(root, "hooks/batchExport.ts"), "utf8"), {
|
|
vue, "/@/components/AsyncTaskProgress.vue": {},
|
|
"/@/hooks/message": { useMessage: () => ({ error: message => assert.fail(message) }) },
|
|
"/@/utils/exportDownload": { downloadExportFile: (...args) => downloads.push(args) },
|
|
})
|
|
const descriptor = parse(fs.readFileSync(path.join(root, "views/admin/system/dept/index.vue"), "utf8")).descriptor
|
|
assert.deepEqual(compileTemplate({ source: descriptor.template.content, filename: "dept.vue", id: "dept" }).errors, [])
|
|
const page = load(compileScript(descriptor, { id: "dept" }).content, {
|
|
vue, "/@/api/admin/dept": api,
|
|
"/@/components/AsyncTaskProgress.vue": {}, "/@/hooks/batchExport": hook,
|
|
"vue-i18n": { useI18n: () => ({ t: key => key }) },
|
|
"/@/stores/userInfo": { useUserInfo: () => ({ userInfos: { roleCodes: [] } }) },
|
|
}, { ref: vue.ref, reactive: vue.reactive, defineAsyncComponent: vue.defineAsyncComponent })
|
|
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),
|
|
}
|
|
state.state.queryForm.deptName = "人事"
|
|
await state.exportExcel()
|
|
assert.equal(requests.length, 1)
|
|
assert.equal(requests[0].url, "/admin/dept/export-async")
|
|
assert.equal(requests[0].method, "post")
|
|
assert.deepEqual(requests[0].data, { deptName: "人事" })
|
|
assert.equal(state.state.queryForm.deptName, "人事")
|
|
assert.equal(state.exportTaskConfig.progressUrl, "/admin/async-task/progress")
|
|
assert.equal(state.exportTaskConfig.redisKey, "admin:export:dept")
|
|
assert.deepEqual(progress, ["部门管理", submitted])
|
|
state.state.queryForm.deptName = "财务"
|
|
await state.exportExcel()
|
|
assert.equal(requests.length, 1)
|
|
assert.equal(requests[0].data.deptName, "人事")
|
|
assert.equal(progress.at(-1), "show")
|
|
state.handleExportSuccess({ resultFileUrl: "/admin/sys-file/oss/file?fileName=depts.xlsx", resultFileName: "部门管理.xlsx" })
|
|
assert.deepEqual(downloads, [["/admin/sys-file/oss/file?fileName=depts.xlsx", "部门管理.xlsx"]])
|
|
})
|