@elisra-devops/docgen-data-provider 1.22.0 → 1.24.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/bin/helpers/helper.js.map +1 -1
- package/bin/helpers/test/tfs.test.d.ts +1 -0
- package/bin/helpers/test/tfs.test.js +613 -0
- package/bin/helpers/test/tfs.test.js.map +1 -0
- package/bin/helpers/tfs.js +1 -1
- package/bin/helpers/tfs.js.map +1 -1
- package/bin/modules/GitDataProvider.js.map +1 -1
- package/bin/modules/PipelinesDataProvider.js +3 -2
- package/bin/modules/PipelinesDataProvider.js.map +1 -1
- package/bin/modules/ResultDataProvider.d.ts +200 -17
- package/bin/modules/ResultDataProvider.js +628 -195
- package/bin/modules/ResultDataProvider.js.map +1 -1
- package/bin/modules/TestDataProvider.js +7 -7
- package/bin/modules/TestDataProvider.js.map +1 -1
- package/bin/modules/TicketsDataProvider.d.ts +1 -1
- package/bin/modules/TicketsDataProvider.js +3 -2
- package/bin/modules/TicketsDataProvider.js.map +1 -1
- package/bin/modules/test/JfrogDataProvider.test.d.ts +1 -0
- package/bin/modules/test/JfrogDataProvider.test.js +110 -0
- package/bin/modules/test/JfrogDataProvider.test.js.map +1 -0
- package/bin/modules/test/ResultDataProvider.test.d.ts +1 -0
- package/bin/modules/test/ResultDataProvider.test.js +478 -0
- package/bin/modules/test/ResultDataProvider.test.js.map +1 -0
- package/bin/modules/test/gitDataProvider.test.js +424 -120
- package/bin/modules/test/gitDataProvider.test.js.map +1 -1
- package/bin/modules/test/managmentDataProvider.test.js +283 -28
- package/bin/modules/test/managmentDataProvider.test.js.map +1 -1
- package/bin/modules/test/pipelineDataProvider.test.js +229 -45
- package/bin/modules/test/pipelineDataProvider.test.js.map +1 -1
- package/bin/modules/test/testDataProvider.test.js +225 -81
- package/bin/modules/test/testDataProvider.test.js.map +1 -1
- package/bin/modules/test/ticketsDataProvider.test.js +310 -82
- package/bin/modules/test/ticketsDataProvider.test.js.map +1 -1
- package/package.json +1 -1
- package/src/helpers/helper.ts +16 -14
- package/src/helpers/test/tfs.test.ts +748 -0
- package/src/helpers/tfs.ts +1 -1
- package/src/modules/GitDataProvider.ts +10 -10
- package/src/modules/PipelinesDataProvider.ts +2 -2
- package/src/modules/ResultDataProvider.ts +834 -260
- package/src/modules/TestDataProvider.ts +8 -8
- package/src/modules/TicketsDataProvider.ts +5 -9
- package/src/modules/test/JfrogDataProvider.test.ts +171 -0
- package/src/modules/test/ResultDataProvider.test.ts +581 -0
- package/src/modules/test/gitDataProvider.test.ts +671 -187
- package/src/modules/test/managmentDataProvider.test.ts +386 -26
- package/src/modules/test/pipelineDataProvider.test.ts +281 -52
- package/src/modules/test/testDataProvider.test.ts +307 -105
- package/src/modules/test/ticketsDataProvider.test.ts +425 -129
|
@@ -1,63 +1,292 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { PipelineRun } from '../../models/tfs-data';
|
|
2
|
+
import { TFSServices } from '../../helpers/tfs';
|
|
3
|
+
import PipelinesDataProvider from '../PipelinesDataProvider';
|
|
4
|
+
import GitDataProvider from '../GitDataProvider';
|
|
5
|
+
import logger from '../../utils/logger';
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
jest.
|
|
7
|
+
jest.mock('../../helpers/tfs');
|
|
8
|
+
jest.mock('../../utils/logger');
|
|
9
|
+
jest.mock('../GitDataProvider');
|
|
5
10
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
11
|
+
describe('PipelinesDataProvider', () => {
|
|
12
|
+
let pipelinesDataProvider: PipelinesDataProvider;
|
|
13
|
+
const mockOrgUrl = 'https://dev.azure.com/orgname/';
|
|
14
|
+
const mockToken = 'mock-token';
|
|
9
15
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
let json = await pipelinesDataProvider.getPipelineBuildByBuildId('tests', 244);
|
|
14
|
-
expect(json.id).toBe(244);
|
|
15
|
-
});
|
|
16
|
-
test('should return Release definition', async () => {
|
|
17
|
-
let pipelinesDataProvider = await dgDataProviderAzureDevOps.getPipelinesDataProvider();
|
|
18
|
-
let json = await pipelinesDataProvider.GetReleaseByReleaseId('tests', 1);
|
|
19
|
-
expect(json.id).toBe(1);
|
|
20
|
-
});
|
|
21
|
-
test('should return OK(200) as response ', async () => {
|
|
22
|
-
let PipelineDataProvider = await dgDataProviderAzureDevOps.getPipelinesDataProvider();
|
|
23
|
-
let result = await PipelineDataProvider.TriggerBuildById(
|
|
24
|
-
'tests',
|
|
25
|
-
'14',
|
|
26
|
-
'{"test":"param1","age":"26","name":"denis" }'
|
|
27
|
-
);
|
|
28
|
-
expect(result.status).toBe(200);
|
|
29
|
-
});
|
|
30
|
-
test('should the path to zip file as response ', async () => {
|
|
31
|
-
let PipelineDataProvider = await dgDataProviderAzureDevOps.getPipelinesDataProvider();
|
|
32
|
-
let result = await PipelineDataProvider.GetArtifactByBuildId(
|
|
33
|
-
'tests',
|
|
34
|
-
'245', //buildId
|
|
35
|
-
'_tests' //artifactName
|
|
36
|
-
);
|
|
37
|
-
expect(result).toBeDefined();
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
jest.clearAllMocks();
|
|
18
|
+
pipelinesDataProvider = new PipelinesDataProvider(mockOrgUrl, mockToken);
|
|
38
19
|
});
|
|
39
20
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
21
|
+
describe('isMatchingPipeline', () => {
|
|
22
|
+
// Create test method to access private method
|
|
23
|
+
const invokeIsMatchingPipeline = (
|
|
24
|
+
fromPipeline: PipelineRun,
|
|
25
|
+
targetPipeline: PipelineRun,
|
|
26
|
+
searchPrevPipelineFromDifferentCommit: boolean
|
|
27
|
+
): boolean => {
|
|
28
|
+
return (pipelinesDataProvider as any).isMatchingPipeline(
|
|
29
|
+
fromPipeline,
|
|
30
|
+
targetPipeline,
|
|
31
|
+
searchPrevPipelineFromDifferentCommit
|
|
32
|
+
);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
it('should return false when repository IDs are different', () => {
|
|
36
|
+
// Arrange
|
|
37
|
+
const fromPipeline = {
|
|
38
|
+
resources: {
|
|
39
|
+
repositories: {
|
|
40
|
+
'0': {
|
|
41
|
+
self: {
|
|
42
|
+
repository: { id: 'repo1' },
|
|
43
|
+
version: 'v1',
|
|
44
|
+
refName: 'refs/heads/main'
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} as unknown as PipelineRun;
|
|
50
|
+
|
|
51
|
+
const targetPipeline = {
|
|
52
|
+
resources: {
|
|
53
|
+
repositories: {
|
|
54
|
+
'0': {
|
|
55
|
+
self: {
|
|
56
|
+
repository: { id: 'repo2' },
|
|
57
|
+
version: 'v1',
|
|
58
|
+
refName: 'refs/heads/main'
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} as unknown as PipelineRun;
|
|
64
|
+
|
|
65
|
+
// Act
|
|
66
|
+
const result = invokeIsMatchingPipeline(fromPipeline, targetPipeline, false);
|
|
67
|
+
|
|
68
|
+
// Assert
|
|
69
|
+
expect(result).toBe(false);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should return true when versions are the same and searchPrevPipelineFromDifferentCommit is false', () => {
|
|
73
|
+
// Arrange
|
|
74
|
+
const fromPipeline = {
|
|
75
|
+
resources: {
|
|
76
|
+
repositories: {
|
|
77
|
+
'0': {
|
|
78
|
+
self: {
|
|
79
|
+
repository: { id: 'repo1' },
|
|
80
|
+
version: 'v1',
|
|
81
|
+
refName: 'refs/heads/main'
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} as unknown as PipelineRun;
|
|
87
|
+
|
|
88
|
+
const targetPipeline = {
|
|
89
|
+
resources: {
|
|
90
|
+
repositories: {
|
|
91
|
+
'0': {
|
|
92
|
+
self: {
|
|
93
|
+
repository: { id: 'repo1' },
|
|
94
|
+
version: 'v1',
|
|
95
|
+
refName: 'refs/heads/main'
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
} as unknown as PipelineRun;
|
|
101
|
+
|
|
102
|
+
// Act
|
|
103
|
+
const result = invokeIsMatchingPipeline(fromPipeline, targetPipeline, false);
|
|
104
|
+
|
|
105
|
+
// Assert
|
|
106
|
+
expect(result).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should return false when versions are the same and searchPrevPipelineFromDifferentCommit is true', () => {
|
|
110
|
+
// Arrange
|
|
111
|
+
const fromPipeline = {
|
|
112
|
+
resources: {
|
|
113
|
+
repositories: {
|
|
114
|
+
'0': {
|
|
115
|
+
self: {
|
|
116
|
+
repository: { id: 'repo1' },
|
|
117
|
+
version: 'v1',
|
|
118
|
+
refName: 'refs/heads/main'
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} as unknown as PipelineRun;
|
|
124
|
+
|
|
125
|
+
const targetPipeline = {
|
|
126
|
+
resources: {
|
|
127
|
+
repositories: {
|
|
128
|
+
'0': {
|
|
129
|
+
self: {
|
|
130
|
+
repository: { id: 'repo1' },
|
|
131
|
+
version: 'v1',
|
|
132
|
+
refName: 'refs/heads/main'
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
} as unknown as PipelineRun;
|
|
138
|
+
|
|
139
|
+
// Act
|
|
140
|
+
const result = invokeIsMatchingPipeline(fromPipeline, targetPipeline, true);
|
|
45
141
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
142
|
+
// Assert
|
|
143
|
+
expect(result).toBe(false);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should return true when refNames match but versions differ', () => {
|
|
147
|
+
// Arrange
|
|
148
|
+
const fromPipeline = {
|
|
149
|
+
resources: {
|
|
150
|
+
repositories: {
|
|
151
|
+
'0': {
|
|
152
|
+
self: {
|
|
153
|
+
repository: { id: 'repo1' },
|
|
154
|
+
version: 'v1',
|
|
155
|
+
refName: 'refs/heads/main'
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
} as unknown as PipelineRun;
|
|
161
|
+
|
|
162
|
+
const targetPipeline = {
|
|
163
|
+
resources: {
|
|
164
|
+
repositories: {
|
|
165
|
+
'0': {
|
|
166
|
+
self: {
|
|
167
|
+
repository: { id: 'repo1' },
|
|
168
|
+
version: 'v2',
|
|
169
|
+
refName: 'refs/heads/main'
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} as unknown as PipelineRun;
|
|
175
|
+
|
|
176
|
+
// Act
|
|
177
|
+
const result = invokeIsMatchingPipeline(fromPipeline, targetPipeline, true);
|
|
178
|
+
|
|
179
|
+
// Assert
|
|
180
|
+
expect(result).toBe(true);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('should use __designer_repo when self is not available', () => {
|
|
184
|
+
// Arrange
|
|
185
|
+
const fromPipeline = {
|
|
186
|
+
resources: {
|
|
187
|
+
repositories: {
|
|
188
|
+
__designer_repo: {
|
|
189
|
+
repository: { id: 'repo1' },
|
|
190
|
+
version: 'v1',
|
|
191
|
+
refName: 'refs/heads/main'
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} as unknown as PipelineRun;
|
|
196
|
+
|
|
197
|
+
const targetPipeline = {
|
|
198
|
+
resources: {
|
|
199
|
+
repositories: {
|
|
200
|
+
__designer_repo: {
|
|
201
|
+
repository: { id: 'repo1' },
|
|
202
|
+
version: 'v1',
|
|
203
|
+
refName: 'refs/heads/main'
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
} as unknown as PipelineRun;
|
|
208
|
+
|
|
209
|
+
// Act
|
|
210
|
+
const result = invokeIsMatchingPipeline(fromPipeline, targetPipeline, false);
|
|
211
|
+
|
|
212
|
+
// Assert
|
|
213
|
+
expect(result).toBe(true);
|
|
214
|
+
});
|
|
50
215
|
});
|
|
51
216
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
217
|
+
describe('getPipelineRunDetails', () => {
|
|
218
|
+
it('should call TFSServices.getItemContent with correct parameters', async () => {
|
|
219
|
+
// Arrange
|
|
220
|
+
const projectName = 'project1';
|
|
221
|
+
const pipelineId = 123;
|
|
222
|
+
const runId = 456;
|
|
223
|
+
const mockResponse = { id: runId, resources: {} };
|
|
224
|
+
(TFSServices.getItemContent as jest.Mock).mockResolvedValueOnce(mockResponse);
|
|
225
|
+
|
|
226
|
+
// Act
|
|
227
|
+
const result = await pipelinesDataProvider.getPipelineRunDetails(projectName, pipelineId, runId);
|
|
228
|
+
|
|
229
|
+
// Assert
|
|
230
|
+
expect(TFSServices.getItemContent).toHaveBeenCalledWith(
|
|
231
|
+
`${mockOrgUrl}${projectName}/_apis/pipelines/${pipelineId}/runs/${runId}`,
|
|
232
|
+
mockToken
|
|
233
|
+
);
|
|
234
|
+
expect(result).toEqual(mockResponse);
|
|
235
|
+
});
|
|
56
236
|
});
|
|
57
237
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
238
|
+
describe('GetPipelineRunHistory', () => {
|
|
239
|
+
it('should return filtered pipeline run history', async () => {
|
|
240
|
+
// Arrange
|
|
241
|
+
const projectName = 'project1';
|
|
242
|
+
const pipelineId = '123';
|
|
243
|
+
const mockResponse = {
|
|
244
|
+
value: [
|
|
245
|
+
{ id: 1, result: 'succeeded' },
|
|
246
|
+
{ id: 2, result: 'failed' },
|
|
247
|
+
{ id: 3, result: 'canceled' },
|
|
248
|
+
{ id: 4, result: 'succeeded' }
|
|
249
|
+
]
|
|
250
|
+
};
|
|
251
|
+
(TFSServices.getItemContent as jest.Mock).mockResolvedValueOnce(mockResponse);
|
|
252
|
+
|
|
253
|
+
// Act
|
|
254
|
+
const result = await pipelinesDataProvider.GetPipelineRunHistory(projectName, pipelineId);
|
|
255
|
+
|
|
256
|
+
// Assert
|
|
257
|
+
expect(TFSServices.getItemContent).toHaveBeenCalledWith(
|
|
258
|
+
`${mockOrgUrl}${projectName}/_apis/pipelines/${pipelineId}/runs`,
|
|
259
|
+
mockToken,
|
|
260
|
+
'get',
|
|
261
|
+
null,
|
|
262
|
+
null
|
|
263
|
+
);
|
|
264
|
+
expect(result).toEqual({
|
|
265
|
+
count: 4, // Note: Current filter logic keeps all runs where result is not 'failed' AND not 'canceled'
|
|
266
|
+
value: mockResponse.value
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
it('should handle API errors gracefully', async () => {
|
|
271
|
+
// Arrange
|
|
272
|
+
const projectName = 'project1';
|
|
273
|
+
const pipelineId = '123';
|
|
274
|
+
const expectedError = new Error('API error');
|
|
275
|
+
(TFSServices.getItemContent as jest.Mock).mockRejectedValueOnce(expectedError);
|
|
276
|
+
|
|
277
|
+
// Act
|
|
278
|
+
const result = await pipelinesDataProvider.GetPipelineRunHistory(projectName, pipelineId);
|
|
279
|
+
|
|
280
|
+
// Assert
|
|
281
|
+
expect(TFSServices.getItemContent).toHaveBeenCalledWith(
|
|
282
|
+
`${mockOrgUrl}${projectName}/_apis/pipelines/${pipelineId}/runs`,
|
|
283
|
+
mockToken,
|
|
284
|
+
'get',
|
|
285
|
+
null,
|
|
286
|
+
null
|
|
287
|
+
);
|
|
288
|
+
expect(logger.error).toHaveBeenCalledWith(`Could not fetch Pipeline Run History: ${expectedError.message}`);
|
|
289
|
+
expect(result).toBeUndefined();
|
|
290
|
+
});
|
|
62
291
|
});
|
|
63
|
-
});
|
|
292
|
+
});
|