vitest-e2e
Version:
vitest e2e utils
175 lines (172 loc) • 5.36 kB
JavaScript
import { testDir, page } from './chunk-7M6DEYMT.js';
import { isBuild, isWindows } from './chunk-JXTCPVDR.js';
import fs from 'fs-extra';
import path from 'node:path';
import { normalizePath } from 'vite';
import { expect } from 'vitest';
var timeout = (n) => new Promise((r) => setTimeout(r, n));
function readFile(filename) {
return fs.readFileSync(path.resolve(testDir, filename), "utf-8");
}
function editFile(filename, replacer, runInBuild = false) {
if (isBuild && !runInBuild)
return;
filename = path.resolve(testDir, filename);
const content = fs.readFileSync(filename, "utf-8");
const modified = replacer(content);
fs.writeFileSync(filename, modified);
}
function addFile(filename, content) {
fs.writeFileSync(path.resolve(testDir, filename), content);
}
function renameDir(dirname, to) {
fs.renameSync(path.resolve(testDir, dirname), path.resolve(testDir, to));
}
function removeFile(filename) {
fs.unlinkSync(path.resolve(testDir, filename));
}
function removeDir(dirname) {
fs.rmSync(path.resolve(testDir, dirname), { force: true, recursive: true });
}
function listFiles(dir = "") {
const filesDir = path.join(testDir, dir);
return fs.readdirSync(filesDir);
}
function listAssets(base = "", assets = "assets") {
const assetsDir = path.join(testDir, "dist", base, assets);
return fs.readdirSync(assetsDir);
}
function findAssetFile(match, base = "", assets = "assets") {
const assetsDir = path.join(testDir, "dist", base, assets);
let files;
try {
files = fs.readdirSync(assetsDir);
} catch (e) {
if (e.code === "ENOENT") {
return "";
}
throw e;
}
const file = files.find((file2) => {
return file2.match(match);
});
return file ? fs.readFileSync(path.resolve(assetsDir, file), "utf-8") : "";
}
function readManifest(base = "") {
return JSON.parse(fs.readFileSync(path.join(testDir, "dist", base, "manifest.json"), "utf-8"));
}
async function untilUpdated(poll, expected, runInBuild = false) {
if (isBuild && !runInBuild)
return;
const maxTries = process.env.CI ? 200 : 50;
for (let tries = 0; tries < maxTries; tries++) {
const actual = await poll() ?? "";
if (actual.includes(expected) || tries === maxTries - 1) {
expect(actual).toMatch(expected);
break;
} else {
await timeout(50);
}
}
}
async function withRetry(func, runInBuild = false) {
if (isBuild && !runInBuild)
return;
const maxTries = process.env.CI ? 200 : 50;
for (let tries = 0; tries < maxTries; tries++) {
try {
await func();
return;
} catch {
}
await timeout(50);
}
await func();
}
async function untilBrowserLogAfter(operation, target, arg3, arg4) {
const expectOrder = typeof arg3 === "boolean" ? arg3 : false;
const callback = typeof arg3 === "boolean" ? arg4 : arg3;
const promise = untilBrowserLog(target, expectOrder);
await operation();
const logs = await promise;
if (callback) {
await callback(logs);
}
return logs;
}
async function untilBrowserLog(target, expectOrder = true) {
let resolve;
let reject;
const promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
const logs = [];
try {
const isMatch = (matcher) => (text) => typeof matcher === "string" ? text === matcher : matcher.test(text);
let processMsg;
if (!target) {
processMsg = () => true;
} else if (Array.isArray(target)) {
if (expectOrder) {
const remainingTargets = [...target];
processMsg = (text) => {
const nextTarget = remainingTargets.shift();
expect(text).toMatch(nextTarget);
return remainingTargets.length === 0;
};
} else {
const remainingMatchers = target.map((element) => isMatch(element));
processMsg = (text) => {
const nextIndex = remainingMatchers.findIndex((matcher) => matcher(text));
if (nextIndex >= 0) {
remainingMatchers.splice(nextIndex, 1);
}
return remainingMatchers.length === 0;
};
}
} else {
processMsg = isMatch(target);
}
const handleMsg = (msg) => {
try {
const text = msg.text();
if (msg.text().includes("React DevTools"))
return;
logs.push(text);
const done = processMsg(text);
if (done) {
resolve();
}
} catch (err) {
reject(err);
}
};
page.on("console", handleMsg);
} catch (err) {
reject(err);
}
await promise;
return logs;
}
var formatSourcemapForSnapshot = (map) => {
const root = normalizePath(testDir);
const m = { ...map };
delete m.file;
delete m.names;
m.sources = m.sources.map((source) => source.replace(root, "/root"));
return m;
};
async function killProcess(serverProcess) {
if (isWindows) {
try {
const { execaCommandSync } = await import('execa');
execaCommandSync(`taskkill /pid ${serverProcess.pid} /T /F`);
} catch (e) {
console.error("failed to taskkill:", e);
}
} else {
serverProcess.kill("SIGTERM", { forceKillAfterTimeout: 2e3 });
}
}
export { addFile, editFile, findAssetFile, formatSourcemapForSnapshot, killProcess, listAssets, listFiles, readFile, readManifest, removeDir, removeFile, renameDir, untilBrowserLogAfter, untilUpdated, withRetry };