UNPKG

@pact-toolbox/test

Version:
185 lines (180 loc) 7.26 kB
//#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