Skip to content

Commit 3661686

Browse files
Merge pull request #347 from SavioBS629/fix/mcp-generated-tag-createtestcase
feat(testmanagement): stamp "MCP generated" tag on createTestCase
2 parents bd321f6 + fd54e76 commit 3661686

2 files changed

Lines changed: 84 additions & 0 deletions

File tree

src/tools/testmanagement-utils/create-testcase.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,10 @@ export async function createTestCase(
320320
): Promise<CallToolResult> {
321321
const testCaseParams: TestCaseCreateRequest = { ...params };
322322

323+
testCaseParams.tags = Array.from(
324+
new Set([...(testCaseParams.tags ?? []), "MCP Generated"]),
325+
);
326+
323327
if (
324328
testCaseParams.priority !== undefined ||
325329
testCaseParams.case_type !== undefined
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { beforeEach, describe, it, expect, vi, Mock } from 'vitest';
2+
import { apiClient } from '../../src/lib/apiClient';
3+
import {
4+
createTestCase,
5+
TestCaseCreateRequest,
6+
} from '../../src/tools/testmanagement-utils/create-testcase';
7+
8+
// Reach the real createTestCase implementation; stub only its external deps so
9+
// we can assert on the payload it builds (PMAA-166: MCP-origin tag stamping).
10+
vi.mock('../../src/lib/apiClient', () => ({
11+
apiClient: { get: vi.fn(), post: vi.fn() },
12+
}));
13+
vi.mock('../../src/lib/tm-base-url', () => ({
14+
getTMBaseURL: vi.fn(async () => 'https://test-management.browserstack.com'),
15+
}));
16+
vi.mock('../../src/lib/get-auth', () => ({
17+
getBrowserStackAuth: vi.fn(() => 'fake-user:fake-key'),
18+
}));
19+
vi.mock('../../src/tools/testmanagement-utils/TCG-utils/api', () => ({
20+
projectIdentifierToId: vi.fn(async () => '999'),
21+
fetchFormFields: vi.fn(),
22+
normalizeDefaultFieldValue: vi.fn(),
23+
}));
24+
vi.mock('../../src/logger', () => ({
25+
default: { error: vi.fn(), warn: vi.fn(), info: vi.fn(), debug: vi.fn() },
26+
}));
27+
28+
const mockConfig = {
29+
'browserstack-username': 'fake-user',
30+
'browserstack-access-key': 'fake-key',
31+
} as any;
32+
33+
const baseArgs: TestCaseCreateRequest = {
34+
project_identifier: 'proj-123',
35+
folder_id: 'fold-456',
36+
name: 'Sample Test Case',
37+
test_case_steps: [{ step: 'Step 1', result: 'Result 1' }],
38+
};
39+
40+
function mockCreateSuccess() {
41+
(apiClient.post as Mock).mockResolvedValue({
42+
data: {
43+
data: {
44+
success: true,
45+
test_case: {
46+
identifier: 'TC-001',
47+
title: 'Sample Test Case',
48+
template: undefined,
49+
},
50+
},
51+
},
52+
});
53+
}
54+
55+
function sentTags(): string[] {
56+
const req = (apiClient.post as Mock).mock.calls[0][0];
57+
return req.body.test_case.tags;
58+
}
59+
60+
describe('createTestCase MCP-origin tag (PMAA-166)', () => {
61+
beforeEach(() => {
62+
vi.clearAllMocks();
63+
mockCreateSuccess();
64+
});
65+
66+
it('stamps "MCP Generated" when the caller passes no tags', async () => {
67+
await createTestCase({ ...baseArgs }, mockConfig);
68+
expect(sentTags()).toEqual(['MCP Generated']);
69+
});
70+
71+
it('preserves user tags and appends "MCP Generated"', async () => {
72+
await createTestCase({ ...baseArgs, tags: ['smoke', 'regression'] }, mockConfig);
73+
expect(sentTags()).toEqual(['smoke', 'regression', 'MCP Generated']);
74+
});
75+
76+
it('does not duplicate "MCP Generated" if already present', async () => {
77+
await createTestCase({ ...baseArgs, tags: ['MCP Generated'] }, mockConfig);
78+
expect(sentTags()).toEqual(['MCP Generated']);
79+
});
80+
});

0 commit comments

Comments
 (0)