@pact-toolbox/test
Version:
185 lines (180 loc) • 7.26 kB
JavaScript
//#region rolldown:runtime
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
get: ((k) => from[k]).bind(null, key),
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
value: mod,
enumerable: true
}) : target, mod));
//#endregion
const __pact_toolbox_config = __toESM(require("@pact-toolbox/config"));
const __pact_toolbox_network = __toESM(require("@pact-toolbox/network"));
const __pact_toolbox_runtime = __toESM(require("@pact-toolbox/runtime"));
const __pact_toolbox_utils = __toESM(require("@pact-toolbox/utils"));
const pathe = __toESM(require("pathe"));
const tiny_readdir_glob = __toESM(require("tiny-readdir-glob"));
const chalk = __toESM(require("chalk"));
const ora = __toESM(require("ora"));
const node_os = __toESM(require("node:os"));
//#region src/utils.ts
function getConfigOverrides(configOverrides) {
if (typeof configOverrides === "string") return { defaultNetwork: configOverrides };
return configOverrides || {};
}
function injectNetworkConfig(config) {
const network = (0, __pact_toolbox_config.getSerializableNetworkConfig)(config);
globalThis.__PACT_TOOLBOX_NETWORK_CONFIG__ = network;
}
async function updatePorts(config) {
const ports = await (0, __pact_toolbox_utils.getRandomNetworkPorts)();
const network = (0, __pact_toolbox_config.getNetworkConfig)(config);
if ((0, __pact_toolbox_config.isPactServerNetworkConfig)(network)) {
if (network.serverConfig) network.serverConfig.port = ports.service;
}
if ((0, __pact_toolbox_config.isDevNetworkConfig)(network)) {
if (network.containerConfig) network.containerConfig.port = ports.service;
}
return network;
}
//#endregion
//#region src/createTestEnv.ts
async function createPactTestEnv({ network, client, config, configOverrides } = {}) {
__pact_toolbox_utils.logger.pauseLogs();
if (!config) config = await (0, __pact_toolbox_config.resolveConfig)(configOverrides);
if (network) config.defaultNetwork = network;
await updatePorts(config);
injectNetworkConfig(config);
if (!client) client = new __pact_toolbox_runtime.PactToolboxClient(config);
const localNetwork = new __pact_toolbox_network.PactToolboxNetwork(config, {
client,
isDetached: true,
logAccounts: false,
isStateless: true
});
return {
start: async () => localNetwork.start(),
stop: async () => localNetwork.stop(),
restart: async () => localNetwork.restart(),
client,
config
};
}
//#endregion
//#region src/repl.ts
async function runWithConcurrency(items, iteratorFn, concurrency) {
const results = [];
const running = [];
let index = 0;
async function run() {
if (index >= items.length) return;
const i = index++;
const item = items[i];
if (!item) return;
const promise = iteratorFn(item).then((result) => {
results[i] = result;
});
running.push(promise);
if (running.length >= concurrency) await Promise.race(running);
await promise.finally(() => {
const promiseIndex = running.indexOf(promise);
if (promiseIndex > -1) running.splice(promiseIndex, 1);
});
await run();
}
const initialRuns = Array.from({ length: Math.min(concurrency, items.length) }, run);
await Promise.all(initialRuns);
await Promise.all(running);
return results;
}
async function runReplTests(config) {
const startTime = Date.now();
if (!config) config = await (0, __pact_toolbox_config.resolveConfig)();
const spinner = (0, ora.default)("Finding REPL tests").start();
const cwd = (0, pathe.join)(process.cwd(), config.contractsDir);
const aborter = new AbortController();
const result = await (0, tiny_readdir_glob.default)(`**/*.repl`, {
cwd,
depth: 20,
limit: 1e6,
followSymlinks: true,
ignore: ["prelude/**"],
signal: aborter.signal
});
const testFiles = result.files;
if (testFiles.length === 0) {
spinner.succeed("No REPL tests found.");
return;
}
spinner.info(`${testFiles.length} tests found.`);
spinner.start(`Running REPL tests...`);
let completed = 0;
const runTest = async (file) => {
const testStartTime = Date.now();
const cleanedFile = file.replace(cwd, "").substring(1);
try {
await (0, __pact_toolbox_utils.execAsync)(`pact -t ${file}`);
const duration = Date.now() - testStartTime;
completed++;
spinner.text = `[${completed}/${testFiles.length}] Running REPL tests... (${cleanedFile})`;
return {
filePath: cleanedFile,
status: "passed",
duration
};
} catch (error) {
completed++;
spinner.text = `[${completed}/${testFiles.length}] Running REPL tests... (${cleanedFile})`;
const duration = Date.now() - testStartTime;
return {
filePath: cleanedFile,
status: "failed",
error,
duration
};
}
};
const concurrency = Math.max(1, (0, node_os.cpus)().length - 1);
const allResults = await runWithConcurrency(testFiles, runTest, concurrency);
spinner.stop();
const totalDuration = Date.now() - startTime;
const passedTests = allResults.filter((r) => r.status === "passed");
const failedTests = allResults.filter((r) => r.status === "failed");
console.log("\n");
for (const result$1 of allResults) if (result$1.status === "passed") console.log(`${chalk.default.green.bold("PASS")} ${result$1.filePath} ${chalk.default.gray(`(${result$1.duration}ms)`)}`);
else console.log(`${chalk.default.red.bold("FAIL")} ${result$1.filePath} ${chalk.default.gray(`(${result$1.duration}ms)`)}`);
if (failedTests.length > 0) {
console.log(`\n${chalk.default.red.bold("Failed Tests:")}`);
for (const test of failedTests) {
console.log(`\n${chalk.default.red.bold("●")} ${test.filePath}`);
const errorMessage = test.error?.message ?? "Unknown error";
const cleanedError = errorMessage.includes("Command failed:") ? errorMessage.split("Command failed:")[1]?.trim() ?? "" : errorMessage;
console.log(`${chalk.default.red(cleanedError)}`);
}
}
console.log("\n");
console.log(chalk.default.bold("REPL Test-runner Summary"));
console.log(` ${chalk.default.bold("Test Suites:")} ${failedTests.length > 0 ? `${chalk.default.red.bold(`${failedTests.length} failed`)}, ` : ""}${chalk.default.green.bold(`${passedTests.length} passed`)}, ${allResults.length} total`);
console.log(` ${chalk.default.bold("Time:")} ${(totalDuration / 1e3).toFixed(2)}s`);
console.log("\n");
if (failedTests.length > 0) process.exit(1);
}
//#endregion
exports.createPactTestEnv = createPactTestEnv;
exports.getConfigOverrides = getConfigOverrides;
exports.injectNetworkConfig = injectNetworkConfig;
exports.runReplTests = runReplTests;
exports.updatePorts = updatePorts;
//# sourceMappingURL=index.node.cjs.map