@abertnguyen/abert-test-mcp 1.0.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/LICENSE +9 -0
- package/README.md +154 -0
- package/bin/cli.js +14 -0
- package/dist/__tests__/services/configService.test.d.ts +2 -0
- package/dist/__tests__/services/configService.test.d.ts.map +1 -0
- package/dist/__tests__/services/configService.test.js +257 -0
- package/dist/__tests__/services/configService.test.js.map +1 -0
- package/dist/__tests__/utils/fileUtils.test.d.ts +2 -0
- package/dist/__tests__/utils/fileUtils.test.d.ts.map +1 -0
- package/dist/__tests__/utils/fileUtils.test.js +86 -0
- package/dist/__tests__/utils/fileUtils.test.js.map +1 -0
- package/dist/__tests__/utils/httpUtils.test.d.ts +2 -0
- package/dist/__tests__/utils/httpUtils.test.d.ts.map +1 -0
- package/dist/__tests__/utils/httpUtils.test.js +62 -0
- package/dist/__tests__/utils/httpUtils.test.js.map +1 -0
- package/dist/__tests__/utils/processUtils.test.d.ts +2 -0
- package/dist/__tests__/utils/processUtils.test.d.ts.map +1 -0
- package/dist/__tests__/utils/processUtils.test.js +209 -0
- package/dist/__tests__/utils/processUtils.test.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +6 -0
- package/dist/constants.js.map +1 -0
- package/dist/installer.d.ts +24 -0
- package/dist/installer.d.ts.map +1 -0
- package/dist/installer.js +394 -0
- package/dist/installer.js.map +1 -0
- package/dist/services/configService.d.ts +30 -0
- package/dist/services/configService.d.ts.map +1 -0
- package/dist/services/configService.js +347 -0
- package/dist/services/configService.js.map +1 -0
- package/dist/services/downloadService.d.ts +18 -0
- package/dist/services/downloadService.d.ts.map +1 -0
- package/dist/services/downloadService.js +200 -0
- package/dist/services/downloadService.js.map +1 -0
- package/dist/services/installService.d.ts +18 -0
- package/dist/services/installService.d.ts.map +1 -0
- package/dist/services/installService.js +181 -0
- package/dist/services/installService.js.map +1 -0
- package/dist/services/versionService.d.ts +18 -0
- package/dist/services/versionService.d.ts.map +1 -0
- package/dist/services/versionService.js +170 -0
- package/dist/services/versionService.js.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +15 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +89 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/httpUtils.d.ts +20 -0
- package/dist/utils/httpUtils.d.ts.map +1 -0
- package/dist/utils/httpUtils.js +148 -0
- package/dist/utils/httpUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +15 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +55 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pathUtils.d.ts +8 -0
- package/dist/utils/pathUtils.d.ts.map +1 -0
- package/dist/utils/pathUtils.js +35 -0
- package/dist/utils/pathUtils.js.map +1 -0
- package/dist/utils/processUtils.d.ts +25 -0
- package/dist/utils/processUtils.d.ts.map +1 -0
- package/dist/utils/processUtils.js +139 -0
- package/dist/utils/processUtils.js.map +1 -0
- package/package.json +64 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Apache-2.0 License
|
|
2
|
+
|
|
3
|
+
Copyright 2025 Coinbase
|
|
4
|
+
|
|
5
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# @abert/abert-test-mcp
|
|
2
|
+
|
|
3
|
+
Payments MCP is an MCP server & companion wallet app that combines wallets, onramps, and payments via x402 into a single solution for agentic commerce.
|
|
4
|
+
|
|
5
|
+
It enables AI agents to autonomously discover and pay for services without API keys, complex seed phrases, or manual intervention.
|
|
6
|
+
|
|
7
|
+
Read the [documentation](https://docs.cdp.coinbase.com/abert-test-mcp/welcome)
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
### 1) Install abert-test-mcp:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx @abert/abert-test-mcp
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### 2) Select your MCP client:
|
|
18
|
+
|
|
19
|
+
During installation, you'll be prompted to choose which MCP client you're configuring:
|
|
20
|
+
- **Claude** - Claude Desktop application
|
|
21
|
+
- **Claude Code** - Claude Code CLI
|
|
22
|
+
- **Codex** - OpenAI Codex CLI
|
|
23
|
+
- **Gemini** - Google Gemini CLI
|
|
24
|
+
- **Other** - Other MCP-compatible tools
|
|
25
|
+
|
|
26
|
+
### 3) Automatic Configuration (Optional):
|
|
27
|
+
|
|
28
|
+
The installer supports **automatic configuration** for compatible MCP clients.
|
|
29
|
+
|
|
30
|
+
You'll be prompted during installation, or you can:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Automatically configure without prompting
|
|
34
|
+
npx @abert/abert-test-mcp --client claude --auto-config
|
|
35
|
+
|
|
36
|
+
# Skip automatic configuration
|
|
37
|
+
npx @abert/abert-test-mcp --client claude --no-auto-config
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 4) Manual Configuration (If Needed):
|
|
41
|
+
|
|
42
|
+
If you skip automatic configuration, detailed setup instructions will be displayed.
|
|
43
|
+
|
|
44
|
+
#### Example Configuration:
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"abert-test-mcp": {
|
|
49
|
+
"command": "node",
|
|
50
|
+
"args": ["/Users/your-home-dir/.abert-test-mcp/bundle.js"]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Usage
|
|
57
|
+
|
|
58
|
+
### Commands
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Default installation (same as 'install')
|
|
62
|
+
npx @abert/abert-test-mcp
|
|
63
|
+
|
|
64
|
+
# Explicit install command
|
|
65
|
+
npx @abert/abert-test-mcp install
|
|
66
|
+
|
|
67
|
+
# Force reinstallation (even if up to date)
|
|
68
|
+
npx @abert/abert-test-mcp install --force
|
|
69
|
+
|
|
70
|
+
# Check installation status
|
|
71
|
+
npx @abert/abert-test-mcp status
|
|
72
|
+
|
|
73
|
+
# Uninstall abert-test-mcp
|
|
74
|
+
npx @abert/abert-test-mcp uninstall
|
|
75
|
+
|
|
76
|
+
# Enable verbose logging for any command
|
|
77
|
+
npx @abert/abert-test-mcp install --verbose
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Options
|
|
81
|
+
|
|
82
|
+
- `--client, -c <client>`: Specify MCP client to configure (claude, claude-code, codex, gemini, other)
|
|
83
|
+
- `--auto-config`: Automatically configure the MCP client without prompting (for supported clients)
|
|
84
|
+
- `--no-auto-config`: Skip automatic configuration prompt
|
|
85
|
+
- `--verbose, -v`: Enable detailed logging output
|
|
86
|
+
- `--force, -f`: Force reinstallation even if already up to date
|
|
87
|
+
- `--help, -h`: Show help information
|
|
88
|
+
|
|
89
|
+
### Supported MCP Clients
|
|
90
|
+
|
|
91
|
+
| Client | Value | Description | Auto-Config |
|
|
92
|
+
|------|-------|-------------|-------------|
|
|
93
|
+
| Claude Desktop | `claude` | Claude Desktop application | ✅ |
|
|
94
|
+
| Claude Code | `claude-code` | Claude Code CLI tool | ✅ |
|
|
95
|
+
| Codex CLI | `codex` | OpenAI Codex CLI tool | ✅ |
|
|
96
|
+
| Gemini CLI | `gemini` | Google Gemini CLI tool | ✅ |
|
|
97
|
+
| Other | `other` | Other stdio-compatible MCP clients | Manual only |
|
|
98
|
+
|
|
99
|
+
### File Locations
|
|
100
|
+
|
|
101
|
+
- **Installation Directory**: `~/.abert-test-mcp/`
|
|
102
|
+
- **Logs**: Displayed in terminal (use `--verbose` for detailed logs)
|
|
103
|
+
|
|
104
|
+
## Troubleshooting
|
|
105
|
+
|
|
106
|
+
### Common Issues
|
|
107
|
+
|
|
108
|
+
**"Command not found" Error**
|
|
109
|
+
- Ensure npm is in your system PATH
|
|
110
|
+
- Try running `npm --version` to verify npm installation
|
|
111
|
+
|
|
112
|
+
**"Permission denied" Error**
|
|
113
|
+
- On macOS/Linux: Check file permissions in the installation directory
|
|
114
|
+
- On Windows: Try running as administrator
|
|
115
|
+
|
|
116
|
+
**"Module not found" Error**
|
|
117
|
+
- Re-run the installer to download the latest version
|
|
118
|
+
- Use `--force` flag to force reinstallation
|
|
119
|
+
|
|
120
|
+
**Network Issues**
|
|
121
|
+
- Check your firewall and proxy settings
|
|
122
|
+
|
|
123
|
+
### Debug Mode
|
|
124
|
+
|
|
125
|
+
For detailed troubleshooting information, run with verbose logging:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
npx @abert/abert-test-mcp install --verbose
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Getting Help
|
|
132
|
+
|
|
133
|
+
1. Check the status of your installation:
|
|
134
|
+
```bash
|
|
135
|
+
npx @abert/abert-test-mcp status
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
2. View detailed logs with `--verbose` flag
|
|
139
|
+
|
|
140
|
+
3. For additional support, visit: [GitHub Issues](https://github.com/coinbase/abert-test-mcp/issues)
|
|
141
|
+
|
|
142
|
+
## Security
|
|
143
|
+
|
|
144
|
+
The Coinbase team takes security seriously. Please do not file a public ticket discussing a potential vulnerability. Please report your findings through our [HackerOne](https://hackerone.com/coinbase) program.
|
|
145
|
+
|
|
146
|
+
For more information, see our [Security Policy](SECURITY.md).
|
|
147
|
+
|
|
148
|
+
## License
|
|
149
|
+
|
|
150
|
+
Licensed under the Apache License, Version 2.0. See the [LICENSE](LICENSE) file for details.
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
**Note**: This installer is designed for the abert-test-mcp project and supports multiple MCP clients. For other MCP servers, please refer to their respective installation instructions.
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
|
|
6
|
+
const distPath = path.join(__dirname, '..', 'dist', 'cli.js');
|
|
7
|
+
|
|
8
|
+
if (fs.existsSync(distPath)) {
|
|
9
|
+
require(distPath);
|
|
10
|
+
} else {
|
|
11
|
+
console.error('Error: Compiled JavaScript files not found.');
|
|
12
|
+
console.error('Please run "npm run build" to compile the TypeScript source code.');
|
|
13
|
+
process.exit(1);
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configService.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/services/configService.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const configService_1 = require("../../services/configService");
|
|
7
|
+
const logger_1 = require("../../utils/logger");
|
|
8
|
+
const pathUtils_1 = require("../../utils/pathUtils");
|
|
9
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
10
|
+
const os_1 = __importDefault(require("os"));
|
|
11
|
+
// Mock dependencies
|
|
12
|
+
jest.mock('../../utils/logger');
|
|
13
|
+
jest.mock('fs-extra');
|
|
14
|
+
jest.mock('os');
|
|
15
|
+
jest.mock('../../utils/pathUtils');
|
|
16
|
+
describe('ConfigService', () => {
|
|
17
|
+
let configService;
|
|
18
|
+
let mockLogger;
|
|
19
|
+
let originalPlatform;
|
|
20
|
+
beforeAll(() => {
|
|
21
|
+
// Save original platform
|
|
22
|
+
originalPlatform = process.platform;
|
|
23
|
+
});
|
|
24
|
+
afterAll(() => {
|
|
25
|
+
// Restore original platform
|
|
26
|
+
Object.defineProperty(process, 'platform', {
|
|
27
|
+
value: originalPlatform,
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
jest.clearAllMocks();
|
|
32
|
+
// Mock process.platform to darwin for all tests (unless overridden)
|
|
33
|
+
Object.defineProperty(process, 'platform', {
|
|
34
|
+
value: 'darwin',
|
|
35
|
+
configurable: true,
|
|
36
|
+
});
|
|
37
|
+
// Mock os module
|
|
38
|
+
os_1.default.homedir.mockReturnValue('/home/testuser');
|
|
39
|
+
os_1.default.platform.mockReturnValue('darwin');
|
|
40
|
+
// Mock PathUtils.getNodeExecutable to return a consistent value
|
|
41
|
+
pathUtils_1.PathUtils.getNodeExecutable.mockReturnValue('/usr/bin/node');
|
|
42
|
+
mockLogger = new logger_1.Logger();
|
|
43
|
+
configService = new configService_1.ConfigService(mockLogger);
|
|
44
|
+
});
|
|
45
|
+
describe('validateConfig', () => {
|
|
46
|
+
it('should return false for null/undefined config', () => {
|
|
47
|
+
expect(configService.validateConfig(null)).toBe(false);
|
|
48
|
+
expect(configService.validateConfig(undefined)).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
it('should return false for non-object config', () => {
|
|
51
|
+
expect(configService.validateConfig('invalid')).toBe(false);
|
|
52
|
+
expect(configService.validateConfig(123)).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('should return false for config without mcpServers', () => {
|
|
55
|
+
const config = {};
|
|
56
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it('should return false for config with non-object mcpServers', () => {
|
|
59
|
+
const config = { mcpServers: 'invalid' };
|
|
60
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
61
|
+
});
|
|
62
|
+
it('should return true for valid config with empty mcpServers', () => {
|
|
63
|
+
const config = {
|
|
64
|
+
mcpServers: {},
|
|
65
|
+
};
|
|
66
|
+
expect(configService.validateConfig(config)).toBe(true);
|
|
67
|
+
});
|
|
68
|
+
it('should return false for server config without command', () => {
|
|
69
|
+
const config = {
|
|
70
|
+
mcpServers: {
|
|
71
|
+
'test-server': {
|
|
72
|
+
args: [],
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
it('should return false for server config with non-string command', () => {
|
|
79
|
+
const config = {
|
|
80
|
+
mcpServers: {
|
|
81
|
+
'test-server': {
|
|
82
|
+
command: 123,
|
|
83
|
+
args: [],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it('should return false for server config without args array', () => {
|
|
90
|
+
const config = {
|
|
91
|
+
mcpServers: {
|
|
92
|
+
'test-server': {
|
|
93
|
+
command: 'node',
|
|
94
|
+
args: 'invalid',
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
it('should return false for server config with non-object env', () => {
|
|
101
|
+
const config = {
|
|
102
|
+
mcpServers: {
|
|
103
|
+
'test-server': {
|
|
104
|
+
command: 'node',
|
|
105
|
+
args: [],
|
|
106
|
+
env: 'invalid',
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
expect(configService.validateConfig(config)).toBe(false);
|
|
111
|
+
});
|
|
112
|
+
it('should return true for valid complete config', () => {
|
|
113
|
+
const config = {
|
|
114
|
+
mcpServers: {
|
|
115
|
+
'abert-test-mcp': {
|
|
116
|
+
command: 'node',
|
|
117
|
+
args: ['/path/to/bundle.js'],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
expect(configService.validateConfig(config)).toBe(true);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('supportsAutoFileConfig', () => {
|
|
125
|
+
it('should return true for Claude Desktop', () => {
|
|
126
|
+
expect(configService.supportsAutoFileConfig('claude')).toBe(true);
|
|
127
|
+
});
|
|
128
|
+
it('should return false for CLI-based clients', () => {
|
|
129
|
+
expect(configService.supportsAutoFileConfig('claude-code')).toBe(false);
|
|
130
|
+
expect(configService.supportsAutoFileConfig('codex')).toBe(false);
|
|
131
|
+
expect(configService.supportsAutoFileConfig('gemini')).toBe(false);
|
|
132
|
+
});
|
|
133
|
+
it('should return false for other clients', () => {
|
|
134
|
+
expect(configService.supportsAutoFileConfig('other')).toBe(false);
|
|
135
|
+
});
|
|
136
|
+
it('should return false for invalid clients', () => {
|
|
137
|
+
expect(configService.supportsAutoFileConfig('invalid')).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('configFileExists', () => {
|
|
141
|
+
it('should return true if config file exists', async () => {
|
|
142
|
+
fs_extra_1.default.pathExists.mockResolvedValue(true);
|
|
143
|
+
const result = await configService.configFileExists('claude');
|
|
144
|
+
expect(result).toBe(true);
|
|
145
|
+
expect(fs_extra_1.default.pathExists).toHaveBeenCalled();
|
|
146
|
+
});
|
|
147
|
+
it('should return false if config file does not exist', async () => {
|
|
148
|
+
fs_extra_1.default.pathExists.mockResolvedValue(false);
|
|
149
|
+
const result = await configService.configFileExists('claude');
|
|
150
|
+
expect(result).toBe(false);
|
|
151
|
+
});
|
|
152
|
+
it('should return false for clients without config path', async () => {
|
|
153
|
+
const result = await configService.configFileExists('other');
|
|
154
|
+
expect(result).toBe(false);
|
|
155
|
+
expect(fs_extra_1.default.pathExists).not.toHaveBeenCalled();
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('readConfigFile', () => {
|
|
159
|
+
it('should read and parse existing config file', async () => {
|
|
160
|
+
const mockConfig = {
|
|
161
|
+
mcpServers: {
|
|
162
|
+
'existing-server': {
|
|
163
|
+
command: 'node',
|
|
164
|
+
args: ['server.js'],
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
fs_extra_1.default.pathExists.mockResolvedValue(true);
|
|
169
|
+
fs_extra_1.default.readFile.mockResolvedValue(JSON.stringify(mockConfig));
|
|
170
|
+
const result = await configService.readConfigFile('claude');
|
|
171
|
+
expect(result).toEqual(mockConfig);
|
|
172
|
+
expect(fs_extra_1.default.readFile).toHaveBeenCalledWith(expect.any(String), 'utf-8');
|
|
173
|
+
});
|
|
174
|
+
it('should return null if config file does not exist', async () => {
|
|
175
|
+
fs_extra_1.default.pathExists.mockResolvedValue(false);
|
|
176
|
+
const result = await configService.readConfigFile('claude');
|
|
177
|
+
expect(result).toBe(null);
|
|
178
|
+
expect(fs_extra_1.default.readFile).not.toHaveBeenCalled();
|
|
179
|
+
});
|
|
180
|
+
it('should return null if config path is not available', async () => {
|
|
181
|
+
const result = await configService.readConfigFile('other');
|
|
182
|
+
expect(result).toBe(null);
|
|
183
|
+
});
|
|
184
|
+
it('should return null on read error', async () => {
|
|
185
|
+
fs_extra_1.default.pathExists.mockResolvedValue(true);
|
|
186
|
+
fs_extra_1.default.readFile.mockRejectedValue(new Error('Read error'));
|
|
187
|
+
const result = await configService.readConfigFile('claude');
|
|
188
|
+
expect(result).toBe(null);
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
describe('autoConfigureFile', () => {
|
|
192
|
+
const mockInstallPath = '/home/testuser/.abert-test-mcp';
|
|
193
|
+
it('should create new config file if it does not exist', async () => {
|
|
194
|
+
fs_extra_1.default.pathExists.mockResolvedValue(false);
|
|
195
|
+
fs_extra_1.default.ensureDir.mockResolvedValue(undefined);
|
|
196
|
+
fs_extra_1.default.writeFile.mockResolvedValue(undefined);
|
|
197
|
+
const result = await configService.autoConfigureFile('claude', mockInstallPath);
|
|
198
|
+
expect(result).toBe(true);
|
|
199
|
+
expect(fs_extra_1.default.ensureDir).toHaveBeenCalled();
|
|
200
|
+
expect(fs_extra_1.default.writeFile).toHaveBeenCalledWith(expect.any(String), expect.stringContaining('abert-test-mcp'), 'utf-8');
|
|
201
|
+
});
|
|
202
|
+
it('should merge with existing config file', async () => {
|
|
203
|
+
const existingConfig = {
|
|
204
|
+
mcpServers: {
|
|
205
|
+
'existing-server': {
|
|
206
|
+
command: 'node',
|
|
207
|
+
args: ['server.js'],
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
fs_extra_1.default.pathExists.mockResolvedValue(true);
|
|
212
|
+
fs_extra_1.default.readFile.mockResolvedValue(JSON.stringify(existingConfig));
|
|
213
|
+
fs_extra_1.default.ensureDir.mockResolvedValue(undefined);
|
|
214
|
+
fs_extra_1.default.writeFile.mockResolvedValue(undefined);
|
|
215
|
+
const result = await configService.autoConfigureFile('claude', mockInstallPath);
|
|
216
|
+
expect(result).toBe(true);
|
|
217
|
+
const writeCall = fs_extra_1.default.writeFile.mock.calls[0];
|
|
218
|
+
const writtenConfig = JSON.parse(writeCall[1]);
|
|
219
|
+
expect(writtenConfig.mcpServers).toHaveProperty('existing-server');
|
|
220
|
+
expect(writtenConfig.mcpServers).toHaveProperty('abert-test-mcp');
|
|
221
|
+
});
|
|
222
|
+
it('should create backup for malformed config file', async () => {
|
|
223
|
+
fs_extra_1.default.pathExists.mockResolvedValue(true);
|
|
224
|
+
fs_extra_1.default.readFile.mockResolvedValue('invalid json');
|
|
225
|
+
fs_extra_1.default.copy.mockResolvedValue(undefined);
|
|
226
|
+
fs_extra_1.default.ensureDir.mockResolvedValue(undefined);
|
|
227
|
+
fs_extra_1.default.writeFile.mockResolvedValue(undefined);
|
|
228
|
+
const result = await configService.autoConfigureFile('claude', mockInstallPath);
|
|
229
|
+
expect(result).toBe(true);
|
|
230
|
+
expect(fs_extra_1.default.copy).toHaveBeenCalledWith(expect.any(String), expect.stringContaining('.backup.'));
|
|
231
|
+
});
|
|
232
|
+
it('should return false for CLI-based clients', async () => {
|
|
233
|
+
const result = await configService.autoConfigureFile('claude-code', mockInstallPath);
|
|
234
|
+
expect(result).toBe(false);
|
|
235
|
+
expect(fs_extra_1.default.writeFile).not.toHaveBeenCalled();
|
|
236
|
+
});
|
|
237
|
+
it('should return false if config path is not available', async () => {
|
|
238
|
+
// Mock process.platform to return 'linux' (Claude Desktop not available on Linux)
|
|
239
|
+
Object.defineProperty(process, 'platform', {
|
|
240
|
+
value: 'linux',
|
|
241
|
+
configurable: true,
|
|
242
|
+
});
|
|
243
|
+
const result = await configService.autoConfigureFile('claude', mockInstallPath);
|
|
244
|
+
expect(result).toBe(false);
|
|
245
|
+
expect(fs_extra_1.default.writeFile).not.toHaveBeenCalled();
|
|
246
|
+
// Platform will be reset in beforeEach for next test
|
|
247
|
+
});
|
|
248
|
+
it('should return false on write error', async () => {
|
|
249
|
+
fs_extra_1.default.pathExists.mockResolvedValue(false);
|
|
250
|
+
fs_extra_1.default.ensureDir.mockResolvedValue(undefined);
|
|
251
|
+
fs_extra_1.default.writeFile.mockRejectedValue(new Error('Write error'));
|
|
252
|
+
const result = await configService.autoConfigureFile('claude', mockInstallPath);
|
|
253
|
+
expect(result).toBe(false);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=configService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configService.test.js","sourceRoot":"","sources":["../../../src/__tests__/services/configService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUtils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/fileUtils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
7
|
+
const fileUtils_1 = require("../../utils/fileUtils");
|
|
8
|
+
const logger_1 = require("../../utils/logger");
|
|
9
|
+
// Mock fs-extra
|
|
10
|
+
jest.mock('fs-extra');
|
|
11
|
+
jest.mock('../../utils/logger');
|
|
12
|
+
const mockFs = fs_extra_1.default;
|
|
13
|
+
describe('FileUtils', () => {
|
|
14
|
+
let fileUtils;
|
|
15
|
+
let mockLogger;
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
jest.resetAllMocks();
|
|
18
|
+
mockLogger = new logger_1.Logger();
|
|
19
|
+
fileUtils = new fileUtils_1.FileUtils(mockLogger);
|
|
20
|
+
});
|
|
21
|
+
describe('exists', () => {
|
|
22
|
+
it('should return true when file exists', async () => {
|
|
23
|
+
mockFs.access.mockImplementation(() => Promise.resolve());
|
|
24
|
+
const result = await fileUtils.exists('/path/to/file');
|
|
25
|
+
expect(result).toBe(true);
|
|
26
|
+
expect(mockFs.access).toHaveBeenCalledWith('/path/to/file');
|
|
27
|
+
});
|
|
28
|
+
it('should return false when file does not exist', async () => {
|
|
29
|
+
mockFs.access.mockImplementation(() => Promise.reject(new Error('File not found')));
|
|
30
|
+
const result = await fileUtils.exists('/path/to/nonexistent');
|
|
31
|
+
expect(result).toBe(false);
|
|
32
|
+
expect(mockFs.access).toHaveBeenCalledWith('/path/to/nonexistent');
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
describe('ensureDir', () => {
|
|
36
|
+
it('should create directory successfully', async () => {
|
|
37
|
+
mockFs.ensureDir.mockImplementation(() => Promise.resolve());
|
|
38
|
+
await fileUtils.ensureDir('/path/to/dir');
|
|
39
|
+
expect(mockFs.ensureDir).toHaveBeenCalledWith('/path/to/dir');
|
|
40
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Ensured directory exists: /path/to/dir');
|
|
41
|
+
});
|
|
42
|
+
it('should throw error when directory creation fails', async () => {
|
|
43
|
+
const error = new Error('Permission denied');
|
|
44
|
+
mockFs.ensureDir.mockImplementation(() => Promise.reject(error));
|
|
45
|
+
await expect(fileUtils.ensureDir('/path/to/dir')).rejects.toThrow('Failed to create directory /path/to/dir: Permission denied');
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
describe('removeDir', () => {
|
|
49
|
+
it('should remove existing directory', async () => {
|
|
50
|
+
mockFs.access.mockImplementation(() => Promise.resolve()); // exists returns true
|
|
51
|
+
mockFs.remove.mockImplementation(() => Promise.resolve());
|
|
52
|
+
await fileUtils.removeDir('/path/to/dir');
|
|
53
|
+
expect(mockFs.remove).toHaveBeenCalledWith('/path/to/dir');
|
|
54
|
+
expect(mockLogger.debug).toHaveBeenCalledWith('Removed directory: /path/to/dir');
|
|
55
|
+
});
|
|
56
|
+
it('should not remove non-existent directory', async () => {
|
|
57
|
+
mockFs.access.mockImplementation(() => Promise.reject(new Error('Not found'))); // exists returns false
|
|
58
|
+
await fileUtils.removeDir('/path/to/nonexistent');
|
|
59
|
+
expect(mockFs.remove).not.toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
it('should throw error when directory removal fails', async () => {
|
|
62
|
+
mockFs.access.mockImplementation(() => Promise.resolve()); // exists returns true
|
|
63
|
+
const error = new Error('Permission denied');
|
|
64
|
+
mockFs.remove.mockImplementation(() => Promise.reject(error));
|
|
65
|
+
await expect(fileUtils.removeDir('/path/to/dir')).rejects.toThrow('Failed to remove directory /path/to/dir: Permission denied');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('readJsonFile', () => {
|
|
69
|
+
it('should read and parse JSON file successfully', async () => {
|
|
70
|
+
const mockData = { test: 'data' };
|
|
71
|
+
mockFs.readFile.mockImplementation(() => Promise.resolve(JSON.stringify(mockData)));
|
|
72
|
+
const result = await fileUtils.readJsonFile('/path/to/file.json');
|
|
73
|
+
expect(result).toEqual(mockData);
|
|
74
|
+
expect(mockFs.readFile).toHaveBeenCalledWith('/path/to/file.json', 'utf8');
|
|
75
|
+
});
|
|
76
|
+
it('should throw error for invalid JSON', async () => {
|
|
77
|
+
mockFs.readFile.mockImplementation(() => Promise.resolve('invalid json'));
|
|
78
|
+
await expect(fileUtils.readJsonFile('/path/to/file.json')).rejects.toThrow(/Failed to read JSON file/);
|
|
79
|
+
});
|
|
80
|
+
it('should throw error when file read fails', async () => {
|
|
81
|
+
mockFs.readFile.mockImplementation(() => Promise.reject(new Error('File not found')));
|
|
82
|
+
await expect(fileUtils.readJsonFile('/path/to/file.json')).rejects.toThrow(/Failed to read JSON file/);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=fileUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUtils.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/fileUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpUtils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/httpUtils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const axios_1 = __importDefault(require("axios"));
|
|
7
|
+
const httpUtils_1 = require("../../utils/httpUtils");
|
|
8
|
+
const logger_1 = require("../../utils/logger");
|
|
9
|
+
// Mock dependencies
|
|
10
|
+
jest.mock('axios');
|
|
11
|
+
jest.mock('fs-extra');
|
|
12
|
+
jest.mock('../../utils/logger');
|
|
13
|
+
const mockAxios = axios_1.default;
|
|
14
|
+
describe('HttpUtils', () => {
|
|
15
|
+
let httpUtils;
|
|
16
|
+
let mockLogger;
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
jest.resetAllMocks();
|
|
19
|
+
mockLogger = new logger_1.Logger();
|
|
20
|
+
httpUtils = new httpUtils_1.HttpUtils(mockLogger);
|
|
21
|
+
});
|
|
22
|
+
describe('get', () => {
|
|
23
|
+
it('should make successful GET request', async () => {
|
|
24
|
+
const mockData = { message: 'success' };
|
|
25
|
+
const mockResponse = {
|
|
26
|
+
data: mockData,
|
|
27
|
+
status: 200,
|
|
28
|
+
statusText: 'OK',
|
|
29
|
+
headers: {},
|
|
30
|
+
config: {},
|
|
31
|
+
};
|
|
32
|
+
mockAxios.get.mockResolvedValueOnce(mockResponse);
|
|
33
|
+
const result = await httpUtils.get('https://example.com/api');
|
|
34
|
+
expect(result).toEqual(mockResponse);
|
|
35
|
+
expect(mockAxios.get).toHaveBeenCalledWith('https://example.com/api', expect.any(Object));
|
|
36
|
+
});
|
|
37
|
+
it('should handle network errors with retry', async () => {
|
|
38
|
+
const error = new Error('Network error');
|
|
39
|
+
mockAxios.get.mockRejectedValueOnce(error);
|
|
40
|
+
mockAxios.get.mockRejectedValueOnce(error);
|
|
41
|
+
const mockResponse = { data: 'success', status: 200 };
|
|
42
|
+
mockAxios.get.mockResolvedValueOnce(mockResponse);
|
|
43
|
+
const result = await httpUtils.get('https://example.com/api');
|
|
44
|
+
expect(result).toEqual(mockResponse);
|
|
45
|
+
expect(mockAxios.get).toHaveBeenCalledTimes(3); // 2 failures + 1 success
|
|
46
|
+
});
|
|
47
|
+
it('should fail after exhausting retries', async () => {
|
|
48
|
+
const error = new Error('Network error');
|
|
49
|
+
mockAxios.get.mockRejectedValue(error);
|
|
50
|
+
await expect(httpUtils.get('https://example.com/api')).rejects.toThrow('Network error');
|
|
51
|
+
expect(mockAxios.get).toHaveBeenCalledTimes(3); // Default retry count
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
describe('downloadFile', () => {
|
|
55
|
+
it('should handle download errors', async () => {
|
|
56
|
+
const error = new Error('Download failed');
|
|
57
|
+
mockAxios.get.mockRejectedValue(error); // Reject all calls
|
|
58
|
+
await expect(httpUtils.downloadFile('https://example.com/file.zip', '/local/path/file.zip')).rejects.toThrow('Download failed');
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=httpUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpUtils.test.js","sourceRoot":"","sources":["../../../src/__tests__/utils/httpUtils.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processUtils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/processUtils.test.ts"],"names":[],"mappings":""}
|