import assert from "node:assert/strict"; import { createRequire } from "node:module"; import { mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs"; import * as fs from "node:fs"; import os from "node:os"; import path from "node:path"; import vm from "node:vm"; import test from "node:test"; const require = createRequire(new URL("../../../client/package.json", import.meta.url)); const ts = require("typescript"); for (const configured of [false, true]) test(`截图输出按 spec/加载隔离,配置输出根=${configured}`, context => { const root = mkdtempSync(path.join(os.tmpdir(), "hyb-visual-path-test-")); context.after(() => rmSync(root, { recursive: true, force: true })); mkdirSync(path.join(root, "client")); const outputRoot = path.join(root, configured ? "report-visual" : "output/playwright"); const directories = []; for (const [file, marker, output] of [ ["internal-readiness-ui.spec.ts", "const WECOM_UA", "[SCREENSHOT_DIR]"], ["pc-finance-admin-visual-wave4.spec.ts", "const visualUser", "[outputDir, taskOutputDir]"], ]) { const source = readFileSync(new URL(`../../../client/tests/e2e/${file}`, import.meta.url), "utf8"); assert.ok(source.includes(marker)); const prefix = source.slice(0, source.indexOf(marker)); assert.ok(!prefix.includes("07-18-small-team-internal-readiness")); const script = ts.transpileModule(prefix + `\nglobalThis.observed = ${output};`, { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2022, esModuleInterop: true } }).outputText; for (let attempt = 0; attempt < 2; attempt += 1) { const sandbox = { exports: {}, process: { cwd: () => path.join(root, "client"), env: configured ? { QA_VISUAL_OUTPUT_DIR: outputRoot } : {} }, require: name => name === "node:fs" ? fs : name === "node:path" ? path : { test: { use() {} } } }; vm.runInNewContext(script, sandbox); for (const directory of sandbox.observed) { assert.ok(directory.startsWith(`${outputRoot}${path.sep}`)); assert.ok(!directory.includes("07-18-small-team-internal-readiness")); assert.ok(!directories.includes(directory)); directories.push(directory); } } } });