@codesherlock/codesherlock-alpha-mcp-server 0.0.8 → 0.0.9
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/.env +2 -2
- package/build/tests/analyzeCommitHandler.test.d.ts +2 -0
- package/build/tests/analyzeCommitHandler.test.d.ts.map +1 -0
- package/build/tests/analyzeCommitHandler.test.js +111 -0
- package/build/tests/analyzeCommitHandler.test.js.map +1 -0
- package/build/tests/backendApiService.test.js +2 -2
- package/build/tests/backendApiService.test.js.map +1 -1
- package/build/tests/commitReviewService.test.js +53 -51
- package/build/tests/commitReviewService.test.js.map +1 -1
- package/build/tests/loggingService.test.js +12 -15
- package/build/tests/loggingService.test.js.map +1 -1
- package/build/tests/tools.test.d.ts +2 -0
- package/build/tests/tools.test.d.ts.map +1 -0
- package/build/tests/tools.test.js +58 -0
- package/build/tests/tools.test.js.map +1 -0
- package/package.json +1 -1
package/.env
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Backend API Configuration
|
|
4
4
|
BACKEND_API_URL=https://api.dev.codesherlock.ai
|
|
5
5
|
|
|
6
|
+
NODE_ENV=development
|
|
6
7
|
|
|
7
8
|
# Application Insights Configuration
|
|
8
|
-
APPLICATIONINSIGHTS_CONNECTION_STRING=
|
|
9
|
-
|
|
9
|
+
APPLICATIONINSIGHTS_CONNECTION_STRING=your-application-insights-connection-string-here
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeCommitHandler.test.d.ts","sourceRoot":"","sources":["../../src/tests/analyzeCommitHandler.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createAnalyzeCommitHandler } from "../handlers/analyzeCommitHandler.js";
|
|
2
|
+
import { formatMultipleFileAnalysisToMarkdown } from "../utils/analysisFormatter.js";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
// Mock logger to silence output
|
|
5
|
+
jest.mock("../services/loggingService.js", () => ({
|
|
6
|
+
logger: {
|
|
7
|
+
logInfo: jest.fn(),
|
|
8
|
+
logError: jest.fn(),
|
|
9
|
+
logWarning: jest.fn(),
|
|
10
|
+
logEvent: jest.fn(),
|
|
11
|
+
},
|
|
12
|
+
}));
|
|
13
|
+
jest.mock("../utils/analysisFormatter.js", () => ({
|
|
14
|
+
formatMultipleFileAnalysisToMarkdown: jest.fn(),
|
|
15
|
+
}));
|
|
16
|
+
jest.mock("fs", () => ({
|
|
17
|
+
existsSync: jest.fn(),
|
|
18
|
+
mkdirSync: jest.fn(),
|
|
19
|
+
writeFileSync: jest.fn(),
|
|
20
|
+
}));
|
|
21
|
+
describe("createAnalyzeCommitHandler", () => {
|
|
22
|
+
let gitService;
|
|
23
|
+
let commitReviewService;
|
|
24
|
+
let backendApiService;
|
|
25
|
+
const handlerArgs = {
|
|
26
|
+
uncommitted: true,
|
|
27
|
+
directory: "C:\\Users\\dev\\GitHub\\my-org\\my-repo",
|
|
28
|
+
factor: "power",
|
|
29
|
+
};
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
jest.clearAllMocks();
|
|
32
|
+
gitService = {
|
|
33
|
+
analyzeGitChanges: jest.fn(),
|
|
34
|
+
getCurrentCommitHash: jest.fn(),
|
|
35
|
+
};
|
|
36
|
+
commitReviewService = {
|
|
37
|
+
submitAndWaitForResults: jest.fn(),
|
|
38
|
+
};
|
|
39
|
+
backendApiService = {
|
|
40
|
+
getUserFromSecureRoute: jest.fn(),
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
it("returns success response and saves markdown when analysis succeeds", async () => {
|
|
44
|
+
fs.existsSync.mockImplementationOnce(() => true).mockImplementationOnce(() => false);
|
|
45
|
+
gitService.analyzeGitChanges.mockResolvedValue([
|
|
46
|
+
{ filename: "file.ts", status: "modified", new_content: "code", patch: "diff" },
|
|
47
|
+
]);
|
|
48
|
+
gitService.getCurrentCommitHash.mockResolvedValue("abc123");
|
|
49
|
+
backendApiService.getUserFromSecureRoute.mockResolvedValue({ userid: "u1", username: "tester" });
|
|
50
|
+
const analysisResult = {
|
|
51
|
+
success: true,
|
|
52
|
+
analysisId: "analysis-1",
|
|
53
|
+
results: [
|
|
54
|
+
{ analysis: { issue: "bug" }, language: "ts", file_name: "file.ts", analysisId: 1 },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
commitReviewService.submitAndWaitForResults.mockResolvedValue(analysisResult);
|
|
58
|
+
formatMultipleFileAnalysisToMarkdown.mockReturnValue("markdown-content");
|
|
59
|
+
const handler = createAnalyzeCommitHandler(gitService, commitReviewService, backendApiService);
|
|
60
|
+
const response = await handler(handlerArgs);
|
|
61
|
+
expect(commitReviewService.submitAndWaitForResults).toHaveBeenCalledWith({
|
|
62
|
+
factor: "power_analysis",
|
|
63
|
+
user_id: "u1",
|
|
64
|
+
repo_name: "my-repo",
|
|
65
|
+
commit_id: "abc123",
|
|
66
|
+
username: "tester",
|
|
67
|
+
file_changes: expect.any(Array),
|
|
68
|
+
organization_name: "my-org",
|
|
69
|
+
});
|
|
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");
|
|
73
|
+
expect(response.structuredContent).toEqual(analysisResult);
|
|
74
|
+
expect(response.content[0].text).toBe("markdown-content");
|
|
75
|
+
});
|
|
76
|
+
it("returns not found error when directory is missing", async () => {
|
|
77
|
+
fs.existsSync.mockReturnValue(false);
|
|
78
|
+
const handler = createAnalyzeCommitHandler(gitService, commitReviewService, backendApiService);
|
|
79
|
+
const response = await handler(handlerArgs);
|
|
80
|
+
expect(response.isError).toBe(true);
|
|
81
|
+
expect(response.structuredContent.success).toBe(false);
|
|
82
|
+
expect(response.structuredContent.statusCode).toBe(404);
|
|
83
|
+
});
|
|
84
|
+
it("returns validation error when file changes are invalid", async () => {
|
|
85
|
+
fs.existsSync.mockReturnValue(true);
|
|
86
|
+
gitService.analyzeGitChanges.mockResolvedValue([{ filename: "file.ts", status: "modified" }]);
|
|
87
|
+
const handler = createAnalyzeCommitHandler(gitService, commitReviewService, backendApiService);
|
|
88
|
+
const response = await handler(handlerArgs);
|
|
89
|
+
expect(response.isError).toBe(true);
|
|
90
|
+
expect(response.structuredContent.statusCode).toBe(422);
|
|
91
|
+
expect(commitReviewService.submitAndWaitForResults).not.toHaveBeenCalled();
|
|
92
|
+
});
|
|
93
|
+
it("propagates backend error result when commit review fails", async () => {
|
|
94
|
+
fs.existsSync.mockReturnValue(true);
|
|
95
|
+
gitService.analyzeGitChanges.mockResolvedValue([
|
|
96
|
+
{ filename: "file.ts", status: "modified", new_content: "code", patch: "diff" },
|
|
97
|
+
]);
|
|
98
|
+
gitService.getCurrentCommitHash.mockResolvedValue("abc123");
|
|
99
|
+
backendApiService.getUserFromSecureRoute.mockResolvedValue({ userid: "u1", username: "tester" });
|
|
100
|
+
commitReviewService.submitAndWaitForResults.mockResolvedValue({
|
|
101
|
+
success: false,
|
|
102
|
+
error: "Backend failed",
|
|
103
|
+
});
|
|
104
|
+
const handler = createAnalyzeCommitHandler(gitService, commitReviewService, backendApiService);
|
|
105
|
+
const response = await handler(handlerArgs);
|
|
106
|
+
expect(response.isError).toBe(true);
|
|
107
|
+
expect(response.structuredContent.success).toBe(false);
|
|
108
|
+
expect(response.structuredContent.error).toBe("Backend failed");
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=analyzeCommitHandler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeCommitHandler.test.js","sourceRoot":"","sources":["../../src/tests/analyzeCommitHandler.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ describe('BackendApiService', () => {
|
|
|
43
43
|
expect(global.fetch).toHaveBeenCalledWith(`${baseUrl}/v2/commit-review/power_analysis`, expect.objectContaining({
|
|
44
44
|
method: 'POST',
|
|
45
45
|
headers: expect.objectContaining({
|
|
46
|
-
|
|
46
|
+
'X-CS-MCP-API-Key': apiKey,
|
|
47
47
|
}),
|
|
48
48
|
body: expect.any(FormData),
|
|
49
49
|
}));
|
|
@@ -54,7 +54,7 @@ describe('BackendApiService', () => {
|
|
|
54
54
|
status: 500,
|
|
55
55
|
text: jest.fn().mockResolvedValue('Internal Server Error'),
|
|
56
56
|
});
|
|
57
|
-
await expect(backendApiService.submitCommitReview(mockParams)).rejects.toThrow('HTTP error! status: 500,
|
|
57
|
+
await expect(backendApiService.submitCommitReview(mockParams)).rejects.toThrow('HTTP error! status: 500, detail: Internal Server Error');
|
|
58
58
|
expect(logger.logError).toHaveBeenCalled();
|
|
59
59
|
});
|
|
60
60
|
it('should handle network errors', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backendApiService.test.js","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAsB,MAAM,kCAAkC,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,oBAAoB;AACpB,IAAI,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;AACxC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEnB,oBAAoB;AACpB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAEzB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,IAAI,iBAAoC,CAAC;IACzC,MAAM,OAAO,GAAG,wBAAwB,CAAC;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC;IAE9B,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE3D,4BAA4B;QAC3B,KAA8B,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;YACf,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SACzE,CAAC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAChC,MAAM,UAAU,GAAuB;YACnC,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,WAAW;YACtB,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,iBAAiB,EAAE,MAAM;SAC5B,CAAC;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,gBAAgB,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;YACvD,MAAM,CAAC,KAAmB,CAAC,iBAAiB,CAAC;gBAC1C,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,gBAAgB,CAAC;aACtD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAEtE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,oBAAoB,CACrC,GAAG,OAAO,kCAAkC,EAC5C,MAAM,CAAC,gBAAgB,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAC7B,
|
|
1
|
+
{"version":3,"file":"backendApiService.test.js","sourceRoot":"","sources":["../../src/tests/backendApiService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { CommitReviewService } from '../services/commitReviewService.js';
|
|
2
2
|
import { BackendApiService } from '../services/backendApiService.js';
|
|
3
|
+
import { EventEmitter } from 'events';
|
|
4
|
+
jest.setTimeout(10000);
|
|
3
5
|
// Mock dependencies
|
|
4
6
|
jest.mock('../services/backendApiService');
|
|
5
7
|
jest.mock('../services/loggingService');
|
|
6
8
|
describe('CommitReviewService', () => {
|
|
7
9
|
let commitReviewService;
|
|
8
10
|
let mockBackendApiService;
|
|
11
|
+
const createMockWebSocket = () => {
|
|
12
|
+
const ws = new EventEmitter();
|
|
13
|
+
ws.readyState = 1; // OPEN
|
|
14
|
+
ws.close = jest.fn(() => ws.emit('close', 1000, Buffer.from('')));
|
|
15
|
+
return ws;
|
|
16
|
+
};
|
|
9
17
|
beforeEach(() => {
|
|
10
18
|
jest.clearAllMocks();
|
|
11
19
|
mockBackendApiService = new BackendApiService('url');
|
|
@@ -22,41 +30,37 @@ describe('CommitReviewService', () => {
|
|
|
22
30
|
organization_name: 'org1',
|
|
23
31
|
};
|
|
24
32
|
it('should submit review and collect results successfully', async () => {
|
|
25
|
-
// Mock submitCommitReview response
|
|
26
33
|
mockBackendApiService.submitCommitReview.mockResolvedValue({
|
|
27
34
|
success: true,
|
|
28
35
|
analysisId: 'analysis123',
|
|
29
36
|
message: 'Submitted',
|
|
30
37
|
});
|
|
31
|
-
|
|
32
|
-
mockBackendApiService.connectWebSocket.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
return Promise.resolve({});
|
|
58
|
-
});
|
|
59
|
-
const result = await commitReviewService.submitAndWaitForResults(mockParams);
|
|
38
|
+
const ws = createMockWebSocket();
|
|
39
|
+
mockBackendApiService.connectWebSocket.mockResolvedValue(ws);
|
|
40
|
+
const resultPromise = commitReviewService.submitAndWaitForResults(mockParams);
|
|
41
|
+
// Simulate messages after handlers are attached
|
|
42
|
+
setTimeout(() => {
|
|
43
|
+
ws.emit('message', Buffer.from(JSON.stringify({
|
|
44
|
+
status_code: 200,
|
|
45
|
+
content: {
|
|
46
|
+
analysis_type: 'commit_review',
|
|
47
|
+
analysis: { issue: 'bug' },
|
|
48
|
+
language: 'ts',
|
|
49
|
+
file_name: 'test.ts',
|
|
50
|
+
is_complete: false,
|
|
51
|
+
},
|
|
52
|
+
analysis_id: 123,
|
|
53
|
+
})));
|
|
54
|
+
ws.emit('message', Buffer.from(JSON.stringify({
|
|
55
|
+
status_code: 200,
|
|
56
|
+
content: {
|
|
57
|
+
analysis_type: 'commit_review',
|
|
58
|
+
status: 'complete',
|
|
59
|
+
is_complete: true,
|
|
60
|
+
},
|
|
61
|
+
})));
|
|
62
|
+
}, 0);
|
|
63
|
+
const result = await resultPromise;
|
|
60
64
|
expect(result.success).toBe(true);
|
|
61
65
|
expect(result.analysisId).toBe('analysis123');
|
|
62
66
|
expect(result.results).toHaveLength(1);
|
|
@@ -74,23 +78,21 @@ describe('CommitReviewService', () => {
|
|
|
74
78
|
success: true,
|
|
75
79
|
analysisId: 'analysis123',
|
|
76
80
|
});
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const result = await commitReviewService.submitAndWaitForResults(mockParams);
|
|
81
|
+
const ws = createMockWebSocket();
|
|
82
|
+
mockBackendApiService.connectWebSocket.mockResolvedValue(ws);
|
|
83
|
+
const resultPromise = commitReviewService.submitAndWaitForResults(mockParams);
|
|
84
|
+
setTimeout(() => {
|
|
85
|
+
ws.emit('error', new Error('WebSocket error'));
|
|
86
|
+
}, 0);
|
|
87
|
+
const result = await resultPromise;
|
|
85
88
|
expect(result.success).toBe(false);
|
|
86
89
|
expect(result.error).toContain('WebSocket error');
|
|
87
90
|
});
|
|
88
91
|
it('should handle backend submission failure', async () => {
|
|
89
92
|
const error = new Error('Submission failed');
|
|
90
93
|
mockBackendApiService.submitCommitReview.mockRejectedValue(error);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
mockBackendApiService.connectWebSocket.mockImplementation(() => Promise.resolve({}));
|
|
94
|
+
const ws = createMockWebSocket();
|
|
95
|
+
mockBackendApiService.connectWebSocket.mockResolvedValue(ws);
|
|
94
96
|
const result = await commitReviewService.submitAndWaitForResults(mockParams);
|
|
95
97
|
expect(result.success).toBe(false);
|
|
96
98
|
expect(result.error).toBe('Submission failed');
|
|
@@ -100,16 +102,16 @@ describe('CommitReviewService', () => {
|
|
|
100
102
|
success: true,
|
|
101
103
|
analysisId: 'analysis123',
|
|
102
104
|
});
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
});
|
|
112
|
-
const result = await
|
|
105
|
+
const ws = createMockWebSocket();
|
|
106
|
+
mockBackendApiService.connectWebSocket.mockResolvedValue(ws);
|
|
107
|
+
const resultPromise = commitReviewService.submitAndWaitForResults(mockParams);
|
|
108
|
+
setTimeout(() => {
|
|
109
|
+
ws.emit('message', Buffer.from(JSON.stringify({
|
|
110
|
+
status_code: 400,
|
|
111
|
+
error_message: 'Bad Request',
|
|
112
|
+
})));
|
|
113
|
+
}, 0);
|
|
114
|
+
const result = await resultPromise;
|
|
113
115
|
expect(result.success).toBe(false);
|
|
114
116
|
expect(result.error).toBe('Bad Request');
|
|
115
117
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commitReviewService.test.js","sourceRoot":"","sources":["../../src/tests/commitReviewService.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAA4B,MAAM,oCAAoC,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"commitReviewService.test.js","sourceRoot":"","sources":["../../src/tests/commitReviewService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,47 +32,44 @@ jest.mock('applicationinsights', () => {
|
|
|
32
32
|
});
|
|
33
33
|
describe('LoggingService', () => {
|
|
34
34
|
let loggingService;
|
|
35
|
-
let
|
|
36
|
-
let consoleWarnSpy;
|
|
35
|
+
let stderrSpy;
|
|
37
36
|
beforeEach(() => {
|
|
38
37
|
// Reset singleton instance if possible or just get the instance
|
|
39
38
|
// Since it's a singleton, we might need to be careful.
|
|
40
39
|
// However, for unit tests, we can just get the instance.
|
|
41
40
|
loggingService = LoggingService.getInstance();
|
|
42
|
-
// Spy on
|
|
43
|
-
|
|
44
|
-
consoleWarnSpy = jest.spyOn(console, 'warn').mockImplementation(() => { });
|
|
41
|
+
// Spy on stderr to capture debug logs
|
|
42
|
+
stderrSpy = jest.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
45
43
|
// Reset mocks
|
|
46
44
|
jest.clearAllMocks();
|
|
47
45
|
});
|
|
48
46
|
afterEach(() => {
|
|
49
|
-
|
|
50
|
-
consoleWarnSpy.mockRestore();
|
|
47
|
+
stderrSpy.mockRestore();
|
|
51
48
|
});
|
|
52
49
|
describe('initialization', () => {
|
|
53
|
-
it('should initialize successfully with a connection string', () => {
|
|
50
|
+
it('should initialize successfully with a connection string', async () => {
|
|
54
51
|
// We need to access the private property 'isInitialized' or reset it if we want to test init multiple times
|
|
55
52
|
// Since we can't easily reset private state without casting to any, we'll try to initialize
|
|
56
53
|
// If it's already initialized from a previous test run (singleton), this might hit the "already initialized" path
|
|
57
54
|
// Force reset for testing purposes
|
|
58
55
|
loggingService.isInitialized = false;
|
|
59
56
|
loggingService.client = null;
|
|
60
|
-
loggingService.initialize('fake-connection-string');
|
|
57
|
+
await loggingService.initialize('fake-connection-string');
|
|
61
58
|
expect(appInsights.setup).toHaveBeenCalledWith('fake-connection-string');
|
|
62
59
|
expect(appInsights.start).toHaveBeenCalled();
|
|
63
60
|
expect(loggingService.isInitialized).toBe(true);
|
|
64
61
|
});
|
|
65
|
-
it('should log error if no connection string provided', () => {
|
|
62
|
+
it('should log error if no connection string provided', async () => {
|
|
66
63
|
loggingService.isInitialized = false;
|
|
67
|
-
loggingService.initialize(undefined);
|
|
68
|
-
expect(
|
|
64
|
+
await loggingService.initialize(undefined);
|
|
65
|
+
expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining('Application Insights connection string missing; logging disabled.\n'));
|
|
69
66
|
expect(appInsights.setup).not.toHaveBeenCalled();
|
|
70
67
|
});
|
|
71
|
-
it('should
|
|
68
|
+
it('should skip re-initialization if already initialized', async () => {
|
|
72
69
|
loggingService.isInitialized = true;
|
|
73
|
-
loggingService.initialize('another-string');
|
|
74
|
-
expect(consoleWarnSpy).toHaveBeenCalledWith('Logging service already initialized');
|
|
70
|
+
await loggingService.initialize('another-string');
|
|
75
71
|
expect(appInsights.setup).not.toHaveBeenCalled();
|
|
72
|
+
expect(stderrSpy).not.toHaveBeenCalled();
|
|
76
73
|
});
|
|
77
74
|
});
|
|
78
75
|
describe('logging methods', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggingService.test.js","sourceRoot":"","sources":["../../src/tests/loggingService.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,WAAW,MAAM,qBAAqB,CAAC;AAEnD,2BAA2B;AAC3B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IACjC,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAExB,OAAO;QACH,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACjC,4BAA4B,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACxD,sBAAsB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QAClD,yBAAyB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACrD,wBAAwB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACpD,0BAA0B,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACtD,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QACjD,sBAAsB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QAClD,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE;QAC9C,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE;QAChB,aAAa,EAAE;YACX,UAAU;YACV,cAAc;YACd,UAAU;YACV,WAAW;YACX,eAAe;YACf,KAAK;SACR;QACD,eAAe,EAAE,IAAI,CAAC,EAAE,EAAE;KAC7B,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,IAAI,cAA8B,CAAC;IACnC,IAAI,
|
|
1
|
+
{"version":3,"file":"loggingService.test.js","sourceRoot":"","sources":["../../src/tests/loggingService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.d.ts","sourceRoot":"","sources":["../../src/tests/tools.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { registerTools } from "../handlers/tools.js";
|
|
2
|
+
import { AnalyzeCommitInputSchema, AnalyzeCommitOutputSchema } from "../schemas/toolSchemas.js";
|
|
3
|
+
// Mock service classes and handler factory
|
|
4
|
+
const mockGitServiceInstance = { type: "git" };
|
|
5
|
+
const mockBackendApiServiceInstance = { type: "backend" };
|
|
6
|
+
const mockCommitReviewServiceInstance = { type: "commit" };
|
|
7
|
+
const mockHandler = jest.fn();
|
|
8
|
+
jest.mock("../services/gitService.js", () => {
|
|
9
|
+
return {
|
|
10
|
+
GitService: jest.fn().mockImplementation(() => mockGitServiceInstance),
|
|
11
|
+
};
|
|
12
|
+
});
|
|
13
|
+
jest.mock("../services/backendApiService.js", () => {
|
|
14
|
+
return {
|
|
15
|
+
BackendApiService: jest.fn().mockImplementation(() => mockBackendApiServiceInstance),
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
jest.mock("../services/commitReviewService.js", () => {
|
|
19
|
+
return {
|
|
20
|
+
CommitReviewService: jest.fn().mockImplementation(() => mockCommitReviewServiceInstance),
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
jest.mock("../handlers/analyzeCommitHandler.js", () => {
|
|
24
|
+
return {
|
|
25
|
+
createAnalyzeCommitHandler: jest.fn(() => mockHandler),
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
describe("registerTools", () => {
|
|
29
|
+
const originalEnv = { ...process.env };
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
jest.clearAllMocks();
|
|
32
|
+
process.env = { ...originalEnv, BACKEND_API_URL: "http://api.local", MCP_API_KEY: "secret" };
|
|
33
|
+
});
|
|
34
|
+
afterAll(() => {
|
|
35
|
+
process.env = originalEnv;
|
|
36
|
+
});
|
|
37
|
+
it("registers analyze_commit tool with constructed services and handler", () => {
|
|
38
|
+
const server = { registerTool: jest.fn() };
|
|
39
|
+
registerTools(server);
|
|
40
|
+
const { GitService } = require("../services/gitService.js");
|
|
41
|
+
const { BackendApiService } = require("../services/backendApiService.js");
|
|
42
|
+
const { CommitReviewService } = require("../services/commitReviewService.js");
|
|
43
|
+
const { createAnalyzeCommitHandler } = require("../handlers/analyzeCommitHandler.js");
|
|
44
|
+
// Services instantiated once
|
|
45
|
+
expect(GitService).toHaveBeenCalledTimes(1);
|
|
46
|
+
expect(BackendApiService).toHaveBeenCalledWith("http://api.local", "secret");
|
|
47
|
+
expect(CommitReviewService).toHaveBeenCalledWith(mockBackendApiServiceInstance);
|
|
48
|
+
// Handler created with service instances
|
|
49
|
+
expect(createAnalyzeCommitHandler).toHaveBeenCalledWith(mockGitServiceInstance, mockCommitReviewServiceInstance, mockBackendApiServiceInstance);
|
|
50
|
+
// Tool registered with correct metadata and handler
|
|
51
|
+
expect(server.registerTool).toHaveBeenCalledWith("analyze_commit", expect.objectContaining({
|
|
52
|
+
title: "Analyze Commit",
|
|
53
|
+
inputSchema: AnalyzeCommitInputSchema,
|
|
54
|
+
outputSchema: AnalyzeCommitOutputSchema,
|
|
55
|
+
}), mockHandler);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../../src/tests/tools.test.ts"],"names":[],"mappings":"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"}
|