From 782e028abebcf216004997c2b6f56f1fce9bf4f4 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 25 Jun 2026 15:00:52 +0800 Subject: [PATCH] test: make metadata fixture executable on Windows (#220) * test: make metadata fixture executable on Windows * test: use node executable for metadata fixture * ci: avoid macos tsgolint crash --- .github/workflows/ci.yml | 5 +++++ tests/cli-metadata.test.ts | 45 +++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4c3f25b..e2efc1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,6 +48,11 @@ jobs: - run: pnpm install --frozen-lockfile - run: pnpm --version - run: pnpm check + if: matrix.os != 'macos-15' + + - name: Check without type-aware oxlint + if: matrix.os == 'macos-15' + run: pnpm format:check && pnpm typecheck - name: Verify generated schema is committed if: matrix.os == 'ubuntu-latest' diff --git a/tests/cli-metadata.test.ts b/tests/cli-metadata.test.ts index 6ca3221..bce7901 100644 --- a/tests/cli-metadata.test.ts +++ b/tests/cli-metadata.test.ts @@ -7,20 +7,45 @@ import { metadataPathForArtifact, readCliMetadata } from '../src/cli-metadata.js describe('readCliMetadata', () => { it('prefers embedded metadata over stale sidecar metadata', async () => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'mcporter-metadata-')); - const artifact = path.join(tempDir, 'artifact'); + const artifact = path.join(tempDir, process.platform === 'win32' ? 'artifact.exe' : 'artifact'); const embedded = metadataPayload('embedded'); const sidecar = metadataPayload('sidecar'); - await fs.writeFile( - artifact, - `#!/usr/bin/env node\nconsole.log(${JSON.stringify(JSON.stringify(embedded))});\n`, - 'utf8' - ); - await fs.chmod(artifact, 0o755); + const previousEmbeddedMetadata = process.env.MCPORTER_TEST_EMBEDDED_METADATA; + const previousNodeOptions = process.env.NODE_OPTIONS; + process.env.MCPORTER_TEST_EMBEDDED_METADATA = JSON.stringify(embedded); + if (process.platform === 'win32') { + const preload = path.join(tempDir, 'inspect-preload.cjs'); + await fs.copyFile(process.execPath, artifact); + await fs.writeFile( + preload, + 'console.log(process.env.MCPORTER_TEST_EMBEDDED_METADATA); process.exit(0);\n', + 'utf8' + ); + const requirePath = preload.replaceAll(path.sep, path.posix.sep); + process.env.NODE_OPTIONS = `${previousNodeOptions ? `${previousNodeOptions} ` : ''}--require ${requirePath}`; + } else { + const artifactContent = '#!/usr/bin/env node\nconsole.log(process.env.MCPORTER_TEST_EMBEDDED_METADATA);\n'; + await fs.writeFile(artifact, artifactContent, 'utf8'); + await fs.chmod(artifact, 0o755); + } await fs.writeFile(metadataPathForArtifact(artifact), JSON.stringify(sidecar), 'utf8'); - await expect(readCliMetadata(artifact)).resolves.toMatchObject({ - server: { name: 'embedded' }, - }); + try { + await expect(readCliMetadata(artifact)).resolves.toMatchObject({ + server: { name: 'embedded' }, + }); + } finally { + if (previousEmbeddedMetadata === undefined) { + delete process.env.MCPORTER_TEST_EMBEDDED_METADATA; + } else { + process.env.MCPORTER_TEST_EMBEDDED_METADATA = previousEmbeddedMetadata; + } + if (previousNodeOptions === undefined) { + delete process.env.NODE_OPTIONS; + } else { + process.env.NODE_OPTIONS = previousNodeOptions; + } + } }); });