Skip to content

Commit 21c5cfc

Browse files
committed
Modified according to the module pattern
1 parent 4ad781f commit 21c5cfc

File tree

5 files changed

+51
-51
lines changed

5 files changed

+51
-51
lines changed

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ import addAppLiveTools from "./tools/applive.js";
1010
import addObservabilityTools from "./tools/observability.js";
1111
import addBrowserLiveTools from "./tools/live.js";
1212
import addAccessibilityTools from "./tools/accessibility.js";
13-
import addAutomateTools from "./tools/automate.js";
1413
import addTestManagementTools from "./tools/testmanagement.js";
1514
import addAppAutomationTools from "./tools/appautomate.js";
15+
import addFailureLogsTools from "./tools/getFailureLogs.js";
1616
import { trackMCP } from "./lib/instrumentation.js";
1717

1818
function registerTools(server: McpServer) {

src/tools/failurelogs-utils/app-automate.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import config from "../../config";
2-
import { assertOkResponse, filterLinesByKeywords } from "../../lib/utils";
1+
import config from "../../config.js";
2+
import { assertOkResponse, filterLinesByKeywords } from "../../lib/utils.js";
33

44
const auth = Buffer.from(
55
`${config.browserstackUsername}:${config.browserstackAccessKey}`,

src/tools/failurelogs-utils/automate.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import config from "../../config";
2-
import { HarEntry, HarFile } from "../../lib/utils";
3-
import { assertOkResponse, filterLinesByKeywords } from "../../lib/utils";
1+
import config from "../../config.js";
2+
import { HarEntry, HarFile } from "../../lib/utils.js";
3+
import { assertOkResponse, filterLinesByKeywords } from "../../lib/utils.js";
44

55
const auth = Buffer.from(
66
`${config.browserstackUsername}:${config.browserstackAccessKey}`,

src/tools/getFailureLogs.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
22
import { z } from "zod";
33
import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
4-
import logger from "../logger";
4+
import logger from "../logger.js";
55

66
import {
77
retrieveNetworkFailures,
88
retrieveSessionFailures,
99
retrieveConsoleFailures,
10-
} from "./failurelogs-utils/automate";
10+
} from "./failurelogs-utils/automate.js";
1111

1212
import {
1313
retrieveDeviceLogs,
1414
retrieveAppiumLogs,
1515
retrieveCrashLogs,
16-
} from "./failurelogs-utils/app-automate";
17-
import { trackMCP } from "../lib/instrumentation";
16+
} from "./failurelogs-utils/app-automate.js";
17+
import { trackMCP } from "../lib/instrumentation.js";
1818

1919
const AutomateLogType = {
2020
NetworkLogs: "networkLogs",

tests/tools/getFailureLogs.test.ts

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
1+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
12
import { getFailureLogs } from '../../src/tools/getFailureLogs';
23
import * as automate from '../../src/tools/failurelogs-utils/automate';
34
import * as appAutomate from '../../src/tools/failurelogs-utils/app-automate';
45

5-
jest.mock('../../src/config', () => ({
6+
vi.mock('../../src/config', () => ({
67
__esModule: true,
78
default: {
89
browserstackUsername: 'fake-user',
910
browserstackAccessKey: 'fake-key',
1011
},
1112
}));
1213

13-
jest.mock('../../src/lib/instrumentation', () => ({
14-
trackMCP: jest.fn()
14+
vi.mock('../../src/lib/instrumentation', () => ({
15+
trackMCP: vi.fn()
1516
}));
1617

1718
// Mock the utility functions with implementations
18-
jest.mock('../../src/tools/failurelogs-utils/automate', () => ({
19-
retrieveNetworkFailures: jest.fn(),
20-
retrieveSessionFailures: jest.fn(),
21-
retrieveConsoleFailures: jest.fn(),
22-
filterSessionFailures: jest.fn((text: string) => {
19+
vi.mock('../../src/tools/failurelogs-utils/automate', () => ({
20+
retrieveNetworkFailures: vi.fn(),
21+
retrieveSessionFailures: vi.fn(),
22+
retrieveConsoleFailures: vi.fn(),
23+
filterSessionFailures: vi.fn((text: string) => {
2324
const lines = text.split('\n');
2425
return lines.filter((line: string) =>
2526
line.includes('ERROR') ||
2627
line.includes('EXCEPTION') ||
2728
line.includes('FATAL')
2829
);
2930
}),
30-
filterConsoleFailures: jest.fn((text: string) => {
31+
filterConsoleFailures: vi.fn((text: string) => {
3132
const lines = text.split('\n');
3233
return lines.filter((line: string) =>
3334
line.includes('Failed to load resource') ||
@@ -36,31 +37,30 @@ jest.mock('../../src/tools/failurelogs-utils/automate', () => ({
3637
}),
3738
}));
3839

39-
jest.mock('../../src/tools/failurelogs-utils/app-automate', () => ({
40-
retrieveDeviceLogs: jest.fn(),
41-
retrieveAppiumLogs: jest.fn(),
42-
retrieveCrashLogs: jest.fn(),
43-
filterDeviceFailures: jest.fn(() => []),
44-
filterAppiumFailures: jest.fn(() => []),
45-
filterCrashFailures: jest.fn(() => []),
40+
vi.mock('../../src/tools/failurelogs-utils/app-automate', () => ({
41+
retrieveDeviceLogs: vi.fn(),
42+
retrieveAppiumLogs: vi.fn(),
43+
retrieveCrashLogs: vi.fn(),
44+
filterDeviceFailures: vi.fn(() => []),
45+
filterAppiumFailures: vi.fn(() => []),
46+
filterCrashFailures: vi.fn(() => []),
4647
}));
4748

4849
// Mock fetch
49-
const mockFetch = jest.fn();
50+
const mockFetch = vi.fn();
5051
global.fetch = mockFetch;
5152

5253
describe('BrowserStack Failure Logs', () => {
5354
const mockSessionId = 'test-session-id';
5455
const mockBuildId = 'test-build-id';
55-
const auth = Buffer.from('fake-user:fake-key').toString('base64');
5656

5757
beforeEach(() => {
58-
jest.clearAllMocks();
58+
vi.clearAllMocks();
5959
mockFetch.mockClear();
6060
});
6161

6262
afterEach(() => {
63-
jest.resetAllMocks();
63+
vi.resetAllMocks();
6464
});
6565

6666
describe('getFailureLogs - Input Validation', () => {
@@ -124,12 +124,12 @@ describe('BrowserStack Failure Logs', () => {
124124

125125
beforeEach(() => {
126126
// Reset all mocks
127-
jest.clearAllMocks();
127+
vi.clearAllMocks();
128128

129129
// Setup mock implementations with resolved values
130-
jest.mocked(automate.retrieveNetworkFailures).mockResolvedValue(mockNetworkFailures);
131-
jest.mocked(automate.retrieveSessionFailures).mockResolvedValue(['[ERROR] Test failed']);
132-
jest.mocked(automate.retrieveConsoleFailures).mockResolvedValue(['Uncaught TypeError']);
130+
vi.mocked(automate.retrieveNetworkFailures).mockResolvedValue(mockNetworkFailures);
131+
vi.mocked(automate.retrieveSessionFailures).mockResolvedValue(['[ERROR] Test failed']);
132+
vi.mocked(automate.retrieveConsoleFailures).mockResolvedValue(['Uncaught TypeError']);
133133
});
134134

135135
it('should fetch network logs successfully', async () => {
@@ -141,7 +141,7 @@ describe('BrowserStack Failure Logs', () => {
141141
response: { status: 404, statusText: 'Not Found' }
142142
}
143143
];
144-
jest.mocked(automate.retrieveNetworkFailures).mockResolvedValue(mockFailures);
144+
vi.mocked(automate.retrieveNetworkFailures).mockResolvedValue(mockFailures);
145145

146146
const result = await getFailureLogs({
147147
sessionId: mockSessionId,
@@ -185,9 +185,9 @@ describe('BrowserStack Failure Logs', () => {
185185
const mockCrashLogs = ['Application crashed due to signal 11'];
186186

187187
beforeEach(() => {
188-
jest.mocked(appAutomate.retrieveDeviceLogs).mockResolvedValue(mockDeviceLogs);
189-
jest.mocked(appAutomate.retrieveAppiumLogs).mockResolvedValue(mockAppiumLogs);
190-
jest.mocked(appAutomate.retrieveCrashLogs).mockResolvedValue(mockCrashLogs);
188+
vi.mocked(appAutomate.retrieveDeviceLogs).mockResolvedValue(mockDeviceLogs);
189+
vi.mocked(appAutomate.retrieveAppiumLogs).mockResolvedValue(mockAppiumLogs);
190+
vi.mocked(appAutomate.retrieveCrashLogs).mockResolvedValue(mockCrashLogs);
191191
});
192192

193193
it('should fetch device logs successfully', async () => {
@@ -232,7 +232,7 @@ describe('BrowserStack Failure Logs', () => {
232232

233233
describe('Error Handling', () => {
234234
it('should handle empty log responses', async () => {
235-
jest.mocked(automate.retrieveNetworkFailures).mockResolvedValue([]);
235+
vi.mocked(automate.retrieveNetworkFailures).mockResolvedValue([]);
236236

237237
const result = await getFailureLogs({
238238
sessionId: mockSessionId,
@@ -247,7 +247,7 @@ describe('BrowserStack Failure Logs', () => {
247247
describe('Log Filtering', () => {
248248
beforeEach(() => {
249249
// Reset mock implementations before each test
250-
jest.mocked(automate.filterSessionFailures).mockImplementation((text: string) => {
250+
vi.mocked(automate.filterSessionFailures).mockImplementation((text: string) => {
251251
const lines = text.split('\n');
252252
return lines.filter((line: string) =>
253253
line.includes('ERROR') ||
@@ -256,17 +256,17 @@ describe('BrowserStack Failure Logs', () => {
256256
);
257257
});
258258

259-
jest.mocked(automate.filterConsoleFailures).mockImplementation((text: string) => {
259+
vi.mocked(automate.filterConsoleFailures).mockImplementation((text: string) => {
260260
const lines = text.split('\n');
261261
return lines.filter((line: string) =>
262262
line.includes('Failed to load resource') ||
263263
line.includes('Uncaught TypeError')
264264
);
265265
});
266266

267-
jest.mocked(appAutomate.filterDeviceFailures).mockReturnValue([]);
268-
jest.mocked(appAutomate.filterAppiumFailures).mockReturnValue([]);
269-
jest.mocked(appAutomate.filterCrashFailures).mockReturnValue([]);
267+
vi.mocked(appAutomate.filterDeviceFailures).mockReturnValue([]);
268+
vi.mocked(appAutomate.filterAppiumFailures).mockReturnValue([]);
269+
vi.mocked(appAutomate.filterCrashFailures).mockReturnValue([]);
270270
});
271271

272272
it('should filter session logs correctly', () => {
@@ -279,7 +279,7 @@ describe('BrowserStack Failure Logs', () => {
279279
[INFO] Test completed
280280
`;
281281

282-
const result = jest.mocked(automate.filterSessionFailures)(logText);
282+
const result = vi.mocked(automate.filterSessionFailures)(logText);
283283
expect(result).toEqual([
284284
'[ERROR] Test failed',
285285
'[EXCEPTION] NullPointerException',
@@ -295,7 +295,7 @@ console.info('Test progress')
295295
console.error('Uncaught TypeError')
296296
`;
297297

298-
const result = jest.mocked(automate.filterConsoleFailures)(logText);
298+
const result = vi.mocked(automate.filterConsoleFailures)(logText);
299299
expect(result).toEqual([
300300
"console.error('Failed to load resource')",
301301
"console.error('Uncaught TypeError')"
@@ -304,11 +304,11 @@ console.error('Uncaught TypeError')
304304

305305
it('should handle empty inputs in filters', () => {
306306
const emptyResult: string[] = [];
307-
jest.mocked(automate.filterSessionFailures).mockReturnValue(emptyResult);
308-
jest.mocked(automate.filterConsoleFailures).mockReturnValue(emptyResult);
309-
jest.mocked(appAutomate.filterDeviceFailures).mockReturnValue(emptyResult);
310-
jest.mocked(appAutomate.filterAppiumFailures).mockReturnValue(emptyResult);
311-
jest.mocked(appAutomate.filterCrashFailures).mockReturnValue(emptyResult);
307+
vi.mocked(automate.filterSessionFailures).mockReturnValue(emptyResult);
308+
vi.mocked(automate.filterConsoleFailures).mockReturnValue(emptyResult);
309+
vi.mocked(appAutomate.filterDeviceFailures).mockReturnValue(emptyResult);
310+
vi.mocked(appAutomate.filterAppiumFailures).mockReturnValue(emptyResult);
311+
vi.mocked(appAutomate.filterCrashFailures).mockReturnValue(emptyResult);
312312

313313
expect(automate.filterSessionFailures('')).toEqual([]);
314314
expect(automate.filterConsoleFailures('')).toEqual([]);

0 commit comments

Comments
 (0)