文件
hyb-oa/scripts/qa/tests/visual-output-isolation.test.mjs
T

39 行
2.2 KiB
JavaScript

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);
}
}
}
});