@atlassian-dc-mcp/jira 0.9.12 → 0.10.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.
- package/CHANGELOG.md +11 -0
- package/build/__tests__/jira-service.test.d.ts +2 -0
- package/build/__tests__/jira-service.test.d.ts.map +1 -0
- package/build/__tests__/jira-service.test.js +193 -0
- package/build/__tests__/jira-service.test.js.map +1 -0
- package/build/index.js +8 -0
- package/build/index.js.map +1 -1
- package/build/jira-service.d.ts +14 -0
- package/build/jira-service.d.ts.map +1 -1
- package/build/jira-service.js +22 -0
- package/build/jira-service.js.map +1 -1
- package/jest.config.js +23 -0
- package/package.json +3 -3
- package/src/__tests__/jira-service.test.ts +236 -0
- package/src/index.ts +20 -0
- package/src/jira-service.ts +31 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [0.10.0](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.9.12...v0.10.0) (2026-01-31)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **jira:** add status transition tools ([47dbb0f](https://github.com/b1ff/atlassian-dc-mcp/commit/47dbb0f3ea522f44718ff02e4829d215968a740d))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
## [0.9.12](https://github.com/b1ff/atlassian-dc-mcp/compare/v0.9.11...v0.9.12) (2026-01-03)
|
|
7
18
|
|
|
8
19
|
**Note:** Version bump only for package @atlassian-dc-mcp/jira
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-service.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/jira-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { JiraService } from '../jira-service.js';
|
|
2
|
+
import { IssueService } from '../jira-client/index.js';
|
|
3
|
+
jest.mock('../jira-client/index.js', () => ({
|
|
4
|
+
IssueService: {
|
|
5
|
+
getTransitions: jest.fn(),
|
|
6
|
+
doTransition: jest.fn(),
|
|
7
|
+
getIssue: jest.fn(),
|
|
8
|
+
editIssue: jest.fn(),
|
|
9
|
+
createIssue: jest.fn(),
|
|
10
|
+
getComments: jest.fn(),
|
|
11
|
+
addComment: jest.fn(),
|
|
12
|
+
},
|
|
13
|
+
SearchService: {
|
|
14
|
+
searchUsingSearchRequest: jest.fn(),
|
|
15
|
+
},
|
|
16
|
+
OpenAPI: {
|
|
17
|
+
BASE: '',
|
|
18
|
+
TOKEN: '',
|
|
19
|
+
VERSION: '',
|
|
20
|
+
},
|
|
21
|
+
}));
|
|
22
|
+
describe('JiraService', () => {
|
|
23
|
+
let jiraService;
|
|
24
|
+
const mockIssueKey = 'PROJ-123';
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
jiraService = new JiraService('test-host', 'test-token');
|
|
27
|
+
jest.clearAllMocks();
|
|
28
|
+
});
|
|
29
|
+
describe('getTransitions', () => {
|
|
30
|
+
it('should successfully get available transitions for an issue', async () => {
|
|
31
|
+
const mockTransitionsData = {
|
|
32
|
+
transitions: [
|
|
33
|
+
{
|
|
34
|
+
id: '21',
|
|
35
|
+
name: 'Start Progress',
|
|
36
|
+
to: {
|
|
37
|
+
id: '3',
|
|
38
|
+
name: 'In Progress',
|
|
39
|
+
statusCategory: { name: 'In Progress' },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: '31',
|
|
44
|
+
name: 'Done',
|
|
45
|
+
to: {
|
|
46
|
+
id: '4',
|
|
47
|
+
name: 'Done',
|
|
48
|
+
statusCategory: { name: 'Done' },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
};
|
|
53
|
+
IssueService.getTransitions.mockResolvedValue(mockTransitionsData);
|
|
54
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
55
|
+
expect(result.success).toBe(true);
|
|
56
|
+
expect(result.data).toBe(mockTransitionsData);
|
|
57
|
+
expect(IssueService.getTransitions).toHaveBeenCalledWith(mockIssueKey);
|
|
58
|
+
});
|
|
59
|
+
it('should return empty transitions array when no transitions available', async () => {
|
|
60
|
+
const mockTransitionsData = {
|
|
61
|
+
transitions: [],
|
|
62
|
+
};
|
|
63
|
+
IssueService.getTransitions.mockResolvedValue(mockTransitionsData);
|
|
64
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
65
|
+
expect(result.success).toBe(true);
|
|
66
|
+
expect(result.data).toBe(mockTransitionsData);
|
|
67
|
+
expect(result.data?.transitions).toHaveLength(0);
|
|
68
|
+
});
|
|
69
|
+
it('should handle API errors gracefully', async () => {
|
|
70
|
+
const mockError = new Error('Issue not found');
|
|
71
|
+
IssueService.getTransitions.mockRejectedValue(mockError);
|
|
72
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
73
|
+
expect(result.success).toBe(false);
|
|
74
|
+
expect(result.error).toBe('Issue not found');
|
|
75
|
+
});
|
|
76
|
+
it('should handle permission errors', async () => {
|
|
77
|
+
const mockError = new Error('Insufficient permissions to view transitions');
|
|
78
|
+
IssueService.getTransitions.mockRejectedValue(mockError);
|
|
79
|
+
const result = await jiraService.getTransitions('RESTRICTED-1');
|
|
80
|
+
expect(result.success).toBe(false);
|
|
81
|
+
expect(result.error).toBe('Insufficient permissions to view transitions');
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
describe('transitionIssue', () => {
|
|
85
|
+
it('should successfully transition an issue to a new status', async () => {
|
|
86
|
+
IssueService.doTransition.mockResolvedValue(undefined);
|
|
87
|
+
const result = await jiraService.transitionIssue({
|
|
88
|
+
issueKey: mockIssueKey,
|
|
89
|
+
transitionId: '21',
|
|
90
|
+
});
|
|
91
|
+
expect(result.success).toBe(true);
|
|
92
|
+
expect(IssueService.doTransition).toHaveBeenCalledWith(mockIssueKey, {
|
|
93
|
+
transition: { id: '21' },
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
it('should successfully transition with additional fields', async () => {
|
|
97
|
+
IssueService.doTransition.mockResolvedValue(undefined);
|
|
98
|
+
const result = await jiraService.transitionIssue({
|
|
99
|
+
issueKey: mockIssueKey,
|
|
100
|
+
transitionId: '31',
|
|
101
|
+
fields: {
|
|
102
|
+
resolution: { name: 'Done' },
|
|
103
|
+
comment: { body: 'Closing this issue' },
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
expect(result.success).toBe(true);
|
|
107
|
+
expect(IssueService.doTransition).toHaveBeenCalledWith(mockIssueKey, {
|
|
108
|
+
transition: { id: '31' },
|
|
109
|
+
fields: {
|
|
110
|
+
resolution: { name: 'Done' },
|
|
111
|
+
comment: { body: 'Closing this issue' },
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
it('should handle invalid transition ID errors', async () => {
|
|
116
|
+
const mockError = new Error('Invalid transition ID');
|
|
117
|
+
IssueService.doTransition.mockRejectedValue(mockError);
|
|
118
|
+
const result = await jiraService.transitionIssue({
|
|
119
|
+
issueKey: mockIssueKey,
|
|
120
|
+
transitionId: '999',
|
|
121
|
+
});
|
|
122
|
+
expect(result.success).toBe(false);
|
|
123
|
+
expect(result.error).toBe('Invalid transition ID');
|
|
124
|
+
});
|
|
125
|
+
it('should handle missing required fields errors', async () => {
|
|
126
|
+
const mockError = new Error('Resolution field is required');
|
|
127
|
+
IssueService.doTransition.mockRejectedValue(mockError);
|
|
128
|
+
const result = await jiraService.transitionIssue({
|
|
129
|
+
issueKey: mockIssueKey,
|
|
130
|
+
transitionId: '31',
|
|
131
|
+
});
|
|
132
|
+
expect(result.success).toBe(false);
|
|
133
|
+
expect(result.error).toBe('Resolution field is required');
|
|
134
|
+
});
|
|
135
|
+
it('should handle permission errors', async () => {
|
|
136
|
+
const mockError = new Error('User does not have permission to transition this issue');
|
|
137
|
+
IssueService.doTransition.mockRejectedValue(mockError);
|
|
138
|
+
const result = await jiraService.transitionIssue({
|
|
139
|
+
issueKey: 'RESTRICTED-1',
|
|
140
|
+
transitionId: '21',
|
|
141
|
+
});
|
|
142
|
+
expect(result.success).toBe(false);
|
|
143
|
+
expect(result.error).toBe('User does not have permission to transition this issue');
|
|
144
|
+
});
|
|
145
|
+
it('should handle issue not found errors', async () => {
|
|
146
|
+
const mockError = new Error('Issue does not exist');
|
|
147
|
+
IssueService.doTransition.mockRejectedValue(mockError);
|
|
148
|
+
const result = await jiraService.transitionIssue({
|
|
149
|
+
issueKey: 'NONEXISTENT-999',
|
|
150
|
+
transitionId: '21',
|
|
151
|
+
});
|
|
152
|
+
expect(result.success).toBe(false);
|
|
153
|
+
expect(result.error).toBe('Issue does not exist');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('validateConfig', () => {
|
|
157
|
+
const originalEnv = process.env;
|
|
158
|
+
beforeEach(() => {
|
|
159
|
+
jest.resetModules();
|
|
160
|
+
process.env = { ...originalEnv };
|
|
161
|
+
});
|
|
162
|
+
afterAll(() => {
|
|
163
|
+
process.env = originalEnv;
|
|
164
|
+
});
|
|
165
|
+
it('should return empty array when all required env vars are present', () => {
|
|
166
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
167
|
+
process.env.JIRA_HOST = 'test-host';
|
|
168
|
+
const missingVars = JiraService.validateConfig();
|
|
169
|
+
expect(missingVars).toEqual([]);
|
|
170
|
+
});
|
|
171
|
+
it('should return missing vars when JIRA_API_TOKEN is missing', () => {
|
|
172
|
+
delete process.env.JIRA_API_TOKEN;
|
|
173
|
+
process.env.JIRA_HOST = 'test-host';
|
|
174
|
+
const missingVars = JiraService.validateConfig();
|
|
175
|
+
expect(missingVars).toContain('JIRA_API_TOKEN');
|
|
176
|
+
});
|
|
177
|
+
it('should return missing vars when both host options are missing', () => {
|
|
178
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
179
|
+
delete process.env.JIRA_HOST;
|
|
180
|
+
delete process.env.JIRA_API_BASE_PATH;
|
|
181
|
+
const missingVars = JiraService.validateConfig();
|
|
182
|
+
expect(missingVars).toContain('JIRA_HOST or JIRA_API_BASE_PATH');
|
|
183
|
+
});
|
|
184
|
+
it('should accept JIRA_API_BASE_PATH as alternative to JIRA_HOST', () => {
|
|
185
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
186
|
+
delete process.env.JIRA_HOST;
|
|
187
|
+
process.env.JIRA_API_BASE_PATH = 'https://test-host/rest';
|
|
188
|
+
const missingVars = JiraService.validateConfig();
|
|
189
|
+
expect(missingVars).toEqual([]);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
//# sourceMappingURL=jira-service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-service.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-service.test.ts"],"names":[],"mappings":"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"}
|
package/build/index.js
CHANGED
|
@@ -35,5 +35,13 @@ server.tool("jira_postIssueComment", `Post a comment on a JIRA issue in the ${ji
|
|
|
35
35
|
const result = await jiraService.postIssueComment(issueKey, comment);
|
|
36
36
|
return formatToolResponse(result);
|
|
37
37
|
});
|
|
38
|
+
server.tool("jira_getTransitions", `Get available status transitions for a JIRA issue in the ${jiraInstanceType}. Returns a list of transitions with their IDs, names, and target statuses.`, jiraToolSchemas.getTransitions, async ({ issueKey }) => {
|
|
39
|
+
const result = await jiraService.getTransitions(issueKey);
|
|
40
|
+
return formatToolResponse(result);
|
|
41
|
+
});
|
|
42
|
+
server.tool("jira_transitionIssue", `Transition a JIRA issue to a new status in the ${jiraInstanceType}. Use jira_getTransitions first to get available transition IDs.`, jiraToolSchemas.transitionIssue, async (params) => {
|
|
43
|
+
const result = await jiraService.transitionIssue(params);
|
|
44
|
+
return formatToolResponse(result);
|
|
45
|
+
});
|
|
38
46
|
await connectServer(server);
|
|
39
47
|
//# sourceMappingURL=index.js.map
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/build/jira-service.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export declare class JiraService {
|
|
|
19
19
|
issueTypeId?: string;
|
|
20
20
|
customFields?: Record<string, any>;
|
|
21
21
|
}): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<void>>;
|
|
22
|
+
getTransitions(issueKey: string): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<import("./jira-client/index.js").TransitionsMetaBean>>;
|
|
23
|
+
transitionIssue(params: {
|
|
24
|
+
issueKey: string;
|
|
25
|
+
transitionId: string;
|
|
26
|
+
fields?: Record<string, any>;
|
|
27
|
+
}): Promise<import("@atlassian-dc-mcp/common").ApiErrorResponse<void>>;
|
|
22
28
|
static validateConfig(): string[];
|
|
23
29
|
}
|
|
24
30
|
export declare const jiraToolSchemas: {
|
|
@@ -54,5 +60,13 @@ export declare const jiraToolSchemas: {
|
|
|
54
60
|
issueTypeId: z.ZodOptional<z.ZodString>;
|
|
55
61
|
customFields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
56
62
|
};
|
|
63
|
+
getTransitions: {
|
|
64
|
+
issueKey: z.ZodString;
|
|
65
|
+
};
|
|
66
|
+
transitionIssue: {
|
|
67
|
+
issueKey: z.ZodString;
|
|
68
|
+
transitionId: z.ZodString;
|
|
69
|
+
fields: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
70
|
+
};
|
|
57
71
|
};
|
|
58
72
|
//# sourceMappingURL=jira-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-service.d.ts","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,qBAAa,WAAW;gBACV,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAMvD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAW;IAWtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAI1C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIlD,WAAW,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAiBK,WAAW,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;
|
|
1
|
+
{"version":3,"file":"jira-service.d.ts","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,qBAAa,WAAW;gBACV,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;IAMvD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAW;IAWtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAI1C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAIlD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAIlD,WAAW,CAAC,MAAM,EAAE;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAiBK,WAAW,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC;IAqBK,cAAc,CAAC,QAAQ,EAAE,MAAM;IAO/B,eAAe,CAAC,MAAM,EAAE;QAC5B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAC9B;IAYD,MAAM,CAAC,cAAc,IAAI,MAAM,EAAE;CASlC;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyC3B,CAAC"}
|
package/build/jira-service.js
CHANGED
|
@@ -58,6 +58,20 @@ export class JiraService {
|
|
|
58
58
|
return IssueService.editIssue(params.issueKey, 'true', { fields });
|
|
59
59
|
}, 'Error updating issue');
|
|
60
60
|
}
|
|
61
|
+
async getTransitions(issueKey) {
|
|
62
|
+
return handleApiOperation(() => IssueService.getTransitions(issueKey), 'Error getting transitions');
|
|
63
|
+
}
|
|
64
|
+
async transitionIssue(params) {
|
|
65
|
+
return handleApiOperation(async () => {
|
|
66
|
+
const requestBody = {
|
|
67
|
+
transition: { id: params.transitionId }
|
|
68
|
+
};
|
|
69
|
+
if (params.fields) {
|
|
70
|
+
requestBody.fields = params.fields;
|
|
71
|
+
}
|
|
72
|
+
return IssueService.doTransition(params.issueKey, requestBody);
|
|
73
|
+
}, 'Error transitioning issue');
|
|
74
|
+
}
|
|
61
75
|
static validateConfig() {
|
|
62
76
|
const requiredEnvVars = ['JIRA_API_TOKEN'];
|
|
63
77
|
const missingVars = requiredEnvVars.filter(varName => !process.env[varName]);
|
|
@@ -99,6 +113,14 @@ export const jiraToolSchemas = {
|
|
|
99
113
|
description: z.string().optional().describe("New description in JIRA Wiki Markup (optional)"),
|
|
100
114
|
issueTypeId: z.string().optional().describe("New issue type id (optional)"),
|
|
101
115
|
customFields: z.record(z.any()).optional().describe("Optional custom fields to update as key-value pairs. Examples: {'customfield_10001': 'Custom Value', 'priority': {'id': '1'}, 'assignee': {'name': 'john.doe'}, 'labels': ['urgent', 'bug']}")
|
|
116
|
+
},
|
|
117
|
+
getTransitions: {
|
|
118
|
+
issueKey: z.string().describe("JIRA issue key (e.g., PROJ-123)")
|
|
119
|
+
},
|
|
120
|
+
transitionIssue: {
|
|
121
|
+
issueKey: z.string().describe("JIRA issue key (e.g., PROJ-123)"),
|
|
122
|
+
transitionId: z.string().describe("The ID of the transition to perform. Use jira_getTransitions to find available transitions and their IDs."),
|
|
123
|
+
fields: z.record(z.any()).optional().describe("Optional fields required by the transition screen. Use jira_getTransitions to see which fields are available for each transition.")
|
|
102
124
|
}
|
|
103
125
|
};
|
|
104
126
|
//# sourceMappingURL=jira-service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jira-service.js","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jira-service.js","sourceRoot":"","sources":["../src/jira-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE9E,MAAM,OAAO,WAAW;IACtB,YAAY,IAAY,EAAE,KAAa,EAAE,WAAoB;QAC3D,OAAO,CAAC,IAAI,GAAG,WAAW,IAAI,WAAW,IAAI,OAAO,CAAC;QACrD,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;QACtB,OAAO,CAAC,OAAO,GAAG,GAAG,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,OAAgB,EAAE,MAAiB,EAAE,aAAqB,EAAE;QAC1F,OAAO,kBAAkB,CAAC,GAAG,EAAE;YAC7B,OAAO,aAAa,CAAC,wBAAwB,CAAC;gBAC5C,GAAG;gBACH,UAAU;gBACV,MAAM;gBACN,OAAO;aACR,CAAC,CAAC;QACL,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAgB,EAAE,MAAe;QAC9C,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,MAAe;QACtD,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC9G,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,QAAgB,EAAE,OAAe;QACtD,OAAO,kBAAkB,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,6BAA6B,CAAC,CAAC;IAClI,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAMjB;QACC,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,cAAc,GAAG;gBACrB,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE;aACtC,CAAC;YAEF,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY;gBAChC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE;gBAC/C,CAAC,CAAC,cAAc,CAAC;YAEnB,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACpD,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAMjB;QACC,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,cAAc,GAAwB,EAAE,CAAC;YAC/C,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACjC,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC1C,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACrC,cAAc,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;YAClD,CAAC;YACD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACrC,cAAc,CAAC,SAAS,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;YACxD,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY;gBAChC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE;gBAC/C,CAAC,CAAC,cAAc,CAAC;YAEnB,OAAO,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QACrE,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,kBAAkB,CACvB,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,QAAQ,CAAC,EAC3C,2BAA2B,CAC5B,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAIrB;QACC,OAAO,kBAAkB,CAAC,KAAK,IAAI,EAAE;YACnC,MAAM,WAAW,GAAiE;gBAChF,UAAU,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE;aACxC,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,WAAW,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACrC,CAAC;YACD,OAAO,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjE,CAAC,EAAE,2BAA2B,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,cAAc;QACnB,MAAM,eAAe,GAAG,CAAC,gBAAgB,CAAU,CAAC;QACpD,MAAM,WAAW,GAAa,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACvF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;YAC9D,WAAW,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,YAAY,EAAE;QACZ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QACjF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC9E,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;KACpE;IACD,QAAQ,EAAE;QACR,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC3E;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KAC3E;IACD,gBAAgB,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sFAAsF,CAAC;KACrH;IACD,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC7C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2FAA2F,CAAC;QAC7H,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qHAAqH,CAAC;QACvJ,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oLAAoL,CAAC;KAC1O;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QACjE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAC7F,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8LAA8L,CAAC;KACpP;IACD,cAAc,EAAE;QACd,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;KACjE;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAChE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2GAA2G,CAAC;QAC9I,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mIAAmI,CAAC;KACnL;CACF,CAAC"}
|
package/jest.config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
preset: 'ts-jest/presets/default-esm',
|
|
3
|
+
extensionsToTreatAsEsm: ['.ts'],
|
|
4
|
+
moduleNameMapper: {
|
|
5
|
+
'^(\\.{1,2}/.*)\\.js$': '$1',
|
|
6
|
+
'^@atlassian-dc-mcp/common$': '<rootDir>/../common/src/index.ts',
|
|
7
|
+
},
|
|
8
|
+
transform: {
|
|
9
|
+
'^.+\\.ts$': ['ts-jest', {
|
|
10
|
+
useESM: true,
|
|
11
|
+
}],
|
|
12
|
+
},
|
|
13
|
+
transformIgnorePatterns: [
|
|
14
|
+
'node_modules/(?!(@atlassian-dc-mcp)/)',
|
|
15
|
+
],
|
|
16
|
+
testEnvironment: 'node',
|
|
17
|
+
testMatch: ['**/__tests__/**/*.test.ts'],
|
|
18
|
+
collectCoverageFrom: [
|
|
19
|
+
'src/**/*.ts',
|
|
20
|
+
'!src/**/*.d.ts',
|
|
21
|
+
'!src/**/index.ts',
|
|
22
|
+
],
|
|
23
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlassian-dc-mcp/jira",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"main": "build/index.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": "./bin/run.js",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"test": "jest"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@atlassian-dc-mcp/common": "^0.
|
|
18
|
+
"@atlassian-dc-mcp/common": "^0.10.0",
|
|
19
19
|
"@modelcontextprotocol/sdk": "^1.17.5",
|
|
20
20
|
"dotenv": "^16.4.7",
|
|
21
21
|
"zod": "^3.24.2"
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"publishConfig": {
|
|
30
30
|
"access": "public"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "4d6c116d52820c933461c564755caa76a717ae08"
|
|
33
33
|
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { JiraService } from '../jira-service.js';
|
|
2
|
+
import { IssueService } from '../jira-client/index.js';
|
|
3
|
+
|
|
4
|
+
jest.mock('../jira-client/index.js', () => ({
|
|
5
|
+
IssueService: {
|
|
6
|
+
getTransitions: jest.fn(),
|
|
7
|
+
doTransition: jest.fn(),
|
|
8
|
+
getIssue: jest.fn(),
|
|
9
|
+
editIssue: jest.fn(),
|
|
10
|
+
createIssue: jest.fn(),
|
|
11
|
+
getComments: jest.fn(),
|
|
12
|
+
addComment: jest.fn(),
|
|
13
|
+
},
|
|
14
|
+
SearchService: {
|
|
15
|
+
searchUsingSearchRequest: jest.fn(),
|
|
16
|
+
},
|
|
17
|
+
OpenAPI: {
|
|
18
|
+
BASE: '',
|
|
19
|
+
TOKEN: '',
|
|
20
|
+
VERSION: '',
|
|
21
|
+
},
|
|
22
|
+
}));
|
|
23
|
+
|
|
24
|
+
describe('JiraService', () => {
|
|
25
|
+
let jiraService: JiraService;
|
|
26
|
+
const mockIssueKey = 'PROJ-123';
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
jiraService = new JiraService('test-host', 'test-token');
|
|
30
|
+
jest.clearAllMocks();
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('getTransitions', () => {
|
|
34
|
+
it('should successfully get available transitions for an issue', async () => {
|
|
35
|
+
const mockTransitionsData = {
|
|
36
|
+
transitions: [
|
|
37
|
+
{
|
|
38
|
+
id: '21',
|
|
39
|
+
name: 'Start Progress',
|
|
40
|
+
to: {
|
|
41
|
+
id: '3',
|
|
42
|
+
name: 'In Progress',
|
|
43
|
+
statusCategory: { name: 'In Progress' },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: '31',
|
|
48
|
+
name: 'Done',
|
|
49
|
+
to: {
|
|
50
|
+
id: '4',
|
|
51
|
+
name: 'Done',
|
|
52
|
+
statusCategory: { name: 'Done' },
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
(IssueService.getTransitions as jest.Mock).mockResolvedValue(mockTransitionsData);
|
|
58
|
+
|
|
59
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
60
|
+
|
|
61
|
+
expect(result.success).toBe(true);
|
|
62
|
+
expect(result.data).toBe(mockTransitionsData);
|
|
63
|
+
expect(IssueService.getTransitions).toHaveBeenCalledWith(mockIssueKey);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it('should return empty transitions array when no transitions available', async () => {
|
|
67
|
+
const mockTransitionsData = {
|
|
68
|
+
transitions: [],
|
|
69
|
+
};
|
|
70
|
+
(IssueService.getTransitions as jest.Mock).mockResolvedValue(mockTransitionsData);
|
|
71
|
+
|
|
72
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
73
|
+
|
|
74
|
+
expect(result.success).toBe(true);
|
|
75
|
+
expect(result.data).toBe(mockTransitionsData);
|
|
76
|
+
expect(result.data?.transitions).toHaveLength(0);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('should handle API errors gracefully', async () => {
|
|
80
|
+
const mockError = new Error('Issue not found');
|
|
81
|
+
(IssueService.getTransitions as jest.Mock).mockRejectedValue(mockError);
|
|
82
|
+
|
|
83
|
+
const result = await jiraService.getTransitions(mockIssueKey);
|
|
84
|
+
|
|
85
|
+
expect(result.success).toBe(false);
|
|
86
|
+
expect(result.error).toBe('Issue not found');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('should handle permission errors', async () => {
|
|
90
|
+
const mockError = new Error('Insufficient permissions to view transitions');
|
|
91
|
+
(IssueService.getTransitions as jest.Mock).mockRejectedValue(mockError);
|
|
92
|
+
|
|
93
|
+
const result = await jiraService.getTransitions('RESTRICTED-1');
|
|
94
|
+
|
|
95
|
+
expect(result.success).toBe(false);
|
|
96
|
+
expect(result.error).toBe('Insufficient permissions to view transitions');
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
describe('transitionIssue', () => {
|
|
101
|
+
it('should successfully transition an issue to a new status', async () => {
|
|
102
|
+
(IssueService.doTransition as jest.Mock).mockResolvedValue(undefined);
|
|
103
|
+
|
|
104
|
+
const result = await jiraService.transitionIssue({
|
|
105
|
+
issueKey: mockIssueKey,
|
|
106
|
+
transitionId: '21',
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
expect(result.success).toBe(true);
|
|
110
|
+
expect(IssueService.doTransition).toHaveBeenCalledWith(mockIssueKey, {
|
|
111
|
+
transition: { id: '21' },
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it('should successfully transition with additional fields', async () => {
|
|
116
|
+
(IssueService.doTransition as jest.Mock).mockResolvedValue(undefined);
|
|
117
|
+
|
|
118
|
+
const result = await jiraService.transitionIssue({
|
|
119
|
+
issueKey: mockIssueKey,
|
|
120
|
+
transitionId: '31',
|
|
121
|
+
fields: {
|
|
122
|
+
resolution: { name: 'Done' },
|
|
123
|
+
comment: { body: 'Closing this issue' },
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
expect(result.success).toBe(true);
|
|
128
|
+
expect(IssueService.doTransition).toHaveBeenCalledWith(mockIssueKey, {
|
|
129
|
+
transition: { id: '31' },
|
|
130
|
+
fields: {
|
|
131
|
+
resolution: { name: 'Done' },
|
|
132
|
+
comment: { body: 'Closing this issue' },
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should handle invalid transition ID errors', async () => {
|
|
138
|
+
const mockError = new Error('Invalid transition ID');
|
|
139
|
+
(IssueService.doTransition as jest.Mock).mockRejectedValue(mockError);
|
|
140
|
+
|
|
141
|
+
const result = await jiraService.transitionIssue({
|
|
142
|
+
issueKey: mockIssueKey,
|
|
143
|
+
transitionId: '999',
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
expect(result.success).toBe(false);
|
|
147
|
+
expect(result.error).toBe('Invalid transition ID');
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('should handle missing required fields errors', async () => {
|
|
151
|
+
const mockError = new Error('Resolution field is required');
|
|
152
|
+
(IssueService.doTransition as jest.Mock).mockRejectedValue(mockError);
|
|
153
|
+
|
|
154
|
+
const result = await jiraService.transitionIssue({
|
|
155
|
+
issueKey: mockIssueKey,
|
|
156
|
+
transitionId: '31',
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
expect(result.success).toBe(false);
|
|
160
|
+
expect(result.error).toBe('Resolution field is required');
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should handle permission errors', async () => {
|
|
164
|
+
const mockError = new Error('User does not have permission to transition this issue');
|
|
165
|
+
(IssueService.doTransition as jest.Mock).mockRejectedValue(mockError);
|
|
166
|
+
|
|
167
|
+
const result = await jiraService.transitionIssue({
|
|
168
|
+
issueKey: 'RESTRICTED-1',
|
|
169
|
+
transitionId: '21',
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
expect(result.success).toBe(false);
|
|
173
|
+
expect(result.error).toBe('User does not have permission to transition this issue');
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should handle issue not found errors', async () => {
|
|
177
|
+
const mockError = new Error('Issue does not exist');
|
|
178
|
+
(IssueService.doTransition as jest.Mock).mockRejectedValue(mockError);
|
|
179
|
+
|
|
180
|
+
const result = await jiraService.transitionIssue({
|
|
181
|
+
issueKey: 'NONEXISTENT-999',
|
|
182
|
+
transitionId: '21',
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
expect(result.success).toBe(false);
|
|
186
|
+
expect(result.error).toBe('Issue does not exist');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe('validateConfig', () => {
|
|
191
|
+
const originalEnv = process.env;
|
|
192
|
+
|
|
193
|
+
beforeEach(() => {
|
|
194
|
+
jest.resetModules();
|
|
195
|
+
process.env = { ...originalEnv };
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
afterAll(() => {
|
|
199
|
+
process.env = originalEnv;
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
it('should return empty array when all required env vars are present', () => {
|
|
203
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
204
|
+
process.env.JIRA_HOST = 'test-host';
|
|
205
|
+
|
|
206
|
+
const missingVars = JiraService.validateConfig();
|
|
207
|
+
expect(missingVars).toEqual([]);
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('should return missing vars when JIRA_API_TOKEN is missing', () => {
|
|
211
|
+
delete process.env.JIRA_API_TOKEN;
|
|
212
|
+
process.env.JIRA_HOST = 'test-host';
|
|
213
|
+
|
|
214
|
+
const missingVars = JiraService.validateConfig();
|
|
215
|
+
expect(missingVars).toContain('JIRA_API_TOKEN');
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('should return missing vars when both host options are missing', () => {
|
|
219
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
220
|
+
delete process.env.JIRA_HOST;
|
|
221
|
+
delete process.env.JIRA_API_BASE_PATH;
|
|
222
|
+
|
|
223
|
+
const missingVars = JiraService.validateConfig();
|
|
224
|
+
expect(missingVars).toContain('JIRA_HOST or JIRA_API_BASE_PATH');
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it('should accept JIRA_API_BASE_PATH as alternative to JIRA_HOST', () => {
|
|
228
|
+
process.env.JIRA_API_TOKEN = 'test-token';
|
|
229
|
+
delete process.env.JIRA_HOST;
|
|
230
|
+
process.env.JIRA_API_BASE_PATH = 'https://test-host/rest';
|
|
231
|
+
|
|
232
|
+
const missingVars = JiraService.validateConfig();
|
|
233
|
+
expect(missingVars).toEqual([]);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
});
|