From 3648a92b2bc0b5b4d47133479edf358684abeac2 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 9 May 2026 12:30:11 +0100 Subject: [PATCH] test: prebuild dist before vitest --- CHANGELOG.md | 4 ++++ package.json | 2 +- ...li-force-exit-behavior.integration.test.ts | 16 +--------------- tests/cli-generate-cli.integration.test.ts | 14 +++++--------- tests/daemon.integration.test.ts | 16 +--------------- tests/generate-cli.test.ts | 19 ++++++++++--------- tests/stdio-servers.integration.test.ts | 16 +--------------- 7 files changed, 23 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc483f2..3ad6440 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ splitting them as inline command strings, so app bundle helpers like Hopper's MCP server can be configured directly. +### Tooling + +- Build `dist/` once before the Vitest suite instead of letting parallel integration tests rebuild it mid-run. + ## [0.10.1] - 2026-05-04 ### CLI diff --git a/package.json b/package.json index c19bb37..81b41d1 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "typecheck": "tsgo --project tsconfig.json --noEmit", "test": "cross-env MCPORTER_TEST_REPORTER=quiet pnpm test:verbose", "test:quiet": "cross-env MCPORTER_TEST_REPORTER=quiet pnpm test:verbose", - "test:verbose": "node scripts/test-runner.js", + "test:verbose": "pnpm build && node scripts/test-runner.js", "test:live": "MCP_LIVE_TESTS=1 vitest run tests/live", "clean": "rimraf dist", "dev": "tsgo -w -p tsconfig.build.json", diff --git a/tests/cli-force-exit-behavior.integration.test.ts b/tests/cli-force-exit-behavior.integration.test.ts index 69e26e9..c7c3e2e 100644 --- a/tests/cli-force-exit-behavior.integration.test.ts +++ b/tests/cli-force-exit-behavior.integration.test.ts @@ -8,30 +8,16 @@ import { fileURLToPath, pathToFileURL } from 'node:url'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; const CLI_ENTRY = fileURLToPath(new URL('../dist/cli.js', import.meta.url)); -const PNPM_COMMAND = process.platform === 'win32' ? 'cmd.exe' : 'pnpm'; -const PNPM_ARGS_PREFIX = process.platform === 'win32' ? ['/d', '/s', '/c', 'pnpm'] : []; const testRequire = createRequire(import.meta.url); const MCP_SERVER_MODULE = pathToFileURL(testRequire.resolve('@modelcontextprotocol/sdk/server/mcp.js')).href; const STDIO_SERVER_MODULE = pathToFileURL(testRequire.resolve('@modelcontextprotocol/sdk/server/stdio.js')).href; const ZOD_MODULE = pathToFileURL(path.join(process.cwd(), 'node_modules', 'zod', 'index.js')).href; -function pnpmArgs(args: string[]): string[] { - return [...PNPM_ARGS_PREFIX, ...args]; -} - async function ensureDistBuilt(): Promise { try { await fs.access(CLI_ENTRY); } catch { - await new Promise((resolve, reject) => { - execFile(PNPM_COMMAND, pnpmArgs(['build']), { cwd: process.cwd(), env: process.env }, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + throw new Error('dist/cli.js is missing; run `pnpm build` before invoking this integration test directly.'); } } diff --git a/tests/cli-generate-cli.integration.test.ts b/tests/cli-generate-cli.integration.test.ts index d6bf5fd..4829aed 100644 --- a/tests/cli-generate-cli.integration.test.ts +++ b/tests/cli-generate-cli.integration.test.ts @@ -25,15 +25,11 @@ function pnpmArgs(args: string[]): string[] { } async function ensureDistBuilt(): Promise { - await new Promise((resolve, reject) => { - execFile(PNPM_COMMAND, pnpmArgs(['build']), { cwd: process.cwd(), env: process.env }, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + try { + await fs.access(CLI_ENTRY); + } catch { + throw new Error('dist/cli.js is missing; run `pnpm build` before invoking this integration test directly.'); + } } async function hasBun(): Promise { diff --git a/tests/daemon.integration.test.ts b/tests/daemon.integration.test.ts index 39de003..85801bf 100644 --- a/tests/daemon.integration.test.ts +++ b/tests/daemon.integration.test.ts @@ -12,12 +12,6 @@ const MCP_SERVER_MODULE = pathToFileURL(testRequire.resolve('@modelcontextprotoc const STDIO_SERVER_MODULE = pathToFileURL(testRequire.resolve('@modelcontextprotocol/sdk/server/stdio.js')).href; const ZOD_MODULE = pathToFileURL(testRequire.resolve('zod')).href; const describeDaemon = process.platform === 'win32' ? describe.skip : describe; -const PNPM_COMMAND = process.platform === 'win32' ? 'cmd.exe' : 'pnpm'; -const PNPM_ARGS_PREFIX = process.platform === 'win32' ? ['/d', '/s', '/c', 'pnpm'] : []; - -function pnpmArgs(args: string[]): string[] { - return [...PNPM_ARGS_PREFIX, ...args]; -} async function readFileWithRetries(filePath: string, retries = 20, delayMs = 100): Promise { let lastError: unknown; @@ -39,15 +33,7 @@ async function ensureDistBuilt(): Promise { try { await fs.access(CLI_ENTRY); } catch { - await new Promise((resolve, reject) => { - execFile(PNPM_COMMAND, pnpmArgs(['build']), { cwd: process.cwd(), env: process.env }, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + throw new Error('dist/cli.js is missing; run `pnpm build` before invoking this integration test directly.'); } } diff --git a/tests/generate-cli.test.ts b/tests/generate-cli.test.ts index f016070..3d1dd75 100644 --- a/tests/generate-cli.test.ts +++ b/tests/generate-cli.test.ts @@ -14,6 +14,15 @@ const describeGenerateCli = process.platform === 'win32' ? describe.skip : descr let baseUrl: URL; const tmpDir = path.join(process.cwd(), 'tmp', 'mcporter-cli-tests'); +const CLI_ENTRY = path.join(process.cwd(), 'dist', 'cli.js'); + +async function ensureDistBuilt(): Promise { + try { + await fs.access(CLI_ENTRY); + } catch { + throw new Error('dist/cli.js is missing; run `pnpm build` before invoking this integration test directly.'); + } +} if (process.platform !== 'win32') { beforeAll(async () => { @@ -199,15 +208,7 @@ describeGenerateCli('generateCli', () => { console.warn('bun is not available on this runner; skipping compilation checks.'); return; } - await new Promise((resolve, reject) => { - exec.exec('pnpm build', execOptions(), (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + await ensureDistBuilt(); const expectedBinaryPath = path.join(tmpDir, 'integration'); const { diff --git a/tests/stdio-servers.integration.test.ts b/tests/stdio-servers.integration.test.ts index ebfd679..9b7b9c7 100644 --- a/tests/stdio-servers.integration.test.ts +++ b/tests/stdio-servers.integration.test.ts @@ -7,26 +7,12 @@ import { fileURLToPath } from 'node:url'; import { afterAll, beforeAll, describe, expect, it } from 'vitest'; const CLI_ENTRY = fileURLToPath(new URL('../dist/cli.js', import.meta.url)); -const PNPM_COMMAND = process.platform === 'win32' ? 'cmd.exe' : 'pnpm'; -const PNPM_ARGS_PREFIX = process.platform === 'win32' ? ['/d', '/s', '/c', 'pnpm'] : []; - -function pnpmArgs(args: string[]): string[] { - return [...PNPM_ARGS_PREFIX, ...args]; -} async function ensureDistBuilt(): Promise { try { await fs.access(CLI_ENTRY); } catch { - await new Promise((resolve, reject) => { - execFile(PNPM_COMMAND, pnpmArgs(['build']), { cwd: process.cwd(), env: process.env }, (error) => { - if (error) { - reject(error); - return; - } - resolve(); - }); - }); + throw new Error('dist/cli.js is missing; run `pnpm build` before invoking this integration test directly.'); } }