// @ts-nocheck /** * 集成测试 globalTeardown:删除一次性临时库,并最终复验项目数据源从未被打开或写入。 * 若发现指纹漂移,这里直接抛错让整条流水线变红 —— 安全保证必须是可失败的断言, * 而不是日志里的温馨提示。 */ const fs = require('fs'); const path = require('path'); const guard = require('./env.js'); function stamp(msg) { console.log(`[itest:teardown] ${msg}`); } module.exports = async function globalTeardown() { let manifest = null; try { manifest = JSON.parse(fs.readFileSync(guard.MANIFEST_PATH, 'utf8')); } catch { stamp('未找到 manifest(globalSetup 可能未执行);仍执行清理与守卫'); } const now = guard.devDbBaselines(); if (manifest?.baseline) { const drift = Object.keys(manifest.baseline).filter( (k) => !guard.sameFingerprint(manifest.baseline[k], now[k]), ); if (drift.length > 0) { throw new Error( `[itest:teardown] 安全事故:项目数据源在集成测试期间被改动 → ${JSON.stringify(drift, null, 2)}`, ); } } for (const f of [ guard.DB_PATH, `${guard.DB_PATH}-journal`, `${guard.DB_PATH}-wal`, `${guard.DB_PATH}-shm`, guard.DDL_PATH, guard.MANIFEST_PATH, `${guard.MANIFEST_PATH}.apply.json`, `${guard.MANIFEST_PATH}.baseline.json`, ]) { if (!f.startsWith(`${guard.TMP_REALPATH}${path.sep}`)) { throw new Error(`[itest:teardown] 拒绝删除非临时目录文件 ${f}`); } try { fs.rmSync(f); stamp(`removed ${f}`); } catch { /* 已不存在 */ } } stamp(`project dbs after run = ${JSON.stringify(now)}`); stamp('守卫通过:prisma/dev.db / dev.db / data.db 的 inode+size+mtime 与运行前完全一致'); };