appium-mcp 1.76.0 → 1.78.0
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/CHANGELOG.md +12 -0
- package/README.md +169 -70
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +49 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/command.js +1 -1
- package/dist/command.js.map +1 -1
- package/dist/core.d.ts +12 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +10 -0
- package/dist/core.js.map +1 -0
- package/dist/create-server.d.ts +50 -0
- package/dist/create-server.d.ts.map +1 -0
- package/dist/create-server.js +180 -0
- package/dist/create-server.js.map +1 -0
- package/dist/index.js +2 -36
- package/dist/index.js.map +1 -1
- package/dist/plugin.d.ts +209 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +367 -0
- package/dist/plugin.js.map +1 -0
- package/dist/server.d.ts +1 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -67
- package/dist/server.js.map +1 -1
- package/dist/session-store.d.ts +8 -8
- package/dist/session-store.d.ts.map +1 -1
- package/dist/session-store.js +3 -2
- package/dist/session-store.js.map +1 -1
- package/dist/tests/__mocks__/@appium/support.d.ts +54 -61
- package/dist/tests/__mocks__/@appium/support.d.ts.map +1 -1
- package/dist/tests/__mocks__/@appium/support.js +42 -70
- package/dist/tests/__mocks__/@appium/support.js.map +1 -1
- package/dist/tests/create-server.test.d.ts +2 -0
- package/dist/tests/create-server.test.d.ts.map +1 -0
- package/dist/tests/create-server.test.js +253 -0
- package/dist/tests/create-server.test.js.map +1 -0
- package/dist/tests/plugin.test.d.ts +2 -0
- package/dist/tests/plugin.test.d.ts.map +1 -0
- package/dist/tests/plugin.test.js +340 -0
- package/dist/tests/plugin.test.js.map +1 -0
- package/dist/tests/tools/llm-wording.test.js +4 -1
- package/dist/tests/tools/llm-wording.test.js.map +1 -1
- package/dist/tests/verify.test.d.ts +2 -0
- package/dist/tests/verify.test.d.ts.map +1 -0
- package/dist/tests/verify.test.js +133 -0
- package/dist/tests/verify.test.js.map +1 -0
- package/dist/tests/vision-finder.test.d.ts +1 -1
- package/dist/tests/vision-finder.test.js +24 -6
- package/dist/tests/vision-finder.test.js.map +1 -1
- package/package.json +13 -1
- package/scripts/verify-names.mjs +12 -0
- package/server.json +2 -2
- package/src/cli/index.ts +58 -0
- package/src/command.ts +1 -1
- package/src/core.ts +28 -0
- package/src/create-server.ts +252 -0
- package/src/index.ts +2 -42
- package/src/plugin.ts +557 -0
- package/src/resources/submodules.zip +0 -0
- package/src/server.ts +2 -87
- package/src/session-store.ts +12 -11
|
@@ -1,53 +1,19 @@
|
|
|
1
1
|
export declare const logger: {
|
|
2
2
|
getLogger: (_name: string) => {
|
|
3
|
-
debug: (
|
|
4
|
-
info: (
|
|
5
|
-
warn: (
|
|
6
|
-
error: (
|
|
7
|
-
trace: (
|
|
3
|
+
debug: () => void;
|
|
4
|
+
info: () => void;
|
|
5
|
+
warn: () => void;
|
|
6
|
+
error: () => void;
|
|
7
|
+
trace: () => void;
|
|
8
8
|
};
|
|
9
9
|
};
|
|
10
|
-
/**
|
|
11
|
-
* Mock imageUtil for Jest tests.
|
|
12
|
-
*
|
|
13
|
-
* A single shared sharpInstance is used across all calls so tests can
|
|
14
|
-
* inspect and override its methods (resize / jpeg / toBuffer) via
|
|
15
|
-
* mockSharpInstance exported below.
|
|
16
|
-
*/
|
|
17
|
-
export type MockSharpInstance = {
|
|
18
|
-
resizeCalls: Array<[number, number]>;
|
|
19
|
-
toBufferImpl: () => Promise<Buffer>;
|
|
20
|
-
resize: (w: number, h: number) => MockSharpInstance;
|
|
21
|
-
jpeg: (_opts?: unknown) => MockSharpInstance;
|
|
22
|
-
toBuffer: () => Promise<Buffer>;
|
|
23
|
-
reset: () => void;
|
|
24
|
-
};
|
|
25
|
-
/** Shared instance – tests can mutate toBufferImpl or inspect resizeCalls */
|
|
26
|
-
export declare const mockSharpInstance: MockSharpInstance;
|
|
27
|
-
export declare const imageUtil: {
|
|
28
|
-
requireSharp: () => (_input: Buffer) => MockSharpInstance;
|
|
29
|
-
};
|
|
30
|
-
export declare const net: {
|
|
31
|
-
downloadFile: (_remoteUrl: string, _dstPath: string, _opts?: unknown) => Promise<void>;
|
|
32
|
-
};
|
|
33
|
-
export declare const plist: {
|
|
34
|
-
parsePlistFile: (_plistPath: string) => Promise<{}>;
|
|
35
|
-
};
|
|
36
|
-
export declare const zip: {
|
|
37
|
-
extractAllTo: (_zipPath: string, _destDir: string, _opts?: unknown) => Promise<void>;
|
|
38
|
-
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
39
|
-
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
43
|
-
* the real filesystem continues to work.
|
|
44
|
-
*/
|
|
45
10
|
export declare const fs: {
|
|
11
|
+
hasAccess: (p: string) => Promise<boolean>;
|
|
46
12
|
exists: (p: string) => Promise<boolean>;
|
|
47
13
|
readdir: (p: string) => Promise<string[]>;
|
|
48
14
|
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
49
15
|
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
50
|
-
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
16
|
+
writeFile: (p: string, data: string | Buffer, encoding?: BufferEncoding) => Promise<void>;
|
|
51
17
|
unlink: (p: string) => Promise<void>;
|
|
52
18
|
rename: (from: string, to: string) => Promise<void>;
|
|
53
19
|
mkdir: (p: string, opts?: {
|
|
@@ -56,36 +22,43 @@ export declare const fs: {
|
|
|
56
22
|
mkdirp: (p: string) => Promise<string | undefined>;
|
|
57
23
|
mv: (from: string, to: string) => Promise<void>;
|
|
58
24
|
};
|
|
25
|
+
export declare const imageUtil: {
|
|
26
|
+
requireSharp: () => never;
|
|
27
|
+
};
|
|
28
|
+
export declare const util: {
|
|
29
|
+
wrapElement: (elementId: string) => {
|
|
30
|
+
ELEMENT: string;
|
|
31
|
+
'element-6066-11e4-a52e-4f735466cecf': string;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export declare const net: {
|
|
35
|
+
downloadFile: () => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
export declare const plist: {
|
|
38
|
+
parsePlistFile: () => Promise<{}>;
|
|
39
|
+
};
|
|
40
|
+
export declare const zip: {
|
|
41
|
+
extractAllTo: () => Promise<void>;
|
|
42
|
+
readEntries: () => Promise<void>;
|
|
43
|
+
toArchive: () => Promise<void>;
|
|
44
|
+
};
|
|
59
45
|
declare const _default: {
|
|
60
46
|
logger: {
|
|
61
47
|
getLogger: (_name: string) => {
|
|
62
|
-
debug: (
|
|
63
|
-
info: (
|
|
64
|
-
warn: (
|
|
65
|
-
error: (
|
|
66
|
-
trace: (
|
|
48
|
+
debug: () => void;
|
|
49
|
+
info: () => void;
|
|
50
|
+
warn: () => void;
|
|
51
|
+
error: () => void;
|
|
52
|
+
trace: () => void;
|
|
67
53
|
};
|
|
68
54
|
};
|
|
69
|
-
imageUtil: {
|
|
70
|
-
requireSharp: () => (_input: Buffer) => MockSharpInstance;
|
|
71
|
-
};
|
|
72
|
-
net: {
|
|
73
|
-
downloadFile: (_remoteUrl: string, _dstPath: string, _opts?: unknown) => Promise<void>;
|
|
74
|
-
};
|
|
75
|
-
plist: {
|
|
76
|
-
parsePlistFile: (_plistPath: string) => Promise<{}>;
|
|
77
|
-
};
|
|
78
|
-
zip: {
|
|
79
|
-
extractAllTo: (_zipPath: string, _destDir: string, _opts?: unknown) => Promise<void>;
|
|
80
|
-
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
81
|
-
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
82
|
-
};
|
|
83
55
|
fs: {
|
|
56
|
+
hasAccess: (p: string) => Promise<boolean>;
|
|
84
57
|
exists: (p: string) => Promise<boolean>;
|
|
85
58
|
readdir: (p: string) => Promise<string[]>;
|
|
86
59
|
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
87
60
|
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
88
|
-
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
61
|
+
writeFile: (p: string, data: string | Buffer, encoding?: BufferEncoding) => Promise<void>;
|
|
89
62
|
unlink: (p: string) => Promise<void>;
|
|
90
63
|
rename: (from: string, to: string) => Promise<void>;
|
|
91
64
|
mkdir: (p: string, opts?: {
|
|
@@ -94,6 +67,26 @@ declare const _default: {
|
|
|
94
67
|
mkdirp: (p: string) => Promise<string | undefined>;
|
|
95
68
|
mv: (from: string, to: string) => Promise<void>;
|
|
96
69
|
};
|
|
70
|
+
imageUtil: {
|
|
71
|
+
requireSharp: () => never;
|
|
72
|
+
};
|
|
73
|
+
util: {
|
|
74
|
+
wrapElement: (elementId: string) => {
|
|
75
|
+
ELEMENT: string;
|
|
76
|
+
'element-6066-11e4-a52e-4f735466cecf': string;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
net: {
|
|
80
|
+
downloadFile: () => Promise<void>;
|
|
81
|
+
};
|
|
82
|
+
plist: {
|
|
83
|
+
parsePlistFile: () => Promise<{}>;
|
|
84
|
+
};
|
|
85
|
+
zip: {
|
|
86
|
+
extractAllTo: () => Promise<void>;
|
|
87
|
+
readEntries: () => Promise<void>;
|
|
88
|
+
toArchive: () => Promise<void>;
|
|
89
|
+
};
|
|
97
90
|
};
|
|
98
91
|
export default _default;
|
|
99
92
|
//# sourceMappingURL=support.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,MAAM;uBACE,MAAM;;;;;;;CAO1B,CAAC;AAEF,eAAO,MAAM,EAAE;mBACQ,MAAM;gBAQT,MAAM;iBACX,MAAM;cACT,MAAM;kBACF,MAAM,aAAa,cAAc;mBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM,aAAa,cAAc;gBAE3D,MAAM;mBACH,MAAM,MAAM,MAAM;eACtB,MAAM,SAAS;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;gBAErC,MAAM;eACD,MAAM,MAAM,MAAM;CAGpC,CAAC;AAEF,eAAO,MAAM,SAAS;;CAIrB,CAAC;AAEF,eAAO,MAAM,IAAI;6BACU,MAAM;;;;CAIhC,CAAC;AAEF,eAAO,MAAM,GAAG;;CAEf,CAAC;AAEF,eAAO,MAAM,KAAK;;CAEjB,CAAC;AAEF,eAAO,MAAM,GAAG;;;;CAIf,CAAC;;;2BA5DmB,MAAM;;;;;;;;;uBAUJ,MAAM;oBAQT,MAAM;qBACX,MAAM;kBACT,MAAM;sBACF,MAAM,aAAa,cAAc;uBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM,aAAa,cAAc;oBAE3D,MAAM;uBACH,MAAM,MAAM,MAAM;mBACtB,MAAM,SAAS;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE;oBAErC,MAAM;mBACD,MAAM,MAAM,MAAM;;;;;;iCAYV,MAAM;;;;;;;;;;;;;;;;;AAoBjC,wBAQE"}
|
|
@@ -1,79 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { promises as fsPromises, existsSync } from 'node:fs';
|
|
1
|
+
import { constants, existsSync, promises as fsPromises } from 'node:fs';
|
|
2
|
+
const noop = () => { };
|
|
4
3
|
export const logger = {
|
|
5
|
-
getLogger: (_name) =>
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
info: (_message, ..._args) => {
|
|
13
|
-
// Silent in tests by default
|
|
14
|
-
},
|
|
15
|
-
warn: (_message, ..._args) => {
|
|
16
|
-
// Silent in tests by default
|
|
17
|
-
},
|
|
18
|
-
error: (_message, ..._args) => {
|
|
19
|
-
// Silent in tests by default
|
|
20
|
-
},
|
|
21
|
-
trace: (_message, ..._args) => {
|
|
22
|
-
// Silent in tests by default
|
|
23
|
-
},
|
|
4
|
+
getLogger: (_name) => ({
|
|
5
|
+
debug: noop,
|
|
6
|
+
info: noop,
|
|
7
|
+
warn: noop,
|
|
8
|
+
error: noop,
|
|
9
|
+
trace: noop,
|
|
24
10
|
}),
|
|
25
11
|
};
|
|
26
|
-
/** Shared instance – tests can mutate toBufferImpl or inspect resizeCalls */
|
|
27
|
-
export const mockSharpInstance = {
|
|
28
|
-
resizeCalls: [],
|
|
29
|
-
toBufferImpl: () => Promise.resolve(Buffer.from('mock-compressed-image')),
|
|
30
|
-
resize(w, h) {
|
|
31
|
-
this.resizeCalls.push([w, h]);
|
|
32
|
-
return this;
|
|
33
|
-
},
|
|
34
|
-
jpeg(_opts) {
|
|
35
|
-
return this;
|
|
36
|
-
},
|
|
37
|
-
toBuffer() {
|
|
38
|
-
return this.toBufferImpl();
|
|
39
|
-
},
|
|
40
|
-
reset() {
|
|
41
|
-
this.resizeCalls = [];
|
|
42
|
-
this.toBufferImpl = () => Promise.resolve(Buffer.from('mock-compressed-image'));
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
export const imageUtil = {
|
|
46
|
-
requireSharp: () => (_input) => mockSharpInstance,
|
|
47
|
-
};
|
|
48
|
-
export const net = {
|
|
49
|
-
downloadFile: async (_remoteUrl, _dstPath, _opts) => {
|
|
50
|
-
// Silent in tests by default
|
|
51
|
-
},
|
|
52
|
-
};
|
|
53
|
-
export const plist = {
|
|
54
|
-
parsePlistFile: async (_plistPath) => ({}),
|
|
55
|
-
};
|
|
56
|
-
export const zip = {
|
|
57
|
-
extractAllTo: async (_zipPath, _destDir, _opts) => {
|
|
58
|
-
// Silent in tests by default
|
|
59
|
-
},
|
|
60
|
-
readEntries: async (_zipPath, _handler) => {
|
|
61
|
-
// Silent in tests by default
|
|
62
|
-
},
|
|
63
|
-
toArchive: async (_dstPath, _src, _opts) => {
|
|
64
|
-
// Silent in tests by default
|
|
65
|
-
},
|
|
66
|
-
};
|
|
67
|
-
/**
|
|
68
|
-
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
69
|
-
* the real filesystem continues to work.
|
|
70
|
-
*/
|
|
71
12
|
export const fs = {
|
|
13
|
+
hasAccess: async (p) => {
|
|
14
|
+
try {
|
|
15
|
+
await fsPromises.access(p, constants.R_OK);
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
},
|
|
72
22
|
exists: async (p) => existsSync(p),
|
|
73
23
|
readdir: (p) => fsPromises.readdir(p),
|
|
74
24
|
stat: (p) => fsPromises.stat(p),
|
|
75
25
|
readFile: (p, encoding) => fsPromises.readFile(p, encoding),
|
|
76
|
-
writeFile: (p, data) => fsPromises.writeFile(p, data),
|
|
26
|
+
writeFile: (p, data, encoding) => fsPromises.writeFile(p, data, encoding),
|
|
77
27
|
unlink: (p) => fsPromises.unlink(p),
|
|
78
28
|
rename: (from, to) => fsPromises.rename(from, to),
|
|
79
29
|
mkdir: (p, opts) => fsPromises.mkdir(p, opts),
|
|
@@ -82,13 +32,35 @@ export const fs = {
|
|
|
82
32
|
await fsPromises.rename(from, to);
|
|
83
33
|
},
|
|
84
34
|
};
|
|
85
|
-
|
|
35
|
+
export const imageUtil = {
|
|
36
|
+
requireSharp: () => {
|
|
37
|
+
throw new Error('imageUtil.requireSharp must be mocked by the test');
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
export const util = {
|
|
41
|
+
wrapElement: (elementId) => ({
|
|
42
|
+
ELEMENT: elementId,
|
|
43
|
+
'element-6066-11e4-a52e-4f735466cecf': elementId,
|
|
44
|
+
}),
|
|
45
|
+
};
|
|
46
|
+
export const net = {
|
|
47
|
+
downloadFile: async () => { },
|
|
48
|
+
};
|
|
49
|
+
export const plist = {
|
|
50
|
+
parsePlistFile: async () => ({}),
|
|
51
|
+
};
|
|
52
|
+
export const zip = {
|
|
53
|
+
extractAllTo: async () => { },
|
|
54
|
+
readEntries: async () => { },
|
|
55
|
+
toArchive: async () => { },
|
|
56
|
+
};
|
|
86
57
|
export default {
|
|
87
58
|
logger,
|
|
59
|
+
fs,
|
|
88
60
|
imageUtil,
|
|
61
|
+
util,
|
|
89
62
|
net,
|
|
90
63
|
plist,
|
|
91
64
|
zip,
|
|
92
|
-
fs,
|
|
93
65
|
};
|
|
94
66
|
//# sourceMappingURL=support.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-server.test.d.ts","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { afterEach, describe, expect, jest, test } from '@jest/globals';
|
|
2
|
+
const registeredServers = [];
|
|
3
|
+
const safeDeleteAllSessions = jest.fn();
|
|
4
|
+
let sessions = [];
|
|
5
|
+
class MockFastMCP {
|
|
6
|
+
options;
|
|
7
|
+
tools = [];
|
|
8
|
+
handlers = new Map();
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.options = options;
|
|
11
|
+
registeredServers.push(this);
|
|
12
|
+
}
|
|
13
|
+
addTool(toolDef) {
|
|
14
|
+
this.tools.push(toolDef);
|
|
15
|
+
}
|
|
16
|
+
on(eventName, handler) {
|
|
17
|
+
const handlers = this.handlers.get(eventName) ?? [];
|
|
18
|
+
handlers.push(handler);
|
|
19
|
+
this.handlers.set(eventName, handlers);
|
|
20
|
+
}
|
|
21
|
+
async emitTest(eventName, event) {
|
|
22
|
+
for (const handler of this.handlers.get(eventName) ?? []) {
|
|
23
|
+
await handler(event);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
await jest.unstable_mockModule('fastmcp', () => ({
|
|
28
|
+
FastMCP: MockFastMCP,
|
|
29
|
+
}));
|
|
30
|
+
await jest.unstable_mockModule('../tools/index', () => ({
|
|
31
|
+
default: (server) => {
|
|
32
|
+
server.addTool({
|
|
33
|
+
name: 'builtin_tool',
|
|
34
|
+
description: 'Built-in test tool',
|
|
35
|
+
parameters: {},
|
|
36
|
+
execute: async () => ({
|
|
37
|
+
content: [{ type: 'text', text: 'builtin result' }],
|
|
38
|
+
}),
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
}));
|
|
42
|
+
await jest.unstable_mockModule('../resources/index', () => ({
|
|
43
|
+
default: jest.fn(),
|
|
44
|
+
}));
|
|
45
|
+
await jest.unstable_mockModule('../session-store', () => ({
|
|
46
|
+
getDriver: jest.fn(() => null),
|
|
47
|
+
getSessionId: jest.fn(() => null),
|
|
48
|
+
getSessionInfo: jest.fn(() => null),
|
|
49
|
+
listSessions: jest.fn(() => sessions),
|
|
50
|
+
safeDeleteAllSessions,
|
|
51
|
+
}));
|
|
52
|
+
await jest.unstable_mockModule('../logger', () => ({
|
|
53
|
+
default: {
|
|
54
|
+
debug: jest.fn(),
|
|
55
|
+
info: jest.fn(),
|
|
56
|
+
warn: jest.fn(),
|
|
57
|
+
error: jest.fn(),
|
|
58
|
+
},
|
|
59
|
+
}));
|
|
60
|
+
const { createAppiumMcpServer } = await import('../create-server.js');
|
|
61
|
+
afterEach(() => {
|
|
62
|
+
registeredServers.length = 0;
|
|
63
|
+
sessions = [];
|
|
64
|
+
safeDeleteAllSessions.mockReset();
|
|
65
|
+
delete process.env.APPIUM_MCP_ON_CLIENT_DISCONNECT;
|
|
66
|
+
});
|
|
67
|
+
describe('createAppiumMcpServer plugin lifecycle', () => {
|
|
68
|
+
test('registers plugin capabilities during construction but initializes lazily', async () => {
|
|
69
|
+
let registerCalled = false;
|
|
70
|
+
let initialized = false;
|
|
71
|
+
const plugin = {
|
|
72
|
+
name: 'lazy-plugin',
|
|
73
|
+
version: '1.0.0',
|
|
74
|
+
register(_registry, core) {
|
|
75
|
+
registerCalled = true;
|
|
76
|
+
expect(core.getSessionId()).toBeNull();
|
|
77
|
+
},
|
|
78
|
+
async initialize() {
|
|
79
|
+
initialized = true;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const server = createAppiumMcpServer({
|
|
83
|
+
plugins: [plugin],
|
|
84
|
+
});
|
|
85
|
+
expect(registerCalled).toBe(true);
|
|
86
|
+
expect(initialized).toBe(false);
|
|
87
|
+
await server.emitTest('connect', { session: 'client-1' });
|
|
88
|
+
expect(initialized).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
test('wraps built-in tools with beforeCall and afterCall hooks', async () => {
|
|
91
|
+
const calls = [];
|
|
92
|
+
const plugin = {
|
|
93
|
+
name: 'hook-plugin',
|
|
94
|
+
version: '1.0.0',
|
|
95
|
+
async beforeCall(ctx) {
|
|
96
|
+
calls.push(`before:${ctx.toolName}`);
|
|
97
|
+
},
|
|
98
|
+
async afterCall(ctx, result) {
|
|
99
|
+
calls.push(`after:${ctx.toolName}`);
|
|
100
|
+
return {
|
|
101
|
+
...result,
|
|
102
|
+
content: [{ type: 'text', text: 'modified builtin result' }],
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const server = createAppiumMcpServer({
|
|
107
|
+
plugins: [plugin],
|
|
108
|
+
});
|
|
109
|
+
const result = (await server.tools[0].execute({}, {}));
|
|
110
|
+
expect(calls).toEqual(['before:builtin_tool', 'after:builtin_tool']);
|
|
111
|
+
expect(result.content[0]).toEqual({
|
|
112
|
+
type: 'text',
|
|
113
|
+
text: 'modified builtin result',
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
test('destroys plugins only after the last client disconnects', async () => {
|
|
117
|
+
let initializeCount = 0;
|
|
118
|
+
let destroyCount = 0;
|
|
119
|
+
const plugin = {
|
|
120
|
+
name: 'lifecycle-plugin',
|
|
121
|
+
version: '1.0.0',
|
|
122
|
+
async initialize() {
|
|
123
|
+
initializeCount += 1;
|
|
124
|
+
},
|
|
125
|
+
async destroy() {
|
|
126
|
+
destroyCount += 1;
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
const server = createAppiumMcpServer({
|
|
130
|
+
plugins: [plugin],
|
|
131
|
+
});
|
|
132
|
+
await server.emitTest('connect', { session: 'client-1' });
|
|
133
|
+
await server.emitTest('connect', { session: 'client-2' });
|
|
134
|
+
await server.emitTest('disconnect', { session: 'client-1' });
|
|
135
|
+
expect(initializeCount).toBe(1);
|
|
136
|
+
expect(destroyCount).toBe(0);
|
|
137
|
+
await server.emitTest('disconnect', { session: 'client-2' });
|
|
138
|
+
expect(destroyCount).toBe(1);
|
|
139
|
+
});
|
|
140
|
+
test('initializes plugins once when clients connect concurrently', async () => {
|
|
141
|
+
let initializeCount = 0;
|
|
142
|
+
let resolveInitialize;
|
|
143
|
+
let markInitializeStarted;
|
|
144
|
+
const initializeStarted = new Promise((resolve) => {
|
|
145
|
+
markInitializeStarted = resolve;
|
|
146
|
+
});
|
|
147
|
+
const plugin = {
|
|
148
|
+
name: 'concurrent-plugin',
|
|
149
|
+
version: '1.0.0',
|
|
150
|
+
async initialize() {
|
|
151
|
+
initializeCount += 1;
|
|
152
|
+
markInitializeStarted?.();
|
|
153
|
+
await new Promise((resolve) => {
|
|
154
|
+
resolveInitialize = resolve;
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
const server = createAppiumMcpServer({
|
|
159
|
+
plugins: [plugin],
|
|
160
|
+
});
|
|
161
|
+
const connectA = server.emitTest('connect', { session: 'client-1' });
|
|
162
|
+
const connectB = server.emitTest('connect', { session: 'client-2' });
|
|
163
|
+
await initializeStarted;
|
|
164
|
+
expect(initializeCount).toBe(1);
|
|
165
|
+
resolveInitialize?.();
|
|
166
|
+
await Promise.all([connectA, connectB]);
|
|
167
|
+
expect(initializeCount).toBe(1);
|
|
168
|
+
});
|
|
169
|
+
test('re-initializes only after an in-flight destroy finishes', async () => {
|
|
170
|
+
const calls = [];
|
|
171
|
+
let resolveDestroy;
|
|
172
|
+
const plugin = {
|
|
173
|
+
name: 'destroy-race-plugin',
|
|
174
|
+
version: '1.0.0',
|
|
175
|
+
async initialize() {
|
|
176
|
+
calls.push('initialize');
|
|
177
|
+
},
|
|
178
|
+
async destroy() {
|
|
179
|
+
calls.push('destroy-start');
|
|
180
|
+
await new Promise((resolve) => {
|
|
181
|
+
resolveDestroy = resolve;
|
|
182
|
+
});
|
|
183
|
+
calls.push('destroy-end');
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
const server = createAppiumMcpServer({
|
|
187
|
+
plugins: [plugin],
|
|
188
|
+
});
|
|
189
|
+
await server.emitTest('connect', { session: 'client-1' });
|
|
190
|
+
const disconnect = server.emitTest('disconnect', { session: 'client-1' });
|
|
191
|
+
await Promise.resolve();
|
|
192
|
+
const reconnect = server.emitTest('connect', { session: 'client-2' });
|
|
193
|
+
expect(calls).toEqual(['initialize', 'destroy-start']);
|
|
194
|
+
resolveDestroy?.();
|
|
195
|
+
await Promise.all([disconnect, reconnect]);
|
|
196
|
+
expect(calls).toEqual([
|
|
197
|
+
'initialize',
|
|
198
|
+
'destroy-start',
|
|
199
|
+
'destroy-end',
|
|
200
|
+
'initialize',
|
|
201
|
+
]);
|
|
202
|
+
});
|
|
203
|
+
test('destroys plugins after final disconnect during pending initialization', async () => {
|
|
204
|
+
let initializeCount = 0;
|
|
205
|
+
let destroyCount = 0;
|
|
206
|
+
let resolveInitialize;
|
|
207
|
+
const plugin = {
|
|
208
|
+
name: 'pending-init-plugin',
|
|
209
|
+
version: '1.0.0',
|
|
210
|
+
async initialize() {
|
|
211
|
+
initializeCount += 1;
|
|
212
|
+
await new Promise((resolve) => {
|
|
213
|
+
resolveInitialize = resolve;
|
|
214
|
+
});
|
|
215
|
+
},
|
|
216
|
+
async destroy() {
|
|
217
|
+
destroyCount += 1;
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
const server = createAppiumMcpServer({
|
|
221
|
+
plugins: [plugin],
|
|
222
|
+
});
|
|
223
|
+
const connect = server.emitTest('connect', { session: 'client-1' });
|
|
224
|
+
await Promise.resolve();
|
|
225
|
+
const disconnect = server.emitTest('disconnect', { session: 'client-1' });
|
|
226
|
+
expect(initializeCount).toBe(1);
|
|
227
|
+
expect(destroyCount).toBe(0);
|
|
228
|
+
resolveInitialize?.();
|
|
229
|
+
await Promise.all([connect, disconnect]);
|
|
230
|
+
expect(destroyCount).toBe(1);
|
|
231
|
+
});
|
|
232
|
+
test('destroys plugins on final disconnect when session cleanup policy is skip', async () => {
|
|
233
|
+
process.env.APPIUM_MCP_ON_CLIENT_DISCONNECT = 'skip';
|
|
234
|
+
sessions = [{ sessionId: 'session-1', isActive: true, ownership: 'owned' }];
|
|
235
|
+
let destroyCount = 0;
|
|
236
|
+
const plugin = {
|
|
237
|
+
name: 'skip-policy-plugin',
|
|
238
|
+
version: '1.0.0',
|
|
239
|
+
async initialize() { },
|
|
240
|
+
async destroy() {
|
|
241
|
+
destroyCount += 1;
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
const server = createAppiumMcpServer({
|
|
245
|
+
plugins: [plugin],
|
|
246
|
+
});
|
|
247
|
+
await server.emitTest('connect', { session: 'client-1' });
|
|
248
|
+
await server.emitTest('disconnect', { session: 'client-1' });
|
|
249
|
+
expect(safeDeleteAllSessions).not.toHaveBeenCalled();
|
|
250
|
+
expect(destroyCount).toBe(1);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=create-server.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-server.test.js","sourceRoot":"","sources":["../../src/tests/create-server.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.test.d.ts","sourceRoot":"","sources":["../../src/tests/plugin.test.ts"],"names":[],"mappings":""}
|