From ea1d483fe6e3031e6f92f4d21ff19bd122d2c56c Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Apr 2026 04:23:37 +0100 Subject: [PATCH] test(extensions): share direct import smoke harness --- extensions/irc/runtime-api.test.ts | 45 +++---------------- .../mattermost/channel-plugin-api.test.ts | 30 ++----------- test/helpers/plugins/direct-smoke.ts | 25 +++++++++++ 3 files changed, 33 insertions(+), 67 deletions(-) create mode 100644 test/helpers/plugins/direct-smoke.ts diff --git a/extensions/irc/runtime-api.test.ts b/extensions/irc/runtime-api.test.ts index a97ef7135b6..9fa47390248 100644 --- a/extensions/irc/runtime-api.test.ts +++ b/extensions/irc/runtime-api.test.ts @@ -1,53 +1,18 @@ -import { execFile } from "node:child_process"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { promisify } from "node:util"; import { describe, expect, it } from "vitest"; - -const execFileAsync = promisify(execFile); -const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".."); -const ircImportEnv = { - HOME: process.env.HOME, - NODE_OPTIONS: process.env.NODE_OPTIONS, - NODE_PATH: process.env.NODE_PATH, - PATH: process.env.PATH, - TERM: process.env.TERM, -} satisfies NodeJS.ProcessEnv; +import { runDirectImportSmoke } from "../../test/helpers/plugins/direct-smoke.js"; describe("irc bundled api seams", () => { it("loads the narrow channel plugin api in direct smoke", async () => { - const { stdout } = await execFileAsync( - process.execPath, - [ - "--import", - "tsx", - "-e", - 'const mod = await import("./extensions/irc/channel-plugin-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), id: mod.ircPlugin.id}));', - ], - { - cwd: repoRoot, - env: ircImportEnv, - timeout: 40_000, - }, + const stdout = await runDirectImportSmoke( + 'const mod = await import("./extensions/irc/channel-plugin-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), id: mod.ircPlugin.id}));', ); expect(stdout).toBe('{"keys":["ircPlugin"],"id":"irc"}'); }, 45_000); it("loads the narrow runtime api in direct smoke", async () => { - const { stdout } = await execFileAsync( - process.execPath, - [ - "--import", - "tsx", - "-e", - 'const mod = await import("./extensions/irc/runtime-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), type: typeof mod.setIrcRuntime}));', - ], - { - cwd: repoRoot, - env: ircImportEnv, - timeout: 40_000, - }, + const stdout = await runDirectImportSmoke( + 'const mod = await import("./extensions/irc/runtime-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), type: typeof mod.setIrcRuntime}));', ); expect(stdout).toBe('{"keys":["setIrcRuntime"],"type":"function"}'); diff --git a/extensions/mattermost/channel-plugin-api.test.ts b/extensions/mattermost/channel-plugin-api.test.ts index 0b523a29910..da3cc13f74c 100644 --- a/extensions/mattermost/channel-plugin-api.test.ts +++ b/extensions/mattermost/channel-plugin-api.test.ts @@ -1,34 +1,10 @@ -import { execFile } from "node:child_process"; -import path from "node:path"; -import { fileURLToPath } from "node:url"; -import { promisify } from "node:util"; import { describe, expect, it } from "vitest"; - -const execFileAsync = promisify(execFile); -const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".."); -const importEnv = { - HOME: process.env.HOME, - NODE_OPTIONS: process.env.NODE_OPTIONS, - NODE_PATH: process.env.NODE_PATH, - PATH: process.env.PATH, - TERM: process.env.TERM, -} satisfies NodeJS.ProcessEnv; +import { runDirectImportSmoke } from "../../test/helpers/plugins/direct-smoke.js"; describe("mattermost bundled api seam", () => { it("loads the narrow channel plugin api in direct smoke", async () => { - const { stdout } = await execFileAsync( - process.execPath, - [ - "--import", - "tsx", - "-e", - 'const mod = await import("./extensions/mattermost/channel-plugin-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), id: mod.mattermostPlugin.id, setupId: mod.mattermostSetupPlugin.id}));', - ], - { - cwd: repoRoot, - env: importEnv, - timeout: 40_000, - }, + const stdout = await runDirectImportSmoke( + 'const mod = await import("./extensions/mattermost/channel-plugin-api.ts"); process.stdout.write(JSON.stringify({keys:Object.keys(mod).sort(), id: mod.mattermostPlugin.id, setupId: mod.mattermostSetupPlugin.id}));', ); expect(stdout).toBe( diff --git a/test/helpers/plugins/direct-smoke.ts b/test/helpers/plugins/direct-smoke.ts new file mode 100644 index 00000000000..517bbd576ed --- /dev/null +++ b/test/helpers/plugins/direct-smoke.ts @@ -0,0 +1,25 @@ +import { execFile } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", ".."); + +const SHARED_IMPORT_ENV = { + HOME: process.env.HOME, + NODE_OPTIONS: process.env.NODE_OPTIONS, + NODE_PATH: process.env.NODE_PATH, + PATH: process.env.PATH, + TERM: process.env.TERM, +} satisfies NodeJS.ProcessEnv; + +export async function runDirectImportSmoke(code: string): Promise { + const { stdout } = await execFileAsync(process.execPath, ["--import", "tsx", "-e", code], { + cwd: repoRoot, + env: SHARED_IMPORT_ENV, + timeout: 40_000, + }); + + return stdout; +}