safety-eval-service-frontend/docs/test-reports/测试用例/test-qual-filing-interactio...

250 lines
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 资质申请管理 — 页面交互逻辑 + 后端联调全链路测试
*
* 覆盖本次改造:
* - 新建申请不预调 draft列表 API 计数不变)
* - 暂存后入库并可回显
* - 材料前端模板 + 暂存时 init-template
* - 提交前核验(全通过/有失败)
* - 前端路由 bundle 检测
*
* 运行:
* node docs/test-reports/测试用例/test-qual-filing-interaction.mjs
*/
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT = path.resolve(__dirname, "../../..");
const API_BASE = process.env.API_BASE || "http://127.0.0.1:8095/safetyEval";
const ORG_INFO_ID = process.env.ORG_INFO_ID || "1";
const FRONTEND_BASE = process.env.FRONTEND_BASE || "http://127.0.0.1:8081";
const DEFAULT_URL =
"https://s1.aigei.com/prevfiles/6f2754563be2491bad7c957904cd7d2a.jpg?e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:CR60zg7VKDp-jUWyYls_rdvyQMM=";
let passed = 0;
let failed = 0;
function assert(name, condition, detail = "") {
if (condition) {
passed += 1;
console.log(`${name}${detail ? `${detail}` : ""}`);
}
else {
failed += 1;
console.log(`${name}${detail ? `${detail}` : ""}`);
}
}
async function api(method, path, body) {
const res = await fetch(`${API_BASE}${path}`, {
method,
headers: { "Content-Type": "application/json", orgInfoId: ORG_INFO_ID },
body: body !== undefined ? JSON.stringify(body) : undefined,
});
const text = await res.text();
try {
return { httpStatus: res.status, ...JSON.parse(text) };
}
catch {
return { httpStatus: res.status, success: false, raw: text };
}
}
function readSrc(rel) {
return fs.readFileSync(path.join(ROOT, rel), "utf8");
}
// ── 静态:新建不预调后端 ──
function testStaticNoPreCreate() {
console.log("\n=== 静态检查:新建不预调后端 ===");
const listPage = readSrc("src/pages/Container/QualApplication/FilingApplication/List/index.js");
assert("列表-申请备案不调 qualFilingDraft", !listPage.includes("qualFilingDraft"));
assert("列表-申请备案不调 init-template", !listPage.includes("qualFilingMaterialInitTemplate"));
assert("列表-直接跳转表单", listPage.includes("goFilingForm({ mode: FILING_FORM_MODE.APPLICATION })"));
const formPage = readSrc("src/pages/Container/QualApplication/FilingForm/index.js");
assert("表单-存在 persistFilingToBackend", formPage.includes("persistFilingToBackend"));
assert("表单-存在核验弹窗", formPage.includes("PrerequisiteVerifyModal"));
assert("表单-存在 session 本地草稿", formPage.includes("saveLocalDraft"));
assert("表单-材料本地更新", formPage.includes("uploadStatusName: \"已上传\""));
const basicStep = readSrc("src/pages/Container/QualApplication/FilingForm/components/BasicInfoStep.jsx");
assert("基本信息-证照类型选项", basicStep.includes("QUALIFICATION_INDUSTRY_OPTIONS"));
const commitment = readSrc("src/pages/Container/QualApplication/FilingForm/components/CommitmentStep.jsx");
assert("承诺书-法定代表人下拉", commitment.includes("legalRepPersonnelId"));
assert("承诺书-动态填充文本", commitment.includes("COMMITMENT_PARAGRAPHS"));
assert("材料模板-10项", readSrc("src/pages/Container/QualApplication/filingMaterialTemplate.js").includes("sortOrder: 10"));
}
// ── 核验逻辑 ──
async function testVerifyLogic() {
console.log("\n=== 核验逻辑 ===");
const verifyMod = await import(path.join(ROOT, "src/pages/Container/QualApplication/filingVerify.js"));
const { verifyFilingPrerequisites } = verifyMod;
const failDetail = {
fixedAssetAmount: 500,
workplaceArea: 500,
personnelList: [],
equipmentList: [],
materials: [{ sortOrder: 10, attachmentUrl: null }],
};
const failResult = verifyFilingPrerequisites(failDetail);
assert("核验-不完整时应失败", failResult.passed === false, `items=${failResult.items.length}`);
const passDetail = {
fixedAssetAmount: 1200,
workplaceArea: 1200,
equipmentList: [{ id: 1 }],
materials: [{ sortOrder: 10, attachmentUrl: DEFAULT_URL }],
personnelList: Array.from({ length: 25 }, (_, i) => ({
personName: `P${i}`,
registerEngineerFlag: i < 8 ? 1 : 0,
titleName: i < 8 ? "高级" : "中级",
positionName: i === 0 ? "负责人" : i === 1 ? "技术负责人" : i === 2 ? "质量负责人" : "工程师",
workExperience: "在本行业工作五年",
})),
};
const passResult = verifyFilingPrerequisites(passDetail);
assert("核验-完整数据应通过", passResult.passed === true);
}
// ── 模拟前端 persist 全链路 ──
async function testPersistFlow() {
console.log("\n=== 交互链路:暂存入库 + 回显 ===");
const beforePage = await api("GET", "/qual-filing/page?current=1&size=1&applyTypeCode=1");
const beforeTotal = beforePage.total ?? 0;
// 模拟用户填写后点暂存(等同 persistFilingToBackend
const draft = await api("POST", "/qual-filing/draft?applyTypeCode=1");
assert("暂存-创建草稿", draft.success === true && draft.data?.id, `id=${draft.data?.id}`);
const filingId = draft.data?.id;
if (!filingId) {
return;
}
const saveBasic = await api("POST", "/qual-filing/save-draft", {
id: filingId,
businessScope: "石油加工业,化学原料、化学品及医药制造业",
filingTerritoryName: "渝北区",
filingTerritoryCode: "渝北区",
filingUnitName: "交互测试评价机构",
fixedAssetAmount: 1200,
workplaceArea: 1500,
});
assert("暂存-基本信息", saveBasic.success === true, saveBasic.message);
await api("POST", `/qual-filing-material/init-template?filingId=${filingId}`);
const detailAfterInit = await api("GET", `/qual-filing/detail?id=${filingId}`);
assert("暂存-材料模板10项", detailAfterInit.data?.materials?.length === 10);
for (const material of detailAfterInit.data.materials || []) {
await api("POST", "/qual-filing-material/upload", {
id: material.id,
attachmentUrl: DEFAULT_URL,
});
}
const commitmentContent = "本人是郑远平是交互测试评价机构法定代表人,现代表我单位承诺如下:";
await api("POST", "/qual-filing-commitment/save-or-update", {
filingId,
signDate: "2026-06-30",
legalRepSignatureUrl: DEFAULT_URL,
commitmentContent,
});
const personnelPage = await api("GET", "/org-personnel/page?current=1&size=5");
const personnelIds = (personnelPage.data || []).map((p) => p.id).filter(Boolean);
if (personnelIds.length) {
await api("POST", "/qual-filing-personnel/batch-add-from-org", {
filingId,
sourcePersonnelIds: personnelIds.slice(0, 2),
});
}
const equipPage = await api("GET", "/org-equipment/page?current=1&size=5");
const equipIds = (equipPage.data || []).map((e) => e.id).filter(Boolean);
if (equipIds.length) {
await api("POST", "/qual-filing-equipment/batch-add-from-org", {
filingId,
sourceEquipmentIds: equipIds.slice(0, 1),
});
}
const reloaded = await api("GET", `/qual-filing/detail?id=${filingId}`);
assert("回显-业务范围", reloaded.data?.businessScope?.includes("化学"), reloaded.data?.businessScope);
assert("回显-材料已上传", (reloaded.data?.materials || []).every((m) => m.uploadStatusCode === 2));
assert("回显-承诺书", !!reloaded.data?.commitment?.commitmentContent);
assert("回显-人员", (reloaded.data?.personnelList || []).length >= 1 || personnelIds.length === 0);
assert("回显-装备", (reloaded.data?.equipmentList || []).length >= 1 || equipIds.length === 0);
const afterPage = await api("GET", "/qual-filing/page?current=1&size=20&applyTypeCode=1");
assert("列表-暂存后总数增加", (afterPage.total ?? 0) >= beforeTotal + 1, `before=${beforeTotal} after=${afterPage.total}`);
// 提交应进入审核中
const submit = await api("POST", `/qual-filing/submit?id=${filingId}`);
assert("提交-进入审核中", submit.success === true && submit.data?.filingStatusCode === 2, submit.data?.filingStatusName);
}
// ── 前端 bundle / 路由 ──
async function testFrontendBundle() {
console.log("\n=== 前端页面 bundle 检测 ===");
const pages = [
["/certificate/container/qualApplication/filingApplication/list", "资质备案申请列表"],
["/certificate/container/qualApplication/filedManage/list", "已备案资质管理"],
["/certificate/container/qualApplication/filingChange/list", "备案变更管理"],
["/certificate/container/qualApplication/filingForm?mode=application", "备案表单(无id)"],
["/certificate/container/qualApplication/filingForm?mode=application&id=1", "备案表单(有id)"],
];
for (const [route, label] of pages) {
const res = await fetch(`${FRONTEND_BASE}${route}`);
assert(`HTTP-${label}`, res.status === 200, String(res.status));
}
const html = await (await fetch(`${FRONTEND_BASE}/certificate/`)).text();
const jsMatch = html.match(/src="(\/certificate\/static\/js\/main\.[^"]+\.js)"/);
assert("前端-main.js 可解析", !!jsMatch);
if (jsMatch) {
const js = await (await fetch(`${FRONTEND_BASE}${jsMatch[1]}`)).text();
const markers = [
"FilingApplicationListPage",
"qualApplication/filingApplication/list",
"PrerequisiteVerifyModal",
"QUALIFICATION_INDUSTRY_OPTIONS",
"persistFilingToBackend",
"verifyFilingPrerequisites",
"legalRepPersonnelId",
];
for (const marker of markers) {
assert(`Bundle-${marker}`, js.includes(marker));
}
}
}
async function main() {
console.log("资质申请管理 — 页面交互 + 后端全链路测试");
console.log(`API_BASE=${API_BASE} FRONTEND=${FRONTEND_BASE} orgInfoId=${ORG_INFO_ID}`);
testStaticNoPreCreate();
await testVerifyLogic();
await testPersistFlow();
await testFrontendBundle();
console.log(`\n=== 结果: ${passed} 通过, ${failed} 失败 ===\n`);
if (failed > 0) {
process.exit(1);
}
}
main().catch((err) => {
console.error(err);
process.exit(1);
});