@frontmcp/testing 1.0.3 → 1.1.0-beta.1
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/containers/redis-container.d.ts +29 -0
- package/containers/redis-container.d.ts.map +1 -0
- package/esm/fixtures/index.mjs +3 -1
- package/esm/index.mjs +4 -2
- package/esm/package.json +7 -6
- package/esm/perf/index.mjs +3 -1
- package/example-tools/tool-configs.d.ts +36 -36
- package/example-tools/tool-configs.d.ts.map +1 -1
- package/fixtures/index.js +3 -1
- package/index.js +17 -15
- package/package.json +7 -6
- package/perf/index.js +3 -1
- package/server/distributed-test-cluster.d.ts +79 -0
- package/server/distributed-test-cluster.d.ts.map +1 -0
- package/server/port-registry.d.ts +4 -0
- package/server/port-registry.d.ts.map +1 -1
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redis Test Container
|
|
3
|
+
*
|
|
4
|
+
* Starts a Redis container via testcontainers for distributed E2E tests.
|
|
5
|
+
* Skips when Docker is not available or SKIP_REDIS_TESTS=1 is set.
|
|
6
|
+
*/
|
|
7
|
+
export interface RedisContainerInfo {
|
|
8
|
+
/** Redis host (usually localhost) */
|
|
9
|
+
host: string;
|
|
10
|
+
/** Mapped Redis port */
|
|
11
|
+
port: number;
|
|
12
|
+
/** Full Redis URL: redis://host:port */
|
|
13
|
+
url: string;
|
|
14
|
+
/** Stop the container */
|
|
15
|
+
stop: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Start a Redis container for testing.
|
|
19
|
+
*
|
|
20
|
+
* @returns Container info with host, port, url, and stop function
|
|
21
|
+
* @throws When Docker is not available
|
|
22
|
+
*/
|
|
23
|
+
export declare function startRedisContainer(): Promise<RedisContainerInfo>;
|
|
24
|
+
/**
|
|
25
|
+
* Check if distributed tests should be skipped.
|
|
26
|
+
* Returns true if SKIP_REDIS_TESTS=1 or SKIP_DISTRIBUTED_TESTS=1.
|
|
27
|
+
*/
|
|
28
|
+
export declare function shouldSkipDistributedTests(): boolean;
|
|
29
|
+
//# sourceMappingURL=redis-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-container.d.ts","sourceRoot":"","sources":["../../src/containers/redis-container.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,kBAAkB;IACjC,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,yBAAyB;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAKD;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAiBvE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD"}
|
package/esm/fixtures/index.mjs
CHANGED
|
@@ -2303,11 +2303,13 @@ var E2E_PORT_RANGES = {
|
|
|
2303
2303
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
2304
2304
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
2305
2305
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
2306
|
-
// ESM E2E tests (50400-
|
|
2306
|
+
// ESM E2E tests (50400-50439)
|
|
2307
2307
|
"esm-package-server": { start: 50400, size: 10 },
|
|
2308
2308
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
2309
2309
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
2310
2310
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
2311
|
+
// Distributed E2E tests (50440-50459)
|
|
2312
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
2311
2313
|
// Mock servers and utilities (50900-50999)
|
|
2312
2314
|
"mock-oauth": { start: 50900, size: 10 },
|
|
2313
2315
|
"mock-api": { start: 50910, size: 10 },
|
package/esm/index.mjs
CHANGED
|
@@ -3910,11 +3910,13 @@ var E2E_PORT_RANGES = {
|
|
|
3910
3910
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
3911
3911
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
3912
3912
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
3913
|
-
// ESM E2E tests (50400-
|
|
3913
|
+
// ESM E2E tests (50400-50439)
|
|
3914
3914
|
"esm-package-server": { start: 50400, size: 10 },
|
|
3915
3915
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
3916
3916
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
3917
3917
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
3918
|
+
// Distributed E2E tests (50440-50459)
|
|
3919
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
3918
3920
|
// Mock servers and utilities (50900-50999)
|
|
3919
3921
|
"mock-oauth": { start: 50900, size: 10 },
|
|
3920
3922
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -6309,7 +6311,7 @@ var UIAssertions = {
|
|
|
6309
6311
|
};
|
|
6310
6312
|
|
|
6311
6313
|
// libs/testing/src/example-tools/tool-configs.ts
|
|
6312
|
-
import { z } from "zod";
|
|
6314
|
+
import { z } from "@frontmcp/lazy-zod";
|
|
6313
6315
|
var basicUIToolInputSchema = z.object({
|
|
6314
6316
|
name: z.string().optional().default("World")
|
|
6315
6317
|
});
|
package/esm/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontmcp/testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.1.0-beta.1",
|
|
4
4
|
"description": "E2E testing framework for FrontMCP servers - MCP client, auth mocks, Playwright integration",
|
|
5
5
|
"author": "AgentFront <info@agentfront.dev>",
|
|
6
6
|
"homepage": "https://docs.agentfront.dev",
|
|
@@ -87,11 +87,12 @@
|
|
|
87
87
|
"./esm": null
|
|
88
88
|
},
|
|
89
89
|
"peerDependencies": {
|
|
90
|
-
"@frontmcp/sdk": "1.0.
|
|
91
|
-
"@frontmcp/ui": "1.0.
|
|
90
|
+
"@frontmcp/sdk": "1.1.0-beta.1",
|
|
91
|
+
"@frontmcp/ui": "1.1.0-beta.1",
|
|
92
92
|
"@playwright/test": "^1.40.0",
|
|
93
93
|
"jest": "^29.0.0 || ^30.0.0",
|
|
94
|
-
"@jest/globals": "^29.0.0 || ^30.0.0"
|
|
94
|
+
"@jest/globals": "^29.0.0 || ^30.0.0",
|
|
95
|
+
"@frontmcp/lazy-zod": "1.1.0-beta.1"
|
|
95
96
|
},
|
|
96
97
|
"peerDependenciesMeta": {
|
|
97
98
|
"@frontmcp/ui": {
|
|
@@ -111,8 +112,8 @@
|
|
|
111
112
|
"node": ">=24.0.0"
|
|
112
113
|
},
|
|
113
114
|
"dependencies": {
|
|
114
|
-
"@frontmcp/utils": "1.0.
|
|
115
|
-
"@frontmcp/protocol": "1.0.
|
|
115
|
+
"@frontmcp/utils": "1.1.0-beta.1",
|
|
116
|
+
"@frontmcp/protocol": "1.1.0-beta.1",
|
|
116
117
|
"jose": "^6.0.11",
|
|
117
118
|
"tslib": "^2.3.0"
|
|
118
119
|
},
|
package/esm/perf/index.mjs
CHANGED
|
@@ -3058,11 +3058,13 @@ var E2E_PORT_RANGES = {
|
|
|
3058
3058
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
3059
3059
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
3060
3060
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
3061
|
-
// ESM E2E tests (50400-
|
|
3061
|
+
// ESM E2E tests (50400-50439)
|
|
3062
3062
|
"esm-package-server": { start: 50400, size: 10 },
|
|
3063
3063
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
3064
3064
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
3065
3065
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
3066
|
+
// Distributed E2E tests (50440-50459)
|
|
3067
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
3066
3068
|
// Mock servers and utilities (50900-50999)
|
|
3067
3069
|
"mock-oauth": { start: 50900, size: 10 },
|
|
3068
3070
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -15,27 +15,27 @@
|
|
|
15
15
|
* description: BASIC_UI_TOOL_CONFIG.description,
|
|
16
16
|
* ui: BASIC_UI_TOOL_CONFIG.ui,
|
|
17
17
|
* })
|
|
18
|
-
* export class BasicUITool extends ToolContext
|
|
18
|
+
* export class BasicUITool extends ToolContext {
|
|
19
19
|
* async execute(input) {
|
|
20
20
|
* return { message: `Hello, ${input.name}!`, timestamp: Date.now() };
|
|
21
21
|
* }
|
|
22
22
|
* }
|
|
23
23
|
* ```
|
|
24
24
|
*/
|
|
25
|
-
import { z } from 'zod';
|
|
25
|
+
import { z } from '@frontmcp/lazy-zod';
|
|
26
26
|
/**
|
|
27
27
|
* Input schema for the basic UI tool.
|
|
28
28
|
*/
|
|
29
|
-
export declare const basicUIToolInputSchema:
|
|
30
|
-
name:
|
|
31
|
-
},
|
|
29
|
+
export declare const basicUIToolInputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
30
|
+
name: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodString>>;
|
|
31
|
+
}, import("zod/v4/core").$strip>;
|
|
32
32
|
/**
|
|
33
33
|
* Output schema for the basic UI tool.
|
|
34
34
|
*/
|
|
35
|
-
export declare const basicUIToolOutputSchema:
|
|
36
|
-
message:
|
|
37
|
-
timestamp:
|
|
38
|
-
},
|
|
35
|
+
export declare const basicUIToolOutputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
36
|
+
message: import("@frontmcp/lazy-zod").ZodString;
|
|
37
|
+
timestamp: import("@frontmcp/lazy-zod").ZodNumber;
|
|
38
|
+
}, import("zod/v4/core").$strip>;
|
|
39
39
|
/**
|
|
40
40
|
* Basic UI tool configuration with minimal UI config.
|
|
41
41
|
* Use this for testing that platform-specific meta keys are correctly applied.
|
|
@@ -43,13 +43,13 @@ export declare const basicUIToolOutputSchema: z.ZodObject<{
|
|
|
43
43
|
export declare const BASIC_UI_TOOL_CONFIG: {
|
|
44
44
|
readonly name: "platform-test-basic";
|
|
45
45
|
readonly description: "Basic UI tool for platform testing";
|
|
46
|
-
readonly inputSchema:
|
|
47
|
-
name:
|
|
48
|
-
},
|
|
49
|
-
readonly outputSchema:
|
|
50
|
-
message:
|
|
51
|
-
timestamp:
|
|
52
|
-
},
|
|
46
|
+
readonly inputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
47
|
+
name: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodString>>;
|
|
48
|
+
}, import("zod/v4/core").$strip>;
|
|
49
|
+
readonly outputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
50
|
+
message: import("@frontmcp/lazy-zod").ZodString;
|
|
51
|
+
timestamp: import("@frontmcp/lazy-zod").ZodNumber;
|
|
52
|
+
}, import("zod/v4/core").$strip>;
|
|
53
53
|
readonly ui: {
|
|
54
54
|
/**
|
|
55
55
|
* Simple template that displays the output.
|
|
@@ -61,19 +61,19 @@ export declare const BASIC_UI_TOOL_CONFIG: {
|
|
|
61
61
|
/**
|
|
62
62
|
* Input schema for the full UI tool.
|
|
63
63
|
*/
|
|
64
|
-
export declare const fullUIToolInputSchema:
|
|
65
|
-
name:
|
|
66
|
-
count:
|
|
67
|
-
},
|
|
64
|
+
export declare const fullUIToolInputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
65
|
+
name: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodString>>;
|
|
66
|
+
count: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodNumber>>;
|
|
67
|
+
}, import("zod/v4/core").$strip>;
|
|
68
68
|
/**
|
|
69
69
|
* Output schema for the full UI tool.
|
|
70
70
|
*/
|
|
71
|
-
export declare const fullUIToolOutputSchema:
|
|
72
|
-
message:
|
|
73
|
-
count:
|
|
74
|
-
items:
|
|
75
|
-
timestamp:
|
|
76
|
-
},
|
|
71
|
+
export declare const fullUIToolOutputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
72
|
+
message: import("@frontmcp/lazy-zod").ZodString;
|
|
73
|
+
count: import("@frontmcp/lazy-zod").ZodNumber;
|
|
74
|
+
items: import("@frontmcp/lazy-zod").ZodArray<import("@frontmcp/lazy-zod").ZodString>;
|
|
75
|
+
timestamp: import("@frontmcp/lazy-zod").ZodNumber;
|
|
76
|
+
}, import("zod/v4/core").$strip>;
|
|
77
77
|
/**
|
|
78
78
|
* Full UI tool configuration with all UI options.
|
|
79
79
|
* Use this for testing comprehensive platform-specific meta key behavior.
|
|
@@ -81,16 +81,16 @@ export declare const fullUIToolOutputSchema: z.ZodObject<{
|
|
|
81
81
|
export declare const FULL_UI_TOOL_CONFIG: {
|
|
82
82
|
readonly name: "platform-test-full";
|
|
83
83
|
readonly description: "Full UI tool with all options for comprehensive platform testing";
|
|
84
|
-
readonly inputSchema:
|
|
85
|
-
name:
|
|
86
|
-
count:
|
|
87
|
-
},
|
|
88
|
-
readonly outputSchema:
|
|
89
|
-
message:
|
|
90
|
-
count:
|
|
91
|
-
items:
|
|
92
|
-
timestamp:
|
|
93
|
-
},
|
|
84
|
+
readonly inputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
85
|
+
name: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodString>>;
|
|
86
|
+
count: import("@frontmcp/lazy-zod").ZodDefault<import("@frontmcp/lazy-zod").ZodOptional<import("@frontmcp/lazy-zod").ZodNumber>>;
|
|
87
|
+
}, import("zod/v4/core").$strip>;
|
|
88
|
+
readonly outputSchema: import("@frontmcp/lazy-zod").ZodObject<{
|
|
89
|
+
message: import("@frontmcp/lazy-zod").ZodString;
|
|
90
|
+
count: import("@frontmcp/lazy-zod").ZodNumber;
|
|
91
|
+
items: import("@frontmcp/lazy-zod").ZodArray<import("@frontmcp/lazy-zod").ZodString>;
|
|
92
|
+
timestamp: import("@frontmcp/lazy-zod").ZodNumber;
|
|
93
|
+
}, import("zod/v4/core").$strip>;
|
|
94
94
|
readonly ui: {
|
|
95
95
|
/**
|
|
96
96
|
* Template with more complex UI elements.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-configs.d.ts","sourceRoot":"","sources":["../../src/example-tools/tool-configs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"tool-configs.d.ts","sourceRoot":"","sources":["../../src/example-tools/tool-configs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAC;AAMvC;;GAEG;AACH,eAAO,MAAM,sBAAsB;;gCAEjC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,uBAAuB;;;gCAGlC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;QAM7B;;;WAGG;;;CASG,CAAC;AAMX;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;gCAGhC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;gCAKjC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;QAM5B;;WAEG;;QAqBH;;WAEG;;QAEH;;WAEG;;;;;QAKH;;WAEG;;;;;QAKH;;WAEG;;QAEH;;WAEG;;QAEH;;WAEG;;;CAGG,CAAC;AAMX;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC;;;EAKtF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC;;;;;EAWpF;AAMD;;;GAGG;AACH,eAAO,MAAM,oCAAoC,iEAAkE,CAAC;AAEpH;;;GAGG;AACH,eAAO,MAAM,mCAAmC,gDAAiD,CAAC;AAElG;;GAEG;AACH,eAAO,MAAM,qCAAqC,iEAAkE,CAAC;AAErH;;GAEG;AACH,eAAO,MAAM,oCAAoC,gDAAiD,CAAC;AAEnG;;;GAGG;AACH,eAAO,MAAM,qCAAqC,iEAAkE,CAAC;AAErH;;;GAGG;AACH,eAAO,MAAM,oCAAoC,gDAAiD,CAAC"}
|
package/fixtures/index.js
CHANGED
|
@@ -2319,11 +2319,13 @@ var E2E_PORT_RANGES = {
|
|
|
2319
2319
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
2320
2320
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
2321
2321
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
2322
|
-
// ESM E2E tests (50400-
|
|
2322
|
+
// ESM E2E tests (50400-50439)
|
|
2323
2323
|
"esm-package-server": { start: 50400, size: 10 },
|
|
2324
2324
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
2325
2325
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
2326
2326
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
2327
|
+
// Distributed E2E tests (50440-50459)
|
|
2328
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
2327
2329
|
// Mock servers and utilities (50900-50999)
|
|
2328
2330
|
"mock-oauth": { start: 50900, size: 10 },
|
|
2329
2331
|
"mock-api": { start: 50910, size: 10 },
|
package/index.js
CHANGED
|
@@ -4028,11 +4028,13 @@ var E2E_PORT_RANGES = {
|
|
|
4028
4028
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
4029
4029
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
4030
4030
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
4031
|
-
// ESM E2E tests (50400-
|
|
4031
|
+
// ESM E2E tests (50400-50439)
|
|
4032
4032
|
"esm-package-server": { start: 50400, size: 10 },
|
|
4033
4033
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
4034
4034
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
4035
4035
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
4036
|
+
// Distributed E2E tests (50440-50459)
|
|
4037
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
4036
4038
|
// Mock servers and utilities (50900-50999)
|
|
4037
4039
|
"mock-oauth": { start: 50900, size: 10 },
|
|
4038
4040
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -6420,13 +6422,13 @@ var UIAssertions = {
|
|
|
6420
6422
|
};
|
|
6421
6423
|
|
|
6422
6424
|
// libs/testing/src/example-tools/tool-configs.ts
|
|
6423
|
-
var
|
|
6424
|
-
var basicUIToolInputSchema =
|
|
6425
|
-
name:
|
|
6425
|
+
var import_lazy_zod = require("@frontmcp/lazy-zod");
|
|
6426
|
+
var basicUIToolInputSchema = import_lazy_zod.z.object({
|
|
6427
|
+
name: import_lazy_zod.z.string().optional().default("World")
|
|
6426
6428
|
});
|
|
6427
|
-
var basicUIToolOutputSchema =
|
|
6428
|
-
message:
|
|
6429
|
-
timestamp:
|
|
6429
|
+
var basicUIToolOutputSchema = import_lazy_zod.z.object({
|
|
6430
|
+
message: import_lazy_zod.z.string(),
|
|
6431
|
+
timestamp: import_lazy_zod.z.number()
|
|
6430
6432
|
});
|
|
6431
6433
|
var BASIC_UI_TOOL_CONFIG = {
|
|
6432
6434
|
name: "platform-test-basic",
|
|
@@ -6447,15 +6449,15 @@ var BASIC_UI_TOOL_CONFIG = {
|
|
|
6447
6449
|
`.trim()
|
|
6448
6450
|
}
|
|
6449
6451
|
};
|
|
6450
|
-
var fullUIToolInputSchema =
|
|
6451
|
-
name:
|
|
6452
|
-
count:
|
|
6452
|
+
var fullUIToolInputSchema = import_lazy_zod.z.object({
|
|
6453
|
+
name: import_lazy_zod.z.string().optional().default("World"),
|
|
6454
|
+
count: import_lazy_zod.z.number().optional().default(1)
|
|
6453
6455
|
});
|
|
6454
|
-
var fullUIToolOutputSchema =
|
|
6455
|
-
message:
|
|
6456
|
-
count:
|
|
6457
|
-
items:
|
|
6458
|
-
timestamp:
|
|
6456
|
+
var fullUIToolOutputSchema = import_lazy_zod.z.object({
|
|
6457
|
+
message: import_lazy_zod.z.string(),
|
|
6458
|
+
count: import_lazy_zod.z.number(),
|
|
6459
|
+
items: import_lazy_zod.z.array(import_lazy_zod.z.string()),
|
|
6460
|
+
timestamp: import_lazy_zod.z.number()
|
|
6459
6461
|
});
|
|
6460
6462
|
var FULL_UI_TOOL_CONFIG = {
|
|
6461
6463
|
name: "platform-test-full",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@frontmcp/testing",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.1.0-beta.1",
|
|
4
4
|
"description": "E2E testing framework for FrontMCP servers - MCP client, auth mocks, Playwright integration",
|
|
5
5
|
"author": "AgentFront <info@agentfront.dev>",
|
|
6
6
|
"homepage": "https://docs.agentfront.dev",
|
|
@@ -87,11 +87,12 @@
|
|
|
87
87
|
"./esm": null
|
|
88
88
|
},
|
|
89
89
|
"peerDependencies": {
|
|
90
|
-
"@frontmcp/sdk": "1.0.
|
|
91
|
-
"@frontmcp/ui": "1.0.
|
|
90
|
+
"@frontmcp/sdk": "1.1.0-beta.1",
|
|
91
|
+
"@frontmcp/ui": "1.1.0-beta.1",
|
|
92
92
|
"@playwright/test": "^1.40.0",
|
|
93
93
|
"jest": "^29.0.0 || ^30.0.0",
|
|
94
|
-
"@jest/globals": "^29.0.0 || ^30.0.0"
|
|
94
|
+
"@jest/globals": "^29.0.0 || ^30.0.0",
|
|
95
|
+
"@frontmcp/lazy-zod": "1.1.0-beta.1"
|
|
95
96
|
},
|
|
96
97
|
"peerDependenciesMeta": {
|
|
97
98
|
"@frontmcp/ui": {
|
|
@@ -111,8 +112,8 @@
|
|
|
111
112
|
"node": ">=24.0.0"
|
|
112
113
|
},
|
|
113
114
|
"dependencies": {
|
|
114
|
-
"@frontmcp/utils": "1.0.
|
|
115
|
-
"@frontmcp/protocol": "1.0.
|
|
115
|
+
"@frontmcp/utils": "1.1.0-beta.1",
|
|
116
|
+
"@frontmcp/protocol": "1.1.0-beta.1",
|
|
116
117
|
"jose": "^6.0.11",
|
|
117
118
|
"tslib": "^2.3.0"
|
|
118
119
|
},
|
package/perf/index.js
CHANGED
|
@@ -3120,11 +3120,13 @@ var E2E_PORT_RANGES = {
|
|
|
3120
3120
|
"demo-e2e-esm": { start: 50370, size: 10 },
|
|
3121
3121
|
"demo-e2e-feature-flags": { start: 50380, size: 10 },
|
|
3122
3122
|
"demo-e2e-resource-providers": { start: 50390, size: 10 },
|
|
3123
|
-
// ESM E2E tests (50400-
|
|
3123
|
+
// ESM E2E tests (50400-50439)
|
|
3124
3124
|
"esm-package-server": { start: 50400, size: 10 },
|
|
3125
3125
|
"esm-package-server-hot-reload": { start: 50410, size: 10 },
|
|
3126
3126
|
"esm-package-server-cli": { start: 50420, size: 10 },
|
|
3127
3127
|
"demo-e2e-unix-socket": { start: 50430, size: 10 },
|
|
3128
|
+
// Distributed E2E tests (50440-50459)
|
|
3129
|
+
"demo-e2e-distributed": { start: 50440, size: 20 },
|
|
3128
3130
|
// Mock servers and utilities (50900-50999)
|
|
3129
3131
|
"mock-oauth": { start: 50900, size: 10 },
|
|
3130
3132
|
"mock-api": { start: 50910, size: 10 },
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distributed Test Cluster
|
|
3
|
+
*
|
|
4
|
+
* Manages multiple TestServer instances that share a single Redis,
|
|
5
|
+
* each with a unique MACHINE_ID.
|
|
6
|
+
* Used for E2E testing of session scaling, SSE routing, and takeover.
|
|
7
|
+
*/
|
|
8
|
+
import { TestServer, type TestServerInfo } from './test-server';
|
|
9
|
+
export interface ClusterNode {
|
|
10
|
+
/** Node index (0-based) */
|
|
11
|
+
index: number;
|
|
12
|
+
/** Machine ID for this node */
|
|
13
|
+
machineId: string;
|
|
14
|
+
/** Server info (baseUrl, port) */
|
|
15
|
+
info: TestServerInfo;
|
|
16
|
+
/** Underlying TestServer instance */
|
|
17
|
+
server: TestServer;
|
|
18
|
+
}
|
|
19
|
+
export interface DistributedClusterOptions {
|
|
20
|
+
/** Redis URL (e.g., redis://localhost:6379) */
|
|
21
|
+
redisUrl: string;
|
|
22
|
+
/** Path to the server entry file (e.g., apps/e2e/demo-e2e-distributed/src/main.ts) */
|
|
23
|
+
serverEntry: string;
|
|
24
|
+
/** E2E project name for port allocation */
|
|
25
|
+
project?: string;
|
|
26
|
+
/** Additional environment variables for all nodes */
|
|
27
|
+
env?: Record<string, string>;
|
|
28
|
+
/** Server startup timeout in ms (default: 45000) */
|
|
29
|
+
startupTimeout?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Manages a cluster of FrontMCP server instances for distributed testing.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const redis = await startRedisContainer();
|
|
37
|
+
* const cluster = new DistributedTestCluster({
|
|
38
|
+
* redisUrl: redis.url,
|
|
39
|
+
* serverEntry: 'apps/e2e/demo-e2e-distributed/src/main.ts',
|
|
40
|
+
* project: 'demo-e2e-distributed',
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* const nodes = await cluster.start(2);
|
|
44
|
+
* // nodes[0].info.baseUrl, nodes[1].info.baseUrl
|
|
45
|
+
*
|
|
46
|
+
* await cluster.stopNode(0); // simulate pod death
|
|
47
|
+
* await cluster.teardown();
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export declare class DistributedTestCluster {
|
|
51
|
+
private nodes;
|
|
52
|
+
private readonly options;
|
|
53
|
+
private nextIndex;
|
|
54
|
+
constructor(options: DistributedClusterOptions);
|
|
55
|
+
/**
|
|
56
|
+
* Start N server instances with unique MACHINE_IDs sharing the same Redis.
|
|
57
|
+
* Can only be called once — call teardown() before starting again.
|
|
58
|
+
*/
|
|
59
|
+
start(count: number): Promise<ClusterNode[]>;
|
|
60
|
+
/**
|
|
61
|
+
* Start a single node at the given index.
|
|
62
|
+
*/
|
|
63
|
+
startNode(index: number): Promise<ClusterNode>;
|
|
64
|
+
/**
|
|
65
|
+
* Stop a specific node (simulate pod death).
|
|
66
|
+
* Removes the node from the cluster — it cannot be reused.
|
|
67
|
+
*/
|
|
68
|
+
stopNode(index: number): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Get info for a running node. Returns undefined if the node
|
|
71
|
+
* was never started or has been stopped.
|
|
72
|
+
*/
|
|
73
|
+
getNode(index: number): ClusterNode | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Stop all nodes and clean up.
|
|
76
|
+
*/
|
|
77
|
+
teardown(): Promise<void>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=distributed-test-cluster.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distributed-test-cluster.d.ts","sourceRoot":"","sources":["../../src/server/distributed-test-cluster.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,qCAAqC;IACrC,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB;IACxC,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qDAAqD;IACrD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,KAAK,CAAqE;IAClF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,SAAS,CAAK;gBAEV,OAAO,EAAE,yBAAyB;IAI9C;;;OAGG;IACG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAoBlD;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA4BpD;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5C;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAW/C;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
|
|
@@ -163,6 +163,10 @@ export declare const E2E_PORT_RANGES: {
|
|
|
163
163
|
readonly start: 50430;
|
|
164
164
|
readonly size: 10;
|
|
165
165
|
};
|
|
166
|
+
readonly 'demo-e2e-distributed': {
|
|
167
|
+
readonly start: 50440;
|
|
168
|
+
readonly size: 20;
|
|
169
|
+
};
|
|
166
170
|
readonly 'mock-oauth': {
|
|
167
171
|
readonly start: 50900;
|
|
168
172
|
readonly size: 10;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-registry.d.ts","sourceRoot":"","sources":["../../src/server/port-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"port-registry.d.ts","sourceRoot":"","sources":["../../src/server/port-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAQH;;;;;;GAMG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DlB,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,eAAe,CAAC;AAuBtD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAM7E;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAiEzD;AAkFD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAWxE;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAM/F"}
|