Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/mcp/test/vscode-node/commands.spec.ts
13405 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { beforeEach, describe, expect, it } from 'vitest';
7
import { ILogService } from '../../../../platform/log/common/logService';
8
import { ITestingServicesAccessor, TestingServiceCollection } from '../../../../platform/test/node/services';
9
import { createExtensionUnitTestingServices } from '../../../test/node/services';
10
import { McpSetupCommands } from '../../vscode-node/commands';
11
import { FixtureFetcherService } from './util';
12
13
describe('get MCP server info', { timeout: 30_000 }, () => {
14
let testingServiceCollection: TestingServiceCollection;
15
let accessor: ITestingServicesAccessor;
16
let logService: ILogService;
17
let emptyFetcherService: FixtureFetcherService;
18
19
beforeEach(() => {
20
testingServiceCollection = createExtensionUnitTestingServices();
21
accessor = testingServiceCollection.createTestingAccessor();
22
logService = accessor.get(ILogService);
23
emptyFetcherService = new FixtureFetcherService();
24
});
25
26
it('npm returns package metadata', async () => {
27
const fetcherService = new FixtureFetcherService(new Map([
28
['https://registry.npmjs.org/%40modelcontextprotocol%2Fserver-everything', {
29
fileName: 'npm-modelcontextprotocol-server-everything.json',
30
status: 200
31
}]
32
]));
33
const result = await McpSetupCommands.validatePackageRegistry({ type: 'npm', name: '@modelcontextprotocol/server-everything' }, logService, fetcherService);
34
expect(result.state).toBe('ok');
35
if (result.state === 'ok') {
36
expect(result.name).toBe('@modelcontextprotocol/server-everything');
37
expect(result.version).toBeDefined();
38
expect(result.publisher).toContain('jspahrsummers');
39
} else {
40
expect.fail();
41
}
42
});
43
44
it('npm handles missing package', async () => {
45
const result = await McpSetupCommands.validatePackageRegistry({ type: 'npm', name: '@modelcontextprotocol/does-not-exist' }, logService, emptyFetcherService);
46
expect(emptyFetcherService.urls[0]).toBe('https://registry.npmjs.org/%40modelcontextprotocol%2Fdoes-not-exist');
47
expect(result.state).toBe('error');
48
if (result.state === 'error') {
49
expect(result.error).toBeDefined();
50
expect(result.errorType).toBe('NotFound');
51
} else {
52
expect.fail();
53
}
54
});
55
56
it('pip returns package metadata', async () => {
57
const fetcherService = new FixtureFetcherService(new Map([
58
['https://pypi.org/pypi/mcp-server-fetch/json', {
59
fileName: 'pip-mcp-server-fetch.json',
60
status: 200
61
}]
62
]));
63
const result = await McpSetupCommands.validatePackageRegistry({ type: 'pip', name: 'mcp-server-fetch' }, logService, fetcherService);
64
expect(result.state).toBe('ok');
65
if (result.state === 'ok') {
66
expect(result.name).toBe('mcp-server-fetch');
67
expect(result.version).toBeDefined();
68
expect(result.publisher).toContain('Anthropic');
69
} else {
70
expect.fail();
71
}
72
});
73
74
it('pip handles missing package', async () => {
75
const result = await McpSetupCommands.validatePackageRegistry({ type: 'pip', name: 'mcp-server-that-does-not-exist' }, logService, emptyFetcherService);
76
expect(emptyFetcherService.urls[0]).toBe('https://pypi.org/pypi/mcp-server-that-does-not-exist/json');
77
expect(result.state).toBe('error');
78
if (result.state === 'error') {
79
expect(result.error).toBeDefined();
80
expect(result.errorType).toBe('NotFound');
81
} else {
82
expect.fail();
83
}
84
});
85
86
it('docker returns package metadata', async () => {
87
const fetcherService = new FixtureFetcherService(new Map([
88
['https://hub.docker.com/v2/repositories/mcp/node-code-sandbox', {
89
fileName: 'docker-mcp-node-code-sandbox.json',
90
status: 200
91
}]
92
]));
93
const result = await McpSetupCommands.validatePackageRegistry({ type: 'docker', name: 'mcp/node-code-sandbox' }, logService, fetcherService);
94
expect(result.state).toBe('ok');
95
if (result.state === 'ok') {
96
expect(result.name).toBe('mcp/node-code-sandbox');
97
expect(result.version).toBeUndefined(); // currently not populated
98
expect(result.publisher).toBe('mcp');
99
} else {
100
expect.fail();
101
}
102
});
103
104
it('docker handles missing package', async () => {
105
const result = await McpSetupCommands.validatePackageRegistry({ type: 'docker', name: 'mcp/server-that-does-not-exist' }, logService, emptyFetcherService);
106
expect(emptyFetcherService.urls[0]).toBe('https://hub.docker.com/v2/repositories/mcp/server-that-does-not-exist');
107
expect(result.state).toBe('error');
108
if (result.state === 'error') {
109
expect(result.error).toBeDefined();
110
expect(result.errorType).toBe('NotFound');
111
} else {
112
expect.fail();
113
}
114
});
115
});
116
117