@frontmcp/testing 0.12.2 → 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assertions/mcp-assertions.d.ts +1 -1
- package/assertions/mcp-assertions.d.ts.map +1 -1
- package/client/mcp-test-client.builder.d.ts +1 -1
- package/client/mcp-test-client.d.ts.map +1 -1
- package/client/mcp-test-client.types.d.ts +3 -3
- package/client/mcp-test-client.types.d.ts.map +1 -1
- package/errors/index.d.ts.map +1 -1
- package/esm/fixtures/index.mjs +255 -36
- package/esm/index.mjs +291 -122
- package/esm/matchers/index.mjs +8 -32
- package/esm/package.json +6 -6
- package/esm/perf/index.mjs +239 -36
- package/esm/setup.mjs +8 -32
- package/example-tools/index.d.ts +1 -1
- package/example-tools/index.d.ts.map +1 -1
- package/example-tools/tool-configs.d.ts +4 -10
- package/example-tools/tool-configs.d.ts.map +1 -1
- package/fixtures/index.js +241 -36
- package/fixtures/test-fixture.d.ts.map +1 -1
- package/index.d.ts +2 -1
- package/index.d.ts.map +1 -1
- package/index.js +283 -126
- package/matchers/index.js +8 -32
- package/package.json +6 -6
- package/perf/index.js +232 -36
- package/platform/platform-client-info.d.ts +2 -1
- package/platform/platform-client-info.d.ts.map +1 -1
- package/platform/platform-types.d.ts +11 -16
- package/platform/platform-types.d.ts.map +1 -1
- package/playwright/index.d.ts +1 -1
- package/raw-client/index.d.ts +7 -0
- package/raw-client/index.d.ts.map +1 -0
- package/server/index.d.ts +1 -1
- package/server/index.d.ts.map +1 -1
- package/server/port-registry.d.ts +24 -6
- package/server/port-registry.d.ts.map +1 -1
- package/server/test-server.d.ts +1 -1
- package/server/test-server.d.ts.map +1 -1
- package/setup.js +8 -32
- package/ui/ui-assertions.d.ts +3 -4
- package/ui/ui-assertions.d.ts.map +1 -1
- package/ui/ui-matchers.d.ts +1 -2
- package/ui/ui-matchers.d.ts.map +1 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @description MCP-specific test assertions
|
|
4
4
|
*/
|
|
5
5
|
import type { McpResponse, ToolResultWrapper, ResourceContentWrapper, McpErrorInfo } from '../client';
|
|
6
|
-
import type { Tool, Resource, ResourceTemplate, Prompt, CallToolResult, ReadResourceResult } from '@
|
|
6
|
+
import type { Tool, Resource, ResourceTemplate, Prompt, CallToolResult, ReadResourceResult } from '@frontmcp/protocol';
|
|
7
7
|
/**
|
|
8
8
|
* MCP-specific assertion helpers
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-assertions.d.ts","sourceRoot":"","sources":["../../src/assertions/mcp-assertions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"mcp-assertions.d.ts","sourceRoot":"","sources":["../../src/assertions/mcp-assertions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACtG,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAMvH;;GAEG;AACH,eAAO,MAAM,aAAa;IACxB;;;OAGG;kBACW,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC;IAW/D;;;OAGG;gBACS,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,iBAAiB,MAAM,GAAG,YAAY;IAa7E;;OAEG;8BACuB,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,GAAG,IAAI;IAiBhF;;OAEG;8BAEO,iBAAiB,GAAG,WAAW,CAAC,cAAc,CAAC,QACjD,MAAM,GAAG,OAAO,GAAG,UAAU,GAClC,IAAI;IAkBP;;OAEG;iCAC0B,sBAAsB,GAAG,WAAW,CAAC,kBAAkB,CAAC,GAAG,MAAM;IAwB9F;;OAEG;8BACuB,IAAI,EAAE,QAAQ,MAAM,GAAG,IAAI;IASrD;;OAEG;sCAC+B,QAAQ,EAAE,OAAO,MAAM,GAAG,QAAQ;IASpE;;OAEG;8CACuC,gBAAgB,EAAE,eAAe,MAAM,GAAG,gBAAgB;IASpG;;OAEG;kCAC2B,MAAM,EAAE,QAAQ,MAAM,GAAG,MAAM;CAQ9D,CAAC;AAMF;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,gBAAgB,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAEpG;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,sBAAsB,GAAG,OAAO,CAExF;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAM1G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErF"}
|
|
@@ -96,7 +96,7 @@ export declare class McpTestClientBuilder {
|
|
|
96
96
|
* .withCapabilities({
|
|
97
97
|
* sampling: {},
|
|
98
98
|
* experimental: {
|
|
99
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
99
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
100
100
|
* }
|
|
101
101
|
* })
|
|
102
102
|
* .buildAndConnect();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAEnB,iBAAiB,EAEjB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,EACnB,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,SAAS,EAET,gBAAgB,EAQhB,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,eAAe,EACf,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGjE,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAkBxB,qBAAa,aAAa;IAExB,OAAO,CAAC,QAAQ,CAAC,MAAM,CACkD;IACzE,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAAgD;IAGlE,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,gBAAgB,CAAwB;IAGhD,OAAO,CAAC,aAAa,CAAmB;IAGxC,OAAO,CAAC,mBAAmB,CAAC,CAAqB;gBAMrC,MAAM,EAAE,mBAAmB;IA+BvC;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB;IAQhE;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-test-client.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @file mcp-test-client.types.ts
|
|
3
3
|
* @description Type definitions for the MCP Test Client
|
|
4
4
|
*/
|
|
5
|
-
import type { InitializeResult, ListToolsResult, CallToolResult, ListResourcesResult, ReadResourceResult, ListResourceTemplatesResult, ListPromptsResult, GetPromptResult, Tool, Resource, ResourceTemplate, Prompt, Implementation } from '@
|
|
5
|
+
import type { InitializeResult, ListToolsResult, CallToolResult, ListResourcesResult, ReadResourceResult, ListResourceTemplatesResult, ListPromptsResult, GetPromptResult, Tool, Resource, ResourceTemplate, Prompt, Implementation } from '@frontmcp/protocol';
|
|
6
6
|
import type { TestPlatformType } from '../platform/platform-types';
|
|
7
7
|
/**
|
|
8
8
|
* Simplified JSON-RPC request type for testing
|
|
@@ -51,7 +51,7 @@ export declare const MCP_APPS_EXTENSION_KEY: "io.modelcontextprotocol/ui";
|
|
|
51
51
|
* MCP Apps extension capability configuration.
|
|
52
52
|
*/
|
|
53
53
|
export interface McpAppsExtension {
|
|
54
|
-
/** Supported MIME types (e.g., ['text/html
|
|
54
|
+
/** Supported MIME types (e.g., ['text/html;profile=mcp-app']) */
|
|
55
55
|
mimeTypes?: string[];
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
@@ -122,7 +122,7 @@ export interface McpTestClientConfig {
|
|
|
122
122
|
* ```typescript
|
|
123
123
|
* capabilities: {
|
|
124
124
|
* experimental: {
|
|
125
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
125
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
126
126
|
* }
|
|
127
127
|
* }
|
|
128
128
|
* ```
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-test-client.types.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,2BAA2B,EAC3B,iBAAiB,EACjB,eAAe,EACf,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,MAAM,EACN,cAAc,EACf,MAAM,
|
|
1
|
+
{"version":3,"file":"mcp-test-client.types.d.ts","sourceRoot":"","sources":["../../src/client/mcp-test-client.types.ts"],"names":[],"mappings":"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"}
|
package/errors/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAM5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAM5B;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,eAAe;aAGvB,KAAK,CAAC,EAAE,KAAK;gBADtC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,KAAK,YAAA;CAMzC;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,eAAe;aAG7B,SAAS,EAAE,MAAM;gBADjC,OAAO,EAAE,MAAM,EACC,SAAS,EAAE,MAAM;CAMpC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;aAGjC,IAAI,EAAE,MAAM;aACZ,IAAI,CAAC,EAAE,OAAO;gBAF9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,YAAA;CAMjC;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,eAAe;aAGxB,KAAK,CAAC,EAAE,KAAK;gBADtC,OAAO,EAAE,MAAM,EACU,KAAK,CAAC,EAAE,KAAK,YAAA;CAMzC;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,eAAe;gBACrC,OAAO,EAAE,MAAM;CAK5B"}
|
package/esm/fixtures/index.mjs
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
// libs/testing/src/fixtures/test-fixture.ts
|
|
9
|
+
import {
|
|
10
|
+
describe as _describe,
|
|
11
|
+
beforeAll as _beforeAll,
|
|
12
|
+
beforeEach as _beforeEach,
|
|
13
|
+
afterEach as _afterEach,
|
|
14
|
+
afterAll as _afterAll,
|
|
15
|
+
it as _it
|
|
16
|
+
} from "@jest/globals";
|
|
17
|
+
|
|
1
18
|
// libs/testing/src/platform/platform-client-info.ts
|
|
2
19
|
var MCP_APPS_EXTENSION_KEY = "io.modelcontextprotocol/ui";
|
|
3
20
|
function getPlatformClientInfo(platform) {
|
|
@@ -64,7 +81,7 @@ function getPlatformCapabilities(platform) {
|
|
|
64
81
|
...baseCapabilities,
|
|
65
82
|
experimental: {
|
|
66
83
|
[MCP_APPS_EXTENSION_KEY]: {
|
|
67
|
-
mimeTypes: ["text/html
|
|
84
|
+
mimeTypes: ["text/html;profile=mcp-app"]
|
|
68
85
|
}
|
|
69
86
|
}
|
|
70
87
|
};
|
|
@@ -185,7 +202,7 @@ var McpTestClientBuilder = class {
|
|
|
185
202
|
* .withCapabilities({
|
|
186
203
|
* sampling: {},
|
|
187
204
|
* experimental: {
|
|
188
|
-
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html
|
|
205
|
+
* 'io.modelcontextprotocol/ui': { mimeTypes: ['text/html;profile=mcp-app'] }
|
|
189
206
|
* }
|
|
190
207
|
* })
|
|
191
208
|
* .buildAndConnect();
|
|
@@ -1167,11 +1184,24 @@ var McpTestClient = class {
|
|
|
1167
1184
|
this.log("debug", `Connecting to ${this.config.baseUrl}...`);
|
|
1168
1185
|
this.transport = this.createTransport();
|
|
1169
1186
|
await this.transport.connect();
|
|
1170
|
-
const
|
|
1171
|
-
|
|
1172
|
-
|
|
1187
|
+
const maxRetries = 3;
|
|
1188
|
+
const retryDelayMs = 500;
|
|
1189
|
+
let lastError;
|
|
1190
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
1191
|
+
const initResponse = await this.initialize();
|
|
1192
|
+
if (initResponse.success && initResponse.data) {
|
|
1193
|
+
this.initResult = initResponse.data;
|
|
1194
|
+
break;
|
|
1195
|
+
}
|
|
1196
|
+
lastError = initResponse.error?.message ?? "Unknown error";
|
|
1197
|
+
if (attempt < maxRetries) {
|
|
1198
|
+
this.log("debug", `MCP init attempt ${attempt} failed (${lastError}), retrying in ${retryDelayMs}ms...`);
|
|
1199
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelayMs));
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
if (!this.initResult) {
|
|
1203
|
+
throw new Error(`Failed to initialize MCP connection after ${maxRetries} attempts: ${lastError}`);
|
|
1173
1204
|
}
|
|
1174
|
-
this.initResult = initResponse.data;
|
|
1175
1205
|
this._sessionId = this.transport.getSessionId();
|
|
1176
1206
|
this._sessionInfo = {
|
|
1177
1207
|
id: this._sessionId ?? `session-${Date.now()}`,
|
|
@@ -1862,7 +1892,7 @@ var McpTestClient = class {
|
|
|
1862
1892
|
const raw = response.data ?? { content: [] };
|
|
1863
1893
|
const isError = !response.success || raw.isError === true;
|
|
1864
1894
|
const meta = raw._meta;
|
|
1865
|
-
const hasUI = meta?.["ui/html"] !== void 0 || meta?.["ui/component"] !== void 0
|
|
1895
|
+
const hasUI = meta?.["ui/html"] !== void 0 || meta?.["ui/component"] !== void 0;
|
|
1866
1896
|
const structuredContent = raw["structuredContent"];
|
|
1867
1897
|
return {
|
|
1868
1898
|
raw,
|
|
@@ -2214,6 +2244,7 @@ var TestTokenFactory = class {
|
|
|
2214
2244
|
|
|
2215
2245
|
// libs/testing/src/server/test-server.ts
|
|
2216
2246
|
import { spawn } from "child_process";
|
|
2247
|
+
import { sha256Hex } from "@frontmcp/utils";
|
|
2217
2248
|
|
|
2218
2249
|
// libs/testing/src/errors/index.ts
|
|
2219
2250
|
var TestClientError = class extends Error {
|
|
@@ -2261,9 +2292,16 @@ var E2E_PORT_RANGES = {
|
|
|
2261
2292
|
"demo-e2e-agents": { start: 50270, size: 10 },
|
|
2262
2293
|
"demo-e2e-transport-recreation": { start: 50280, size: 10 },
|
|
2263
2294
|
"demo-e2e-jobs": { start: 50290, size: 10 },
|
|
2264
|
-
// Infrastructure E2E tests (50300-
|
|
2295
|
+
// Infrastructure E2E tests (50300-50409)
|
|
2265
2296
|
"demo-e2e-redis": { start: 50300, size: 10 },
|
|
2266
2297
|
"demo-e2e-serverless": { start: 50310, size: 10 },
|
|
2298
|
+
"demo-e2e-uipack": { start: 50320, size: 10 },
|
|
2299
|
+
"demo-e2e-agent-adapters": { start: 50330, size: 10 },
|
|
2300
|
+
"demo-e2e-guard": { start: 50340, size: 10 },
|
|
2301
|
+
// ESM E2E tests (50400-50449)
|
|
2302
|
+
"esm-package-server": { start: 50400, size: 10 },
|
|
2303
|
+
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
2304
|
+
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
2267
2305
|
// Mock servers and utilities (50900-50999)
|
|
2268
2306
|
"mock-oauth": { start: 50900, size: 10 },
|
|
2269
2307
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -2335,7 +2373,7 @@ async function tryReservePort(port, project) {
|
|
|
2335
2373
|
server.once("error", () => {
|
|
2336
2374
|
resolve(false);
|
|
2337
2375
|
});
|
|
2338
|
-
server.listen(port,
|
|
2376
|
+
server.listen(port, () => {
|
|
2339
2377
|
reservedPorts.set(port, {
|
|
2340
2378
|
port,
|
|
2341
2379
|
project,
|
|
@@ -2376,7 +2414,7 @@ async function isPortAvailable(port) {
|
|
|
2376
2414
|
server.once("error", () => {
|
|
2377
2415
|
resolve(false);
|
|
2378
2416
|
});
|
|
2379
|
-
server.listen(port,
|
|
2417
|
+
server.listen(port, () => {
|
|
2380
2418
|
server.close(() => {
|
|
2381
2419
|
resolve(true);
|
|
2382
2420
|
});
|
|
@@ -2414,15 +2452,37 @@ var TestServer = class _TestServer {
|
|
|
2414
2452
|
*/
|
|
2415
2453
|
static async start(options) {
|
|
2416
2454
|
const project = options.project ?? "default";
|
|
2417
|
-
const
|
|
2418
|
-
|
|
2419
|
-
|
|
2420
|
-
|
|
2421
|
-
|
|
2422
|
-
|
|
2423
|
-
|
|
2455
|
+
const maxAttempts = 3;
|
|
2456
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
2457
|
+
const { port, release } = await reservePort(project, options.port);
|
|
2458
|
+
const server = new _TestServer(options, port, release);
|
|
2459
|
+
try {
|
|
2460
|
+
await server.startProcess();
|
|
2461
|
+
return server;
|
|
2462
|
+
} catch (error) {
|
|
2463
|
+
try {
|
|
2464
|
+
await server.stop();
|
|
2465
|
+
} catch (cleanupError) {
|
|
2466
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2467
|
+
const msg = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
2468
|
+
console.warn(`[TestServer] Cleanup failed after startup error: ${msg}`);
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
const isEADDRINUSE = error instanceof Error && (error.message.includes("EADDRINUSE") || server.getLogs().some((l) => l.includes("EADDRINUSE")));
|
|
2472
|
+
if (isEADDRINUSE && attempt < maxAttempts) {
|
|
2473
|
+
const delayMs = attempt * 500;
|
|
2474
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2475
|
+
console.warn(
|
|
2476
|
+
`[TestServer] EADDRINUSE on port ${port}, retrying in ${delayMs}ms (attempt ${attempt}/${maxAttempts})`
|
|
2477
|
+
);
|
|
2478
|
+
}
|
|
2479
|
+
await sleep2(delayMs);
|
|
2480
|
+
continue;
|
|
2481
|
+
}
|
|
2482
|
+
throw error;
|
|
2483
|
+
}
|
|
2424
2484
|
}
|
|
2425
|
-
|
|
2485
|
+
throw new Error(`[TestServer] Failed to start after ${maxAttempts} attempts`);
|
|
2426
2486
|
}
|
|
2427
2487
|
/**
|
|
2428
2488
|
* Start an Nx project as test server
|
|
@@ -2433,22 +2493,44 @@ var TestServer = class _TestServer {
|
|
|
2433
2493
|
`Invalid project name: ${project}. Must contain only alphanumeric, underscore, and hyphen characters.`
|
|
2434
2494
|
);
|
|
2435
2495
|
}
|
|
2436
|
-
const
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2496
|
+
const maxAttempts = 3;
|
|
2497
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
2498
|
+
const { port, release } = await reservePort(project, options.port);
|
|
2499
|
+
const serverOptions = {
|
|
2500
|
+
...options,
|
|
2501
|
+
port,
|
|
2502
|
+
project,
|
|
2503
|
+
command: `npx nx serve ${project} --port ${port}`,
|
|
2504
|
+
cwd: options.cwd ?? process.cwd()
|
|
2505
|
+
};
|
|
2506
|
+
const server = new _TestServer(serverOptions, port, release);
|
|
2507
|
+
try {
|
|
2508
|
+
await server.startProcess();
|
|
2509
|
+
return server;
|
|
2510
|
+
} catch (error) {
|
|
2511
|
+
try {
|
|
2512
|
+
await server.stop();
|
|
2513
|
+
} catch (cleanupError) {
|
|
2514
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2515
|
+
const msg = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
|
|
2516
|
+
console.warn(`[TestServer] Cleanup failed after startup error: ${msg}`);
|
|
2517
|
+
}
|
|
2518
|
+
}
|
|
2519
|
+
const isEADDRINUSE = error instanceof Error && (error.message.includes("EADDRINUSE") || server.getLogs().some((l) => l.includes("EADDRINUSE")));
|
|
2520
|
+
if (isEADDRINUSE && attempt < maxAttempts) {
|
|
2521
|
+
const delayMs = attempt * 500;
|
|
2522
|
+
if (options.debug || DEBUG_SERVER) {
|
|
2523
|
+
console.warn(
|
|
2524
|
+
`[TestServer] EADDRINUSE on port ${port}, retrying in ${delayMs}ms (attempt ${attempt}/${maxAttempts})`
|
|
2525
|
+
);
|
|
2526
|
+
}
|
|
2527
|
+
await sleep2(delayMs);
|
|
2528
|
+
continue;
|
|
2529
|
+
}
|
|
2530
|
+
throw error;
|
|
2531
|
+
}
|
|
2450
2532
|
}
|
|
2451
|
-
|
|
2533
|
+
throw new Error(`[TestServer] Failed to start after ${maxAttempts} attempts`);
|
|
2452
2534
|
}
|
|
2453
2535
|
/**
|
|
2454
2536
|
* Create a test server connected to an already running server
|
|
@@ -2485,7 +2567,21 @@ var TestServer = class _TestServer {
|
|
|
2485
2567
|
}
|
|
2486
2568
|
if (this.process) {
|
|
2487
2569
|
this.log("Stopping server...");
|
|
2488
|
-
this.process.
|
|
2570
|
+
if (this.process.exitCode !== null || this.process.signalCode !== null) {
|
|
2571
|
+
this.log(`Server already exited (code: ${this.process.exitCode}, signal: ${this.process.signalCode})`);
|
|
2572
|
+
this.process = null;
|
|
2573
|
+
return;
|
|
2574
|
+
}
|
|
2575
|
+
const pid = this.process.pid;
|
|
2576
|
+
try {
|
|
2577
|
+
if (pid !== void 0) {
|
|
2578
|
+
process.kill(-pid, "SIGTERM");
|
|
2579
|
+
} else {
|
|
2580
|
+
this.process.kill("SIGTERM");
|
|
2581
|
+
}
|
|
2582
|
+
} catch {
|
|
2583
|
+
this.process.kill("SIGTERM");
|
|
2584
|
+
}
|
|
2489
2585
|
const exitPromise = new Promise((resolve) => {
|
|
2490
2586
|
if (this.process) {
|
|
2491
2587
|
this.process.once("exit", () => resolve());
|
|
@@ -2496,7 +2592,16 @@ var TestServer = class _TestServer {
|
|
|
2496
2592
|
const killTimeout = setTimeout(() => {
|
|
2497
2593
|
if (this.process) {
|
|
2498
2594
|
this.log("Force killing server after timeout...");
|
|
2499
|
-
this.process.
|
|
2595
|
+
const killPid = this.process.pid;
|
|
2596
|
+
try {
|
|
2597
|
+
if (killPid !== void 0) {
|
|
2598
|
+
process.kill(-killPid, "SIGKILL");
|
|
2599
|
+
} else {
|
|
2600
|
+
this.process.kill("SIGKILL");
|
|
2601
|
+
}
|
|
2602
|
+
} catch {
|
|
2603
|
+
this.process.kill("SIGKILL");
|
|
2604
|
+
}
|
|
2500
2605
|
}
|
|
2501
2606
|
}, 5e3);
|
|
2502
2607
|
await exitPromise;
|
|
@@ -2561,14 +2666,17 @@ var TestServer = class _TestServer {
|
|
|
2561
2666
|
...this.options.env,
|
|
2562
2667
|
PORT: String(this.options.port)
|
|
2563
2668
|
};
|
|
2669
|
+
const runtimeEnv = withWorkspaceProtocolFallback(env, this.options.cwd);
|
|
2564
2670
|
if (this.portRelease) {
|
|
2565
2671
|
await this.portRelease();
|
|
2566
2672
|
this.portRelease = null;
|
|
2673
|
+
await sleep2(300);
|
|
2567
2674
|
}
|
|
2568
2675
|
this.process = spawn(this.options.command, [], {
|
|
2569
2676
|
cwd: this.options.cwd,
|
|
2570
|
-
env,
|
|
2677
|
+
env: runtimeEnv,
|
|
2571
2678
|
shell: true,
|
|
2679
|
+
detached: true,
|
|
2572
2680
|
stdio: ["pipe", "pipe", "pipe"]
|
|
2573
2681
|
});
|
|
2574
2682
|
if (this.process.pid !== void 0) {
|
|
@@ -2720,8 +2828,119 @@ TIP: Set DEBUG_SERVER=1 or DEBUG=1 environment variable for verbose output`
|
|
|
2720
2828
|
function sleep2(ms) {
|
|
2721
2829
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
2722
2830
|
}
|
|
2831
|
+
function withWorkspaceProtocolFallback(env, cwd) {
|
|
2832
|
+
if (findInstalledProtocolPackageDir(cwd)) {
|
|
2833
|
+
return env;
|
|
2834
|
+
}
|
|
2835
|
+
try {
|
|
2836
|
+
const workspacePackageDir = findWorkspaceProtocolDir(cwd);
|
|
2837
|
+
if (!workspacePackageDir) {
|
|
2838
|
+
return env;
|
|
2839
|
+
}
|
|
2840
|
+
ensureWorkspaceProtocolLink(cwd, workspacePackageDir);
|
|
2841
|
+
if (findInstalledProtocolPackageDir(cwd)) {
|
|
2842
|
+
return env;
|
|
2843
|
+
}
|
|
2844
|
+
return withProtocolNodePathAlias(env, cwd, workspacePackageDir);
|
|
2845
|
+
} catch (err) {
|
|
2846
|
+
if (DEBUG_SERVER) {
|
|
2847
|
+
console.error(
|
|
2848
|
+
`[TestServer] Workspace protocol fallback failed: ${err instanceof Error ? err.message : String(err)}`
|
|
2849
|
+
);
|
|
2850
|
+
}
|
|
2851
|
+
return env;
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
function ensureWorkspaceProtocolLink(cwd, workspacePackageDir) {
|
|
2855
|
+
const fs = __require("node:fs");
|
|
2856
|
+
const path = __require("node:path");
|
|
2857
|
+
const nodeModulesDir = findWorkspaceNodeModulesDir(cwd);
|
|
2858
|
+
if (!nodeModulesDir) {
|
|
2859
|
+
return;
|
|
2860
|
+
}
|
|
2861
|
+
const scopeDir = path.join(nodeModulesDir, "@frontmcp");
|
|
2862
|
+
const aliasPackageDir = path.join(scopeDir, "protocol");
|
|
2863
|
+
if (fs.existsSync(aliasPackageDir)) {
|
|
2864
|
+
return;
|
|
2865
|
+
}
|
|
2866
|
+
fs.mkdirSync(scopeDir, { recursive: true });
|
|
2867
|
+
try {
|
|
2868
|
+
fs.symlinkSync(workspacePackageDir, aliasPackageDir, process.platform === "win32" ? "junction" : "dir");
|
|
2869
|
+
} catch (error) {
|
|
2870
|
+
const err = error;
|
|
2871
|
+
if (err.code !== "EEXIST") {
|
|
2872
|
+
throw error;
|
|
2873
|
+
}
|
|
2874
|
+
}
|
|
2875
|
+
}
|
|
2876
|
+
function withProtocolNodePathAlias(env, cwd, workspacePackageDir) {
|
|
2877
|
+
const fs = __require("node:fs");
|
|
2878
|
+
const os = __require("node:os");
|
|
2879
|
+
const path = __require("node:path");
|
|
2880
|
+
const aliasRoot = path.join(os.tmpdir(), "frontmcp-test-node-path", sha256Hex(cwd).slice(0, 12));
|
|
2881
|
+
const scopeDir = path.join(aliasRoot, "@frontmcp");
|
|
2882
|
+
const aliasPackageDir = path.join(scopeDir, "protocol");
|
|
2883
|
+
fs.mkdirSync(scopeDir, { recursive: true });
|
|
2884
|
+
try {
|
|
2885
|
+
if (!fs.existsSync(aliasPackageDir)) {
|
|
2886
|
+
fs.symlinkSync(workspacePackageDir, aliasPackageDir, process.platform === "win32" ? "junction" : "dir");
|
|
2887
|
+
}
|
|
2888
|
+
} catch (error) {
|
|
2889
|
+
const err = error;
|
|
2890
|
+
if (err.code !== "EEXIST") throw error;
|
|
2891
|
+
}
|
|
2892
|
+
const existingNodePath = env["NODE_PATH"];
|
|
2893
|
+
const nodePathEntries = [aliasRoot, ...existingNodePath ? existingNodePath.split(path.delimiter) : []].filter(
|
|
2894
|
+
Boolean
|
|
2895
|
+
);
|
|
2896
|
+
return {
|
|
2897
|
+
...env,
|
|
2898
|
+
NODE_PATH: [...new Set(nodePathEntries)].join(path.delimiter)
|
|
2899
|
+
};
|
|
2900
|
+
}
|
|
2901
|
+
function findUp(startDir, testFn) {
|
|
2902
|
+
const path = __require("node:path");
|
|
2903
|
+
let currentDir = startDir;
|
|
2904
|
+
while (true) {
|
|
2905
|
+
const result = testFn(currentDir);
|
|
2906
|
+
if (result !== void 0) return result;
|
|
2907
|
+
const parentDir = path.dirname(currentDir);
|
|
2908
|
+
if (parentDir === currentDir) return void 0;
|
|
2909
|
+
currentDir = parentDir;
|
|
2910
|
+
}
|
|
2911
|
+
}
|
|
2912
|
+
function findWorkspaceProtocolDir(startDir) {
|
|
2913
|
+
const fs = __require("node:fs");
|
|
2914
|
+
const path = __require("node:path");
|
|
2915
|
+
return findUp(startDir, (dir) => {
|
|
2916
|
+
const candidate = path.join(dir, "libs", "protocol");
|
|
2917
|
+
return fs.existsSync(path.join(candidate, "dist", "index.js")) ? candidate : void 0;
|
|
2918
|
+
});
|
|
2919
|
+
}
|
|
2920
|
+
function findInstalledProtocolPackageDir(startDir) {
|
|
2921
|
+
const fs = __require("node:fs");
|
|
2922
|
+
const path = __require("node:path");
|
|
2923
|
+
return findUp(startDir, (dir) => {
|
|
2924
|
+
const candidate = path.join(dir, "node_modules", "@frontmcp", "protocol");
|
|
2925
|
+
return fs.existsSync(path.join(candidate, "package.json")) ? candidate : void 0;
|
|
2926
|
+
});
|
|
2927
|
+
}
|
|
2928
|
+
function findWorkspaceNodeModulesDir(startDir) {
|
|
2929
|
+
const fs = __require("node:fs");
|
|
2930
|
+
const path = __require("node:path");
|
|
2931
|
+
return findUp(startDir, (dir) => {
|
|
2932
|
+
const candidate = path.join(dir, "node_modules");
|
|
2933
|
+
return fs.existsSync(candidate) ? candidate : void 0;
|
|
2934
|
+
});
|
|
2935
|
+
}
|
|
2723
2936
|
|
|
2724
2937
|
// libs/testing/src/fixtures/test-fixture.ts
|
|
2938
|
+
var describe = _describe;
|
|
2939
|
+
var beforeAll = _beforeAll;
|
|
2940
|
+
var beforeEach = _beforeEach;
|
|
2941
|
+
var afterEach = _afterEach;
|
|
2942
|
+
var afterAll = _afterAll;
|
|
2943
|
+
var it = _it;
|
|
2725
2944
|
var currentConfig = {};
|
|
2726
2945
|
var serverInstance = null;
|
|
2727
2946
|
var tokenFactory = null;
|