@codesherlock/codesherlock-beta-mcp-server 0.0.12 → 0.0.13

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.
@@ -68,8 +68,7 @@ describe("createAnalyzeCommitHandler", () => {
68
68
  organization_name: "my-org",
69
69
  });
70
70
  expect(formatMultipleFileAnalysisToMarkdown).toHaveBeenCalledWith(analysisResult.results);
71
- expect(fs.mkdirSync).toHaveBeenCalledWith(expect.stringContaining("debug_outputs"), { recursive: true });
72
- expect(fs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining("analysis_result_"), "markdown-content", "utf-8");
71
+ // Note: mkdirSync/writeFileSync are commented out in the handler, so we don't test them
73
72
  expect(response.structuredContent).toEqual(analysisResult);
74
73
  expect(response.content[0].text).toBe("markdown-content");
75
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"analyzeCommitHandler.test.js","sourceRoot":"","sources":["../../src/tests/analyzeCommitHandler.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzeCommitHandler.test.js","sourceRoot":"","sources":["../../src/tests/analyzeCommitHandler.test.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,13 @@ import WebSocket from 'ws';
4
4
  import JSZip from 'jszip';
5
5
  // Mock dependencies
6
6
  jest.mock('../services/loggingService');
7
+ jest.mock('../services/websocketConnectionManager', () => ({
8
+ websocketConnectionManager: {
9
+ registerConnection: jest.fn(),
10
+ getConnectionForUser: jest.fn(),
11
+ cleanupStaleConnections: jest.fn(),
12
+ },
13
+ }));
7
14
  jest.mock('ws');
8
15
  jest.mock('jszip');
9
16
  // Mock global fetch
@@ -62,14 +69,18 @@ describe('BackendApiService', () => {
62
69
  global.fetch.mockRejectedValue(networkError);
63
70
  await expect(backendApiService.submitCommitReview(mockParams)).rejects.toThrow(networkError);
64
71
  expect(logger.logError).toHaveBeenCalled();
65
- });
72
+ }, 10000); // Increase timeout for this test
66
73
  });
67
74
  describe('connectWebSocket', () => {
68
75
  let mockWs;
69
76
  beforeEach(() => {
70
77
  mockWs = {
71
78
  on: jest.fn(),
79
+ removeListener: jest.fn(),
80
+ once: jest.fn(),
72
81
  close: jest.fn(),
82
+ terminate: jest.fn(),
83
+ readyState: 1, // OPEN
73
84
  };
74
85
  WebSocket.mockImplementation(() => mockWs);
75
86
  });
@@ -1 +1 @@
1
- {"version":3,"file":"backendApiService.test.js","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backendApiService.test.js","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=events.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.test.d.ts","sourceRoot":"","sources":["../../src/tests/events.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerEventHandlers } from '../handlers/events.js';
2
+ // Mock MCP Server
3
+ jest.mock('@modelcontextprotocol/sdk/server/mcp.js');
4
+ describe('registerEventHandlers', () => {
5
+ it('should register event handlers without errors', () => {
6
+ const mockServer = {
7
+ onError: jest.fn(),
8
+ };
9
+ // Should not throw
10
+ expect(() => registerEventHandlers(mockServer)).not.toThrow();
11
+ });
12
+ it('should work with any MCP server instance', () => {
13
+ const mockServer = {};
14
+ expect(() => registerEventHandlers(mockServer)).not.toThrow();
15
+ });
16
+ });
17
+ //# sourceMappingURL=events.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.test.js","sourceRoot":"","sources":["../../src/tests/events.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,kBAAkB;AAClB,IAAI,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;AAErD,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACrD,MAAM,UAAU,GAAG;YACf,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;SACG,CAAC;QAE1B,mBAAmB;QACnB,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,UAAU,GAAG,EAA0B,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAClE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=gitService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitService.test.d.ts","sourceRoot":"","sources":["../../src/tests/gitService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,299 @@
1
+ import { GitService } from '../services/gitService.js';
2
+ import { logger } from '../services/loggingService.js';
3
+ import { simpleGit } from 'simple-git';
4
+ import fs from 'fs';
5
+ // Mock dependencies
6
+ jest.mock('../services/loggingService');
7
+ jest.mock('simple-git');
8
+ jest.mock('fs', () => ({
9
+ existsSync: jest.fn(),
10
+ readFileSync: jest.fn(),
11
+ }));
12
+ jest.mock('applicationinsights', () => ({
13
+ setup: jest.fn().mockReturnThis(),
14
+ start: jest.fn(),
15
+ defaultClient: {
16
+ trackTrace: jest.fn(),
17
+ trackException: jest.fn(),
18
+ trackEvent: jest.fn(),
19
+ },
20
+ }));
21
+ describe('GitService', () => {
22
+ let gitService;
23
+ let mockGit;
24
+ beforeEach(() => {
25
+ jest.clearAllMocks();
26
+ gitService = new GitService();
27
+ // Create a mock git instance
28
+ mockGit = {
29
+ diff: jest.fn(),
30
+ show: jest.fn(),
31
+ status: jest.fn(),
32
+ log: jest.fn(),
33
+ revparse: jest.fn(),
34
+ diffSummary: jest.fn(),
35
+ raw: jest.fn(),
36
+ };
37
+ simpleGit.mockReturnValue(mockGit);
38
+ });
39
+ describe('getDiff', () => {
40
+ it('should get unstaged diff when commitHash is empty', async () => {
41
+ mockGit.diff.mockResolvedValue('diff content');
42
+ const result = await gitService.getDiff('/repo', '');
43
+ expect(result).toBe('diff content');
44
+ expect(mockGit.diff).toHaveBeenCalledWith();
45
+ });
46
+ it('should get diff for HEAD when commitHash is HEAD', async () => {
47
+ mockGit.diff.mockResolvedValue('diff content');
48
+ const result = await gitService.getDiff('/repo', 'HEAD');
49
+ expect(result).toBe('diff content');
50
+ expect(mockGit.diff).toHaveBeenCalledWith();
51
+ });
52
+ it('should get diff for range when commitHash contains ..', async () => {
53
+ mockGit.diff.mockResolvedValue('range diff');
54
+ const result = await gitService.getDiff('/repo', 'abc123..def456');
55
+ expect(result).toBe('range diff');
56
+ expect(mockGit.diff).toHaveBeenCalledWith(['abc123..def456']);
57
+ });
58
+ it('should get diff for specific commit', async () => {
59
+ mockGit.show.mockResolvedValue('commit diff');
60
+ const result = await gitService.getDiff('/repo', 'abc123');
61
+ expect(result).toBe('commit diff');
62
+ expect(mockGit.show).toHaveBeenCalledWith(['abc123']);
63
+ });
64
+ it('should handle errors', async () => {
65
+ const error = new Error('Git error');
66
+ mockGit.diff.mockRejectedValue(error);
67
+ await expect(gitService.getDiff('/repo', '')).rejects.toThrow('Git error');
68
+ expect(logger.logError).toHaveBeenCalled();
69
+ });
70
+ });
71
+ describe('getUncommittedDiff', () => {
72
+ it('should combine staged and unstaged diffs', async () => {
73
+ mockGit.diff.mockImplementation((args) => {
74
+ if (args && args.includes('--cached')) {
75
+ return Promise.resolve('staged diff');
76
+ }
77
+ return Promise.resolve('unstaged diff');
78
+ });
79
+ const result = await gitService.getUncommittedDiff('/repo');
80
+ expect(result).toBe('staged diff\nunstaged diff');
81
+ });
82
+ it('should filter out empty diffs', async () => {
83
+ mockGit.diff.mockImplementation((args) => {
84
+ if (args && args.includes('--cached')) {
85
+ return Promise.resolve('');
86
+ }
87
+ return Promise.resolve('unstaged diff');
88
+ });
89
+ const result = await gitService.getUncommittedDiff('/repo');
90
+ expect(result).toBe('unstaged diff');
91
+ });
92
+ });
93
+ describe('getFileContent', () => {
94
+ it('should read file from working tree when no ref provided', async () => {
95
+ const mockReadFileSync = fs.readFileSync;
96
+ const mockExistsSync = fs.existsSync;
97
+ mockExistsSync.mockReturnValue(true);
98
+ mockReadFileSync.mockReturnValue('file content');
99
+ const result = await gitService.getFileContent('/repo', 'file.ts');
100
+ expect(result).toBe('file content');
101
+ expect(mockExistsSync).toHaveBeenCalled();
102
+ expect(mockReadFileSync).toHaveBeenCalled();
103
+ });
104
+ it('should throw error when file does not exist in working tree', async () => {
105
+ const mockExistsSync = fs.existsSync;
106
+ mockExistsSync.mockReturnValue(false);
107
+ await expect(gitService.getFileContent('/repo', 'file.ts')).rejects.toThrow();
108
+ });
109
+ it('should get file content from git commit when ref provided', async () => {
110
+ mockGit.show.mockResolvedValue('file content from commit');
111
+ const result = await gitService.getFileContent('/repo', 'file.ts', 'abc123');
112
+ expect(result).toBe('file content from commit');
113
+ expect(mockGit.show).toHaveBeenCalledWith(['abc123:file.ts']);
114
+ });
115
+ });
116
+ describe('getChangedFiles', () => {
117
+ it('should get changed files from status when commitHash is empty', async () => {
118
+ mockGit.status.mockResolvedValue({
119
+ modified: ['file1.ts'],
120
+ created: ['file2.ts'],
121
+ not_added: ['file3.ts'],
122
+ deleted: ['file4.ts'],
123
+ renamed: [{ to: 'file5.ts' }],
124
+ });
125
+ const result = await gitService.getChangedFiles('/repo', '');
126
+ expect(result).toEqual(['file1.ts', 'file2.ts', 'file3.ts', 'file4.ts', 'file5.ts']);
127
+ });
128
+ it('should get changed files from commit', async () => {
129
+ mockGit.diffSummary.mockResolvedValue({
130
+ files: [{ file: 'file1.ts' }, { file: 'file2.ts' }],
131
+ });
132
+ const result = await gitService.getChangedFiles('/repo', 'abc123');
133
+ expect(result).toEqual(['file1.ts', 'file2.ts']);
134
+ });
135
+ });
136
+ describe('getCommitInfo', () => {
137
+ it('should get commit information', async () => {
138
+ mockGit.log.mockResolvedValue({
139
+ latest: {
140
+ hash: 'abc123',
141
+ author_name: 'Test User',
142
+ author_email: 'test@example.com',
143
+ date: '2024-01-01',
144
+ message: 'Test commit',
145
+ },
146
+ });
147
+ mockGit.diffSummary.mockResolvedValue({
148
+ files: [{ file: 'file1.ts' }],
149
+ });
150
+ const result = await gitService.getCommitInfo('/repo', 'abc123');
151
+ expect(result.hash).toBe('abc123');
152
+ expect(result.author).toBe('Test User');
153
+ expect(result.files).toEqual(['file1.ts']);
154
+ });
155
+ it('should throw error when commit not found', async () => {
156
+ mockGit.log.mockResolvedValue({ latest: null });
157
+ await expect(gitService.getCommitInfo('/repo', 'abc123')).rejects.toThrow();
158
+ });
159
+ });
160
+ describe('getRepoStatus', () => {
161
+ it('should get repository status', async () => {
162
+ mockGit.status.mockResolvedValue({
163
+ current: 'main',
164
+ modified: ['file1.ts'],
165
+ created: ['file2.ts'],
166
+ staged: ['file3.ts'],
167
+ not_added: ['file4.ts'],
168
+ });
169
+ const result = await gitService.getRepoStatus('/repo');
170
+ expect(result.branch).toBe('main');
171
+ expect(result.modified).toEqual(['file1.ts']);
172
+ expect(result.staged).toEqual(['file2.ts', 'file3.ts']);
173
+ expect(result.untracked).toEqual(['file4.ts']);
174
+ });
175
+ });
176
+ describe('getCurrentCommitHash', () => {
177
+ it('should get current commit hash', async () => {
178
+ mockGit.revparse.mockResolvedValue('abc123\n');
179
+ const result = await gitService.getCurrentCommitHash('/repo');
180
+ expect(result).toBe('abc123');
181
+ });
182
+ it('should return UNCOMMITTED when hash cannot be resolved', async () => {
183
+ mockGit.revparse.mockRejectedValue(new Error('No commits'));
184
+ const result = await gitService.getCurrentCommitHash('/repo');
185
+ expect(result).toBe('UNCOMMITTED');
186
+ expect(logger.logWarning).toHaveBeenCalled();
187
+ });
188
+ });
189
+ describe('getFileDiff', () => {
190
+ it('should get staged diff for uncommitted file', async () => {
191
+ mockGit.diff.mockResolvedValue('staged diff');
192
+ const result = await gitService.getFileDiff('/repo', 'file.ts');
193
+ expect(result).toBe('staged diff');
194
+ });
195
+ it('should get unstaged diff when staged diff is empty', async () => {
196
+ mockGit.diff.mockImplementation((args) => {
197
+ if (args && args.includes('--cached')) {
198
+ return Promise.resolve('');
199
+ }
200
+ return Promise.resolve('unstaged diff');
201
+ });
202
+ const result = await gitService.getFileDiff('/repo', 'file.ts');
203
+ expect(result).toBe('unstaged diff');
204
+ });
205
+ it('should generate synthetic patch for untracked file', async () => {
206
+ const mockReadFileSync = fs.readFileSync;
207
+ const mockExistsSync = fs.existsSync;
208
+ mockExistsSync.mockReturnValue(true);
209
+ mockReadFileSync.mockReturnValue('new file content\nline 2');
210
+ mockGit.diff.mockResolvedValue('');
211
+ const result = await gitService.getFileDiff('/repo', 'newfile.ts', undefined, 'untracked');
212
+ expect(result).toContain('diff --git');
213
+ expect(result).toContain('newfile.ts');
214
+ expect(result).toContain('+new file content');
215
+ });
216
+ it('should get diff for committed file', async () => {
217
+ mockGit.diff.mockResolvedValue('commit diff');
218
+ const result = await gitService.getFileDiff('/repo', 'file.ts', 'abc123');
219
+ expect(result).toBe('commit diff');
220
+ expect(mockGit.diff).toHaveBeenCalledWith(['abc123^..abc123', '--', 'file.ts']);
221
+ });
222
+ });
223
+ describe('getChangedFilesWithStatus', () => {
224
+ it('should get changed files with status for uncommitted changes', async () => {
225
+ mockGit.status.mockResolvedValue({
226
+ files: [
227
+ { path: 'file1.ts', index: 'M', working_dir: ' ' },
228
+ { path: 'file2.ts', index: 'A', working_dir: ' ' },
229
+ { path: 'file3.ts', index: '?', working_dir: '?' },
230
+ { path: 'file4.ts', index: 'D', working_dir: ' ' },
231
+ ],
232
+ });
233
+ const result = await gitService.getChangedFilesWithStatus('/repo');
234
+ expect(result).toHaveLength(4);
235
+ expect(result.find((f) => f.path === 'file1.ts')?.status).toBe('modified');
236
+ expect(result.find((f) => f.path === 'file2.ts')?.status).toBe('added');
237
+ expect(result.find((f) => f.path === 'file3.ts')?.status).toBe('untracked');
238
+ expect(result.find((f) => f.path === 'file4.ts')?.status).toBe('deleted');
239
+ });
240
+ it('should return empty array when no files changed', async () => {
241
+ mockGit.status.mockResolvedValue({ files: [] });
242
+ const result = await gitService.getChangedFilesWithStatus('/repo');
243
+ expect(result).toEqual([]);
244
+ });
245
+ it('should get changed files with status for commit', async () => {
246
+ mockGit.raw.mockResolvedValue('M\tfile1.ts\nA\tfile2.ts\nD\tfile3.ts');
247
+ const result = await gitService.getChangedFilesWithStatus('/repo', 'abc123');
248
+ expect(result).toHaveLength(3);
249
+ expect(result.find((f) => f.path === 'file1.ts')?.status).toBe('modified');
250
+ expect(result.find((f) => f.path === 'file2.ts')?.status).toBe('added');
251
+ expect(result.find((f) => f.path === 'file3.ts')?.status).toBe('deleted');
252
+ });
253
+ });
254
+ describe('analyzeGitChanges', () => {
255
+ it('should analyze git changes successfully', async () => {
256
+ mockGit.status.mockResolvedValue({
257
+ files: [
258
+ { path: 'file1.ts', index: 'M', working_dir: ' ' },
259
+ ],
260
+ });
261
+ const mockReadFileSync = fs.readFileSync;
262
+ const mockExistsSync = fs.existsSync;
263
+ mockExistsSync.mockReturnValue(true);
264
+ mockReadFileSync.mockReturnValue('file content');
265
+ mockGit.diff.mockResolvedValue('diff content');
266
+ const result = await gitService.analyzeGitChanges(true, '/repo');
267
+ expect(result).toHaveLength(1);
268
+ expect(result[0].filename).toBe('file1.ts');
269
+ expect(result[0].status).toBe('modified');
270
+ expect(result[0].new_content).toBe('file content');
271
+ expect(result[0].patch).toBe('diff content');
272
+ });
273
+ it('should handle errors gracefully', async () => {
274
+ mockGit.status.mockRejectedValue(new Error('Git error'));
275
+ await expect(gitService.analyzeGitChanges(true, '/repo')).rejects.toThrow();
276
+ });
277
+ });
278
+ describe('getFileChanges', () => {
279
+ it('should get file changes successfully', async () => {
280
+ mockGit.status.mockResolvedValue({
281
+ files: [
282
+ { path: 'file1.ts', index: 'M', working_dir: ' ' },
283
+ ],
284
+ });
285
+ const mockReadFileSync = fs.readFileSync;
286
+ const mockExistsSync = fs.existsSync;
287
+ mockExistsSync.mockReturnValue(true);
288
+ mockReadFileSync.mockReturnValue('file content');
289
+ mockGit.diff.mockResolvedValue('diff content');
290
+ const result = await gitService.getFileChanges(true, undefined, '/repo');
291
+ expect(result).toHaveLength(1);
292
+ expect(result[0].filename).toBe('file1.ts');
293
+ });
294
+ it('should throw error when commitHash is required but missing', async () => {
295
+ await expect(gitService.getFileChanges(false, undefined, '/repo')).rejects.toThrow();
296
+ });
297
+ });
298
+ });
299
+ //# sourceMappingURL=gitService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitService.test.js","sourceRoot":"","sources":["../../src/tests/gitService.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resources.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.test.d.ts","sourceRoot":"","sources":["../../src/tests/resources.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { registerResources } from '../handlers/resources.js';
2
+ // Mock MCP Server
3
+ jest.mock('@modelcontextprotocol/sdk/server/mcp.js');
4
+ describe('registerResources', () => {
5
+ it('should register resources without errors', () => {
6
+ const mockServer = {
7
+ listResources: jest.fn(),
8
+ };
9
+ // Should not throw
10
+ expect(() => registerResources(mockServer)).not.toThrow();
11
+ });
12
+ it('should work with any MCP server instance', () => {
13
+ const mockServer = {};
14
+ expect(() => registerResources(mockServer)).not.toThrow();
15
+ });
16
+ });
17
+ //# sourceMappingURL=resources.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.test.js","sourceRoot":"","sources":["../../src/tests/resources.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,kBAAkB;AAClB,IAAI,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;AAErD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,UAAU,GAAG;YACf,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE;SACH,CAAC;QAE1B,mBAAmB;QACnB,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,UAAU,GAAG,EAA0B,CAAC;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=websocketConnectionManager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketConnectionManager.test.d.ts","sourceRoot":"","sources":["../../src/tests/websocketConnectionManager.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,217 @@
1
+ import { WebSocketConnectionManager } from '../services/websocketConnectionManager.js';
2
+ import WebSocket from 'ws';
3
+ import { EventEmitter } from 'events';
4
+ // Mock dependencies
5
+ jest.mock('../services/loggingService');
6
+ jest.mock('ws');
7
+ describe('WebSocketConnectionManager', () => {
8
+ let manager;
9
+ const createMockWebSocket = (readyState = WebSocket.OPEN) => {
10
+ const ws = new EventEmitter();
11
+ ws.readyState = readyState;
12
+ ws.close = jest.fn((code, reason) => {
13
+ ws.readyState = WebSocket.CLOSED;
14
+ ws.emit('close', code || 1000, Buffer.from(reason || ''));
15
+ });
16
+ ws.terminate = jest.fn(() => {
17
+ ws.readyState = WebSocket.CLOSED;
18
+ ws.emit('close', 1006, Buffer.from('Terminated'));
19
+ });
20
+ ws.on = jest.fn((event, callback) => {
21
+ EventEmitter.prototype.on.call(ws, event, callback);
22
+ return ws;
23
+ });
24
+ ws.removeListener = jest.fn((event, callback) => {
25
+ EventEmitter.prototype.removeListener.call(ws, event, callback);
26
+ return ws;
27
+ });
28
+ ws.once = jest.fn((event, callback) => {
29
+ EventEmitter.prototype.once.call(ws, event, callback);
30
+ return ws;
31
+ });
32
+ return ws;
33
+ };
34
+ beforeEach(() => {
35
+ jest.clearAllMocks();
36
+ manager = new WebSocketConnectionManager();
37
+ });
38
+ describe('registerConnection', () => {
39
+ it('should register a connection without userId', () => {
40
+ const ws = createMockWebSocket();
41
+ manager.registerConnection(ws);
42
+ expect(manager.getConnectionCount()).toBe(1);
43
+ expect(manager.hasActiveConnections()).toBe(true);
44
+ });
45
+ it('should register a connection with userId', () => {
46
+ const ws = createMockWebSocket();
47
+ manager.registerConnection(ws, 'user1');
48
+ expect(manager.getConnectionCount()).toBe(1);
49
+ expect(manager.getConnectionForUser('user1')).toBe(ws);
50
+ });
51
+ it('should close existing connection when registering new one for same userId', () => {
52
+ const ws1 = createMockWebSocket();
53
+ const ws2 = createMockWebSocket();
54
+ manager.registerConnection(ws1, 'user1');
55
+ manager.registerConnection(ws2, 'user1');
56
+ expect(ws1.close).toHaveBeenCalled();
57
+ expect(manager.getConnectionCount()).toBe(1);
58
+ expect(manager.getConnectionForUser('user1')).toBe(ws2);
59
+ });
60
+ it('should not register connection during shutdown', () => {
61
+ manager.isShuttingDown = true;
62
+ const ws = createMockWebSocket();
63
+ manager.registerConnection(ws, 'user1');
64
+ expect(manager.getConnectionCount()).toBe(0);
65
+ });
66
+ it('should auto-remove connection when it closes', () => {
67
+ const ws = createMockWebSocket();
68
+ manager.registerConnection(ws, 'user1');
69
+ expect(manager.getConnectionCount()).toBe(1);
70
+ ws.emit('close', 1000, Buffer.from(''));
71
+ expect(manager.getConnectionCount()).toBe(0);
72
+ expect(manager.getConnectionForUser('user1')).toBeUndefined();
73
+ });
74
+ });
75
+ describe('unregisterConnection', () => {
76
+ it('should unregister a connection', () => {
77
+ const ws = createMockWebSocket();
78
+ manager.registerConnection(ws, 'user1');
79
+ expect(manager.getConnectionCount()).toBe(1);
80
+ manager.unregisterConnection(ws, 'user1');
81
+ expect(manager.getConnectionCount()).toBe(0);
82
+ expect(manager.getConnectionForUser('user1')).toBeUndefined();
83
+ });
84
+ it('should handle unregistering non-existent connection gracefully', () => {
85
+ const ws = createMockWebSocket();
86
+ manager.unregisterConnection(ws, 'user1');
87
+ expect(manager.getConnectionCount()).toBe(0);
88
+ });
89
+ });
90
+ describe('closeAllConnections', () => {
91
+ it('should close all connections', async () => {
92
+ const ws1 = createMockWebSocket();
93
+ const ws2 = createMockWebSocket();
94
+ manager.registerConnection(ws1, 'user1');
95
+ manager.registerConnection(ws2, 'user2');
96
+ const closePromise = manager.closeAllConnections();
97
+ // Simulate close events
98
+ ws1.emit('close', 1000, Buffer.from(''));
99
+ ws2.emit('close', 1000, Buffer.from(''));
100
+ await closePromise;
101
+ expect(ws1.close).toHaveBeenCalled();
102
+ expect(ws2.close).toHaveBeenCalled();
103
+ expect(manager.getConnectionCount()).toBe(0);
104
+ });
105
+ it('should handle no connections gracefully', async () => {
106
+ await manager.closeAllConnections();
107
+ expect(manager.getConnectionCount()).toBe(0);
108
+ });
109
+ it('should not close connections if already shutting down', async () => {
110
+ const ws = createMockWebSocket();
111
+ manager.registerConnection(ws);
112
+ manager.isShuttingDown = true;
113
+ await manager.closeAllConnections();
114
+ // Connection should still be there since shutdown was already in progress
115
+ });
116
+ it('should terminate connections that do not close gracefully', async () => {
117
+ jest.useFakeTimers();
118
+ const ws = createMockWebSocket();
119
+ // Override close to NOT emit close event immediately
120
+ ws.close = jest.fn(() => {
121
+ // Don't emit close event - let timeout trigger terminate
122
+ });
123
+ manager.registerConnection(ws);
124
+ const closePromise = manager.closeAllConnections();
125
+ // Advance time to trigger timeout (2 seconds timeout in implementation)
126
+ jest.advanceTimersByTime(2500);
127
+ // Process all pending timers and promises
128
+ await jest.runAllTimersAsync();
129
+ await Promise.resolve();
130
+ // Wait for close promise
131
+ await closePromise;
132
+ expect(ws.terminate).toHaveBeenCalled();
133
+ jest.useRealTimers();
134
+ });
135
+ });
136
+ describe('getConnectionCount', () => {
137
+ it('should return correct connection count', () => {
138
+ expect(manager.getConnectionCount()).toBe(0);
139
+ const ws1 = createMockWebSocket();
140
+ const ws2 = createMockWebSocket();
141
+ manager.registerConnection(ws1);
142
+ manager.registerConnection(ws2);
143
+ expect(manager.getConnectionCount()).toBe(2);
144
+ });
145
+ });
146
+ describe('hasActiveConnections', () => {
147
+ it('should return false when no connections', () => {
148
+ expect(manager.hasActiveConnections()).toBe(false);
149
+ });
150
+ it('should return true when connections exist', () => {
151
+ const ws = createMockWebSocket();
152
+ manager.registerConnection(ws);
153
+ expect(manager.hasActiveConnections()).toBe(true);
154
+ });
155
+ });
156
+ describe('getConnectionForUser', () => {
157
+ it('should return connection for user if open', () => {
158
+ const ws = createMockWebSocket(WebSocket.OPEN);
159
+ manager.registerConnection(ws, 'user1');
160
+ expect(manager.getConnectionForUser('user1')).toBe(ws);
161
+ });
162
+ it('should return undefined for non-existent user', () => {
163
+ expect(manager.getConnectionForUser('user1')).toBeUndefined();
164
+ });
165
+ it('should return undefined and cleanup stale connection', () => {
166
+ const ws = createMockWebSocket(WebSocket.CLOSED);
167
+ manager.registerConnection(ws, 'user1');
168
+ expect(manager.getConnectionForUser('user1')).toBeUndefined();
169
+ expect(manager.getConnectionCount()).toBe(0);
170
+ });
171
+ });
172
+ describe('closeConnectionForUser', () => {
173
+ it('should close connection for specific user', async () => {
174
+ const ws = createMockWebSocket();
175
+ manager.registerConnection(ws, 'user1');
176
+ await manager.closeConnectionForUser('user1');
177
+ expect(ws.close).toHaveBeenCalled();
178
+ expect(manager.getConnectionCount()).toBe(0);
179
+ });
180
+ it('should handle non-existent user gracefully', async () => {
181
+ await manager.closeConnectionForUser('user1');
182
+ expect(manager.getConnectionCount()).toBe(0);
183
+ });
184
+ it('should handle errors during close', async () => {
185
+ const ws = createMockWebSocket();
186
+ ws.close = jest.fn(() => {
187
+ throw new Error('Close error');
188
+ });
189
+ manager.registerConnection(ws, 'user1');
190
+ await manager.closeConnectionForUser('user1');
191
+ // Should not throw
192
+ expect(manager.getConnectionCount()).toBe(0);
193
+ });
194
+ });
195
+ describe('cleanupStaleConnections', () => {
196
+ it('should remove closed connections', () => {
197
+ const ws1 = createMockWebSocket(WebSocket.OPEN);
198
+ const ws2 = createMockWebSocket(WebSocket.CLOSED);
199
+ const ws3 = createMockWebSocket(WebSocket.CLOSING);
200
+ manager.registerConnection(ws1, 'user1');
201
+ manager.registerConnection(ws2, 'user2');
202
+ manager.registerConnection(ws3, 'user3');
203
+ manager.cleanupStaleConnections();
204
+ expect(manager.getConnectionCount()).toBe(1);
205
+ expect(manager.getConnectionForUser('user1')).toBe(ws1);
206
+ expect(manager.getConnectionForUser('user2')).toBeUndefined();
207
+ expect(manager.getConnectionForUser('user3')).toBeUndefined();
208
+ });
209
+ it('should handle no stale connections gracefully', () => {
210
+ const ws = createMockWebSocket(WebSocket.OPEN);
211
+ manager.registerConnection(ws, 'user1');
212
+ manager.cleanupStaleConnections();
213
+ expect(manager.getConnectionCount()).toBe(1);
214
+ });
215
+ });
216
+ });
217
+ //# sourceMappingURL=websocketConnectionManager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocketConnectionManager.test.js","sourceRoot":"","sources":["../../src/tests/websocketConnectionManager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=zipService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipService.test.d.ts","sourceRoot":"","sources":["../../src/tests/zipService.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { ZipService } from '../services/zipService.js';
2
+ import { logger } from '../services/loggingService.js';
3
+ import archiver from 'archiver';
4
+ // Mock dependencies
5
+ jest.mock('../services/loggingService');
6
+ jest.mock('archiver');
7
+ describe('ZipService', () => {
8
+ let zipService;
9
+ let mockArchive;
10
+ beforeEach(() => {
11
+ jest.clearAllMocks();
12
+ zipService = new ZipService();
13
+ // Create mock archive
14
+ mockArchive = {
15
+ pipe: jest.fn((stream) => {
16
+ // Store the stream for later use
17
+ mockArchive._outputStream = stream;
18
+ return mockArchive;
19
+ }),
20
+ append: jest.fn(),
21
+ finalize: jest.fn(() => {
22
+ // When finalized, trigger the output stream's finish event
23
+ const stream = mockArchive._outputStream;
24
+ if (stream) {
25
+ // Write a dummy chunk and end the stream
26
+ setTimeout(() => {
27
+ stream.write(Buffer.from('zip data'));
28
+ stream.end();
29
+ }, 0);
30
+ }
31
+ }),
32
+ on: jest.fn((event, callback) => {
33
+ if (event === 'error') {
34
+ mockArchive._errorCallback = callback;
35
+ }
36
+ return mockArchive;
37
+ }),
38
+ };
39
+ archiver.mockReturnValue(mockArchive);
40
+ });
41
+ describe('createZip', () => {
42
+ it('should create zip archive successfully', async () => {
43
+ const testData = { files: ['file1.ts', 'file2.ts'] };
44
+ const zipPromise = zipService.createZip(testData);
45
+ const result = await zipPromise;
46
+ expect(archiver).toHaveBeenCalledWith('zip', {
47
+ zlib: { level: 9 },
48
+ });
49
+ expect(mockArchive.pipe).toHaveBeenCalled();
50
+ expect(mockArchive.append).toHaveBeenCalledWith(JSON.stringify(testData, null, 2), { name: 'files.json' });
51
+ expect(mockArchive.finalize).toHaveBeenCalled();
52
+ expect(Buffer.isBuffer(result)).toBe(true);
53
+ }, 10000);
54
+ it('should handle archive errors', async () => {
55
+ const testData = { files: ['file1.ts'] };
56
+ const archiveError = new Error('Archive creation failed');
57
+ // Set flag to prevent stream finish
58
+ mockArchive._shouldError = true;
59
+ const zipPromise = zipService.createZip(testData);
60
+ // Simulate error immediately
61
+ if (mockArchive._errorCallback) {
62
+ mockArchive._errorCallback(archiveError);
63
+ }
64
+ await expect(zipPromise).rejects.toThrow('Archive creation failed');
65
+ expect(logger.logError).toHaveBeenCalled();
66
+ // Reset flag
67
+ mockArchive._shouldError = false;
68
+ });
69
+ it('should handle unexpected errors', async () => {
70
+ const testData = { files: ['file1.ts'] };
71
+ archiver.mockImplementation(() => {
72
+ throw new Error('Unexpected error');
73
+ });
74
+ await expect(zipService.createZip(testData)).rejects.toThrow('Unexpected error');
75
+ expect(logger.logError).toHaveBeenCalled();
76
+ });
77
+ it('should create zip with correct data format', async () => {
78
+ const testData = {
79
+ file1: { content: 'code1', status: 'modified' },
80
+ file2: { content: 'code2', status: 'added' }
81
+ };
82
+ const zipPromise = zipService.createZip(testData);
83
+ await zipPromise;
84
+ // Verify that data was stringified correctly
85
+ expect(mockArchive.append).toHaveBeenCalledWith(JSON.stringify(testData, null, 2), { name: 'files.json' });
86
+ }, 10000);
87
+ it('should use maximum compression level', async () => {
88
+ const testData = { files: [] };
89
+ const zipPromise = zipService.createZip(testData);
90
+ await zipPromise;
91
+ expect(archiver).toHaveBeenCalledWith('zip', {
92
+ zlib: { level: 9 },
93
+ });
94
+ }, 10000);
95
+ });
96
+ });
97
+ //# sourceMappingURL=zipService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zipService.test.js","sourceRoot":"","sources":["../../src/tests/zipService.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codesherlock/codesherlock-beta-mcp-server",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "A TypeScript-based Model Context Protocol (MCP) server",
5
5
  "main": "build/index.js",
6
6
  "bin": {
@@ -20,6 +20,7 @@
20
20
  "prepublishOnly": "npm run build",
21
21
  "prepare": "npm run build",
22
22
  "test": "jest",
23
+ "test:coverage": "jest --coverage",
23
24
  "test:git-changes": "tsx test-analyzeGitChanges.ts"
24
25
  },
25
26
  "keywords": [