@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.
Files changed (72) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +154 -0
  3. package/bin/cli.js +14 -0
  4. package/dist/__tests__/services/configService.test.d.ts +2 -0
  5. package/dist/__tests__/services/configService.test.d.ts.map +1 -0
  6. package/dist/__tests__/services/configService.test.js +257 -0
  7. package/dist/__tests__/services/configService.test.js.map +1 -0
  8. package/dist/__tests__/utils/fileUtils.test.d.ts +2 -0
  9. package/dist/__tests__/utils/fileUtils.test.d.ts.map +1 -0
  10. package/dist/__tests__/utils/fileUtils.test.js +86 -0
  11. package/dist/__tests__/utils/fileUtils.test.js.map +1 -0
  12. package/dist/__tests__/utils/httpUtils.test.d.ts +2 -0
  13. package/dist/__tests__/utils/httpUtils.test.d.ts.map +1 -0
  14. package/dist/__tests__/utils/httpUtils.test.js +62 -0
  15. package/dist/__tests__/utils/httpUtils.test.js.map +1 -0
  16. package/dist/__tests__/utils/processUtils.test.d.ts +2 -0
  17. package/dist/__tests__/utils/processUtils.test.d.ts.map +1 -0
  18. package/dist/__tests__/utils/processUtils.test.js +209 -0
  19. package/dist/__tests__/utils/processUtils.test.js.map +1 -0
  20. package/dist/cli.d.ts +3 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +110 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/constants.d.ts +2 -0
  25. package/dist/constants.d.ts.map +1 -0
  26. package/dist/constants.js +6 -0
  27. package/dist/constants.js.map +1 -0
  28. package/dist/installer.d.ts +24 -0
  29. package/dist/installer.d.ts.map +1 -0
  30. package/dist/installer.js +394 -0
  31. package/dist/installer.js.map +1 -0
  32. package/dist/services/configService.d.ts +30 -0
  33. package/dist/services/configService.d.ts.map +1 -0
  34. package/dist/services/configService.js +347 -0
  35. package/dist/services/configService.js.map +1 -0
  36. package/dist/services/downloadService.d.ts +18 -0
  37. package/dist/services/downloadService.d.ts.map +1 -0
  38. package/dist/services/downloadService.js +200 -0
  39. package/dist/services/downloadService.js.map +1 -0
  40. package/dist/services/installService.d.ts +18 -0
  41. package/dist/services/installService.d.ts.map +1 -0
  42. package/dist/services/installService.js +181 -0
  43. package/dist/services/installService.js.map +1 -0
  44. package/dist/services/versionService.d.ts +18 -0
  45. package/dist/services/versionService.d.ts.map +1 -0
  46. package/dist/services/versionService.js +170 -0
  47. package/dist/services/versionService.js.map +1 -0
  48. package/dist/types/index.d.ts +63 -0
  49. package/dist/types/index.d.ts.map +1 -0
  50. package/dist/types/index.js +3 -0
  51. package/dist/types/index.js.map +1 -0
  52. package/dist/utils/fileUtils.d.ts +15 -0
  53. package/dist/utils/fileUtils.d.ts.map +1 -0
  54. package/dist/utils/fileUtils.js +89 -0
  55. package/dist/utils/fileUtils.js.map +1 -0
  56. package/dist/utils/httpUtils.d.ts +20 -0
  57. package/dist/utils/httpUtils.d.ts.map +1 -0
  58. package/dist/utils/httpUtils.js +148 -0
  59. package/dist/utils/httpUtils.js.map +1 -0
  60. package/dist/utils/logger.d.ts +15 -0
  61. package/dist/utils/logger.d.ts.map +1 -0
  62. package/dist/utils/logger.js +55 -0
  63. package/dist/utils/logger.js.map +1 -0
  64. package/dist/utils/pathUtils.d.ts +8 -0
  65. package/dist/utils/pathUtils.d.ts.map +1 -0
  66. package/dist/utils/pathUtils.js +35 -0
  67. package/dist/utils/pathUtils.js.map +1 -0
  68. package/dist/utils/processUtils.d.ts +25 -0
  69. package/dist/utils/processUtils.d.ts.map +1 -0
  70. package/dist/utils/processUtils.js +139 -0
  71. package/dist/utils/processUtils.js.map +1 -0
  72. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=configService.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fileUtils.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=httpUtils.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=processUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processUtils.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/utils/processUtils.test.ts"],"names":[],"mappings":""}