File size: 1,689 Bytes
5c2a829
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { fileURLToPath } from "node:url";
import { afterAll, beforeAll, describe, expect, it } from "vitest";
import { createFixtureLifetime } from "../../test/helpers/fixture-lifetime.js";
import { runNodeScript } from "../../test/helpers/run-node-script.js";
import { createCompiledSdkHost } from "../plugins/compiled-sdk-host.test-support.js";
import { mcpProviderCatalogEntrypoint } from "../plugins/loader-sdk-bridge-artifacts.test-support.js";

const lifetime = createFixtureLifetime();
const repository = fileURLToPath(new URL("../../", import.meta.url));
const runner = fileURLToPath(
  new URL("../../test/fixtures/mcp-registration/runner.mjs", import.meta.url),
);
let sdkHost: string | undefined;
beforeAll(() => {
  sdkHost = createCompiledSdkHost(mcpProviderCatalogEntrypoint, lifetime.createTempDir);
});
afterAll(() => lifetime.cleanup());

describe("standalone MCP registration lifetime", () => {
  it.each(["plain", "nested", "close-failure"])(
    "%s: joins native tool work and physical registration disposal before terminal return",
    (mode) =>
      lifetime.run(async () => {
        const root = lifetime.createTempDir("openclaw-mcp-registration-");
        const result = await runNodeScript(
          [runner, repository, mode, root, ...(sdkHost ? [sdkHost] : [])],
          { PATH: process.env.PATH },
          120_000,
          { cwd: repository, requireProcessTreeExit: true, maxBuffer: 1024 * 1024 },
        );
        expect(result.error, result.stderr).toBeUndefined();
        expect(result.status, `${result.stdout}\n${result.stderr}`).toBe(0);
        expect(JSON.parse(result.stdout)).toMatchObject({ ok: true });
      }),
    135_000,
  );
});