@elisra-devops/docgen-data-provider 1.63.13 → 1.67.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.
Files changed (91) hide show
  1. package/.github/workflows/ci.yml +26 -9
  2. package/.github/workflows/release.yml +9 -10
  3. package/bin/helpers/tfs.d.ts +3 -0
  4. package/bin/helpers/tfs.js +44 -7
  5. package/bin/helpers/tfs.js.map +1 -1
  6. package/bin/modules/GitDataProvider.d.ts +10 -0
  7. package/bin/modules/GitDataProvider.js +10 -0
  8. package/bin/modules/GitDataProvider.js.map +1 -1
  9. package/bin/modules/TestDataProvider.js +0 -1
  10. package/bin/modules/TestDataProvider.js.map +1 -1
  11. package/bin/modules/TicketsDataProvider.d.ts +63 -24
  12. package/bin/modules/TicketsDataProvider.js +216 -114
  13. package/bin/modules/TicketsDataProvider.js.map +1 -1
  14. package/bin/tests/helpers/helper.test.js +279 -0
  15. package/bin/tests/helpers/helper.test.js.map +1 -0
  16. package/bin/{helpers/test → tests/helpers}/tfs.test.js +312 -49
  17. package/bin/tests/helpers/tfs.test.js.map +1 -0
  18. package/bin/tests/index.test.js +25 -0
  19. package/bin/tests/index.test.js.map +1 -0
  20. package/bin/tests/models/tfs-data.test.js +160 -0
  21. package/bin/tests/models/tfs-data.test.js.map +1 -0
  22. package/bin/{modules/test → tests/modules}/JfrogDataProvider.test.js +9 -9
  23. package/bin/tests/modules/JfrogDataProvider.test.js.map +1 -0
  24. package/bin/tests/modules/ResultDataProvider.test.js +1942 -0
  25. package/bin/tests/modules/ResultDataProvider.test.js.map +1 -0
  26. package/bin/tests/modules/gitDataProvider.test.js +1888 -0
  27. package/bin/tests/modules/gitDataProvider.test.js.map +1 -0
  28. package/bin/{modules/test → tests/modules}/managmentDataProvider.test.js +13 -1
  29. package/bin/tests/modules/managmentDataProvider.test.js.map +1 -0
  30. package/bin/tests/modules/pipelineDataProvider.test.d.ts +1 -0
  31. package/bin/tests/modules/pipelineDataProvider.test.js +783 -0
  32. package/bin/tests/modules/pipelineDataProvider.test.js.map +1 -0
  33. package/bin/tests/modules/testDataProvider.test.d.ts +1 -0
  34. package/bin/tests/modules/testDataProvider.test.js +717 -0
  35. package/bin/tests/modules/testDataProvider.test.js.map +1 -0
  36. package/bin/tests/modules/ticketsDataProvider.test.d.ts +1 -0
  37. package/bin/tests/modules/ticketsDataProvider.test.js +1681 -0
  38. package/bin/tests/modules/ticketsDataProvider.test.js.map +1 -0
  39. package/bin/tests/utils/DataProviderUtils.test.d.ts +1 -0
  40. package/bin/tests/utils/DataProviderUtils.test.js +61 -0
  41. package/bin/tests/utils/DataProviderUtils.test.js.map +1 -0
  42. package/bin/tests/utils/testStepParserHelper.test.d.ts +1 -0
  43. package/bin/tests/utils/testStepParserHelper.test.js +359 -0
  44. package/bin/tests/utils/testStepParserHelper.test.js.map +1 -0
  45. package/package.json +9 -1
  46. package/src/helpers/tfs.ts +51 -7
  47. package/src/modules/GitDataProvider.ts +10 -0
  48. package/src/modules/TestDataProvider.ts +0 -1
  49. package/src/modules/TicketsDataProvider.ts +298 -141
  50. package/src/tests/helpers/helper.test.ts +337 -0
  51. package/src/tests/helpers/tfs.test.ts +1092 -0
  52. package/src/tests/index.test.ts +28 -0
  53. package/src/tests/models/tfs-data.test.ts +203 -0
  54. package/src/tests/modules/JfrogDataProvider.test.ts +167 -0
  55. package/src/tests/modules/ResultDataProvider.test.ts +2571 -0
  56. package/src/tests/modules/gitDataProvider.test.ts +2628 -0
  57. package/src/{modules/test → tests/modules}/managmentDataProvider.test.ts +33 -1
  58. package/src/tests/modules/pipelineDataProvider.test.ts +1038 -0
  59. package/src/tests/modules/testDataProvider.test.ts +1046 -0
  60. package/src/tests/modules/ticketsDataProvider.test.ts +2204 -0
  61. package/src/tests/utils/DataProviderUtils.test.ts +76 -0
  62. package/src/tests/utils/testStepParserHelper.test.ts +437 -0
  63. package/tsconfig.json +1 -0
  64. package/bin/helpers/test/tfs.test.js.map +0 -1
  65. package/bin/modules/test/JfrogDataProvider.test.js.map +0 -1
  66. package/bin/modules/test/ResultDataProvider.test.js +0 -444
  67. package/bin/modules/test/ResultDataProvider.test.js.map +0 -1
  68. package/bin/modules/test/gitDataProvider.test.js +0 -428
  69. package/bin/modules/test/gitDataProvider.test.js.map +0 -1
  70. package/bin/modules/test/managmentDataProvider.test.js.map +0 -1
  71. package/bin/modules/test/pipelineDataProvider.test.js +0 -237
  72. package/bin/modules/test/pipelineDataProvider.test.js.map +0 -1
  73. package/bin/modules/test/testDataProvider.test.js +0 -234
  74. package/bin/modules/test/testDataProvider.test.js.map +0 -1
  75. package/bin/modules/test/ticketsDataProvider.test.js +0 -348
  76. package/bin/modules/test/ticketsDataProvider.test.js.map +0 -1
  77. package/src/helpers/test/tfs.test.ts +0 -748
  78. package/src/modules/test/JfrogDataProvider.test.ts +0 -171
  79. package/src/modules/test/ResultDataProvider.test.ts +0 -542
  80. package/src/modules/test/gitDataProvider.test.ts +0 -645
  81. package/src/modules/test/pipelineDataProvider.test.ts +0 -292
  82. package/src/modules/test/testDataProvider.test.ts +0 -318
  83. package/src/modules/test/ticketsDataProvider.test.ts +0 -462
  84. /package/bin/{helpers/test/tfs.test.d.ts → tests/helpers/helper.test.d.ts} +0 -0
  85. /package/bin/{modules/test/JfrogDataProvider.test.d.ts → tests/helpers/tfs.test.d.ts} +0 -0
  86. /package/bin/{modules/test/ResultDataProvider.test.d.ts → tests/index.test.d.ts} +0 -0
  87. /package/bin/{modules/test/gitDataProvider.test.d.ts → tests/models/tfs-data.test.d.ts} +0 -0
  88. /package/bin/{modules/test/managmentDataProvider.test.d.ts → tests/modules/JfrogDataProvider.test.d.ts} +0 -0
  89. /package/bin/{modules/test/pipelineDataProvider.test.d.ts → tests/modules/ResultDataProvider.test.d.ts} +0 -0
  90. /package/bin/{modules/test/testDataProvider.test.d.ts → tests/modules/gitDataProvider.test.d.ts} +0 -0
  91. /package/bin/{modules/test/ticketsDataProvider.test.d.ts → tests/modules/managmentDataProvider.test.d.ts} +0 -0
@@ -0,0 +1,337 @@
1
+ import { Helper, suiteData, Relations, Links, Trace } from '../../helpers/helper';
2
+ import { Query, Workitem } from '../../models/tfs-data';
3
+
4
+ describe('Helper', () => {
5
+ beforeEach(() => {
6
+ // Reset static state before each test
7
+ Helper.suitList = [];
8
+ Helper.level = 1;
9
+ Helper.first = true;
10
+ Helper.levelList = [];
11
+ });
12
+
13
+ describe('suiteData class', () => {
14
+ it('should create suiteData with correct properties', () => {
15
+ // Act
16
+ const suite = new suiteData('Test Suite', '123', '456', 2);
17
+
18
+ // Assert
19
+ expect(suite.name).toBe('Test Suite');
20
+ expect(suite.id).toBe('123');
21
+ expect(suite.parent).toBe('456');
22
+ expect(suite.level).toBe(2);
23
+ expect(suite.url).toBeUndefined();
24
+ });
25
+ });
26
+
27
+ describe('Relations class', () => {
28
+ it('should create Relations with empty rels array', () => {
29
+ // Act
30
+ const relations = new Relations();
31
+
32
+ // Assert
33
+ expect(relations.id).toBeUndefined();
34
+ expect(relations.rels).toEqual([]);
35
+ });
36
+
37
+ it('should allow adding relations', () => {
38
+ // Arrange
39
+ const relations = new Relations();
40
+ relations.id = '123';
41
+
42
+ // Act
43
+ relations.rels.push('456');
44
+ relations.rels.push('789');
45
+
46
+ // Assert
47
+ expect(relations.rels).toEqual(['456', '789']);
48
+ });
49
+ });
50
+
51
+ describe('Links class', () => {
52
+ it('should create Links with all properties', () => {
53
+ // Act
54
+ const link = new Links();
55
+ link.id = '123';
56
+ link.title = 'Test Link';
57
+ link.description = 'Test Description';
58
+ link.url = 'https://example.com';
59
+ link.type = 'Parent';
60
+ link.customerId = 'CUST-001';
61
+
62
+ // Assert
63
+ expect(link.id).toBe('123');
64
+ expect(link.title).toBe('Test Link');
65
+ expect(link.description).toBe('Test Description');
66
+ expect(link.url).toBe('https://example.com');
67
+ expect(link.type).toBe('Parent');
68
+ expect(link.customerId).toBe('CUST-001');
69
+ });
70
+ });
71
+
72
+ describe('Trace class', () => {
73
+ it('should create Trace with all properties', () => {
74
+ // Act
75
+ const trace = new Trace();
76
+ trace.id = '123';
77
+ trace.title = 'Test Trace';
78
+ trace.url = 'https://example.com';
79
+ trace.customerId = 'CUST-001';
80
+ trace.links = [];
81
+
82
+ // Assert
83
+ expect(trace.id).toBe('123');
84
+ expect(trace.title).toBe('Test Trace');
85
+ expect(trace.url).toBe('https://example.com');
86
+ expect(trace.customerId).toBe('CUST-001');
87
+ expect(trace.links).toEqual([]);
88
+ });
89
+ });
90
+
91
+ describe('findSuitesRecursive', () => {
92
+ const mockUrl = 'https://dev.azure.com/org/';
93
+ const mockProject = 'TestProject';
94
+ const mockPlanId = '100';
95
+
96
+ it('should find direct children of a root suite', () => {
97
+ // Arrange
98
+ const suits = [
99
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
100
+ { id: '2', title: 'Child Suite 1', parentSuiteId: '1' },
101
+ { id: '3', title: 'Child Suite 2', parentSuiteId: '1' },
102
+ ];
103
+
104
+ // Act
105
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
106
+
107
+ // Assert
108
+ expect(result.length).toBe(2);
109
+ expect(result[0].name).toBe('Child Suite 1');
110
+ expect(result[0].id).toBe('2');
111
+ expect(result[0].parent).toBe('1');
112
+ expect(result[1].name).toBe('Child Suite 2');
113
+ });
114
+
115
+ it('should find nested suites recursively', () => {
116
+ // Arrange
117
+ const suits = [
118
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
119
+ { id: '2', title: 'Child Suite 1', parentSuiteId: '1' },
120
+ { id: '3', title: 'Grandchild Suite', parentSuiteId: '2' },
121
+ ];
122
+
123
+ // Act
124
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
125
+
126
+ // Assert
127
+ expect(result.length).toBe(2);
128
+ expect(result[0].name).toBe('Child Suite 1');
129
+ expect(result[1].name).toBe('Grandchild Suite');
130
+ });
131
+
132
+ it('should not recurse when recursive is false', () => {
133
+ // Arrange
134
+ const suits = [
135
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
136
+ { id: '2', title: 'Child Suite 1', parentSuiteId: '1' },
137
+ { id: '3', title: 'Grandchild Suite', parentSuiteId: '2' },
138
+ ];
139
+
140
+ // Act - When recursive is false and starting from root (parentSuiteId=0),
141
+ // the function returns early without adding children
142
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', false);
143
+
144
+ // Assert - The root suite with parentSuiteId=0 doesn't get added to results
145
+ // and recursive=false means we return immediately
146
+ expect(result.length).toBe(0);
147
+ });
148
+
149
+ it('should handle finding a nested suite by ID', () => {
150
+ // Arrange
151
+ const suits = [
152
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
153
+ { id: '2', title: 'Child Suite 1', parentSuiteId: '1' },
154
+ { id: '3', title: 'Grandchild Suite', parentSuiteId: '2' },
155
+ ];
156
+
157
+ // Act
158
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '2', true);
159
+
160
+ // Assert
161
+ expect(result.length).toBe(2);
162
+ expect(result[0].name).toBe('Child Suite 1');
163
+ expect(result[1].name).toBe('Grandchild Suite');
164
+ });
165
+
166
+ it('should set correct URLs for suites', () => {
167
+ // Arrange
168
+ const suits = [
169
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
170
+ { id: '2', title: 'Child Suite', parentSuiteId: '1' },
171
+ ];
172
+
173
+ // Act
174
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
175
+
176
+ // Assert
177
+ expect(result[0].url).toBe(
178
+ `${mockUrl}${mockProject}/_testManagement?planId=${mockPlanId}&suiteId=2&_a=tests`
179
+ );
180
+ });
181
+
182
+ it('should return empty array when no children found', () => {
183
+ // Arrange
184
+ const suits = [{ id: '1', title: 'Root Suite', parentSuiteId: 0 }];
185
+
186
+ // Act
187
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
188
+
189
+ // Assert
190
+ expect(result).toEqual([]);
191
+ });
192
+
193
+ it('should handle root suite with parentSuiteId = 0', () => {
194
+ // Arrange
195
+ const suits = [
196
+ { id: '1', title: 'Root Suite', parentSuiteId: 0 },
197
+ { id: '2', title: 'Child Suite', parentSuiteId: '1' },
198
+ ];
199
+
200
+ // Act - Find starting from root with recursive=true to get children
201
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
202
+
203
+ // Assert - Should find the child suite
204
+ expect(result.length).toBe(1);
205
+ expect(result[0].name).toBe('Child Suite');
206
+ });
207
+
208
+ it('should handle deeply nested suites', () => {
209
+ // Arrange
210
+ const suits = [
211
+ { id: '1', title: 'Root', parentSuiteId: 0 },
212
+ { id: '2', title: 'Level 1', parentSuiteId: '1' },
213
+ { id: '3', title: 'Level 2', parentSuiteId: '2' },
214
+ { id: '4', title: 'Level 3', parentSuiteId: '3' },
215
+ { id: '5', title: 'Level 4', parentSuiteId: '4' },
216
+ ];
217
+
218
+ // Act
219
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
220
+
221
+ // Assert
222
+ expect(result.length).toBe(4);
223
+ expect(result.map((s) => s.name)).toEqual(['Level 1', 'Level 2', 'Level 3', 'Level 4']);
224
+ });
225
+
226
+ it('should handle multiple children at same level', () => {
227
+ // Arrange
228
+ const suits = [
229
+ { id: '1', title: 'Root', parentSuiteId: 0 },
230
+ { id: '2', title: 'Child A', parentSuiteId: '1' },
231
+ { id: '3', title: 'Child B', parentSuiteId: '1' },
232
+ { id: '4', title: 'Child C', parentSuiteId: '1' },
233
+ { id: '5', title: 'Grandchild A1', parentSuiteId: '2' },
234
+ { id: '6', title: 'Grandchild B1', parentSuiteId: '3' },
235
+ ];
236
+
237
+ // Act
238
+ const result = Helper.findSuitesRecursive(mockPlanId, mockUrl, mockProject, suits, '1', true);
239
+
240
+ // Assert
241
+ expect(result.length).toBe(5);
242
+ });
243
+ });
244
+
245
+ describe('LevelBuilder', () => {
246
+ it('should build work item hierarchy from query results', () => {
247
+ // Arrange
248
+ const mockQuery: Query = {
249
+ workItems: [
250
+ { Source: 0, fields: [{ value: '1' }], level: 0 } as unknown as Workitem,
251
+ { Source: '1', fields: [{ value: '2' }], level: 0 } as unknown as Workitem,
252
+ { Source: '2', fields: [{ value: '3' }], level: 0 } as unknown as Workitem,
253
+ ],
254
+ } as Query;
255
+
256
+ // Act
257
+ const result = Helper.LevelBuilder(mockQuery, '0');
258
+
259
+ // Assert
260
+ expect(result.length).toBeGreaterThan(0);
261
+ });
262
+
263
+ it('should set level 0 for root items with Source = 0', () => {
264
+ // Arrange
265
+ const mockQuery: Query = {
266
+ workItems: [{ Source: 0, fields: [{ value: '1' }], level: 0 } as unknown as Workitem],
267
+ } as Query;
268
+
269
+ // Act
270
+ const result = Helper.LevelBuilder(mockQuery, '0');
271
+
272
+ // Assert
273
+ expect(result[0].level).toBe(0);
274
+ });
275
+
276
+ it('should build hierarchy with correct levels', () => {
277
+ // Arrange
278
+ const mockQuery: Query = {
279
+ workItems: [
280
+ { Source: 0, fields: [{ value: '1' }], level: 0 } as unknown as Workitem,
281
+ { Source: '1', fields: [{ value: '2' }], level: 0 } as unknown as Workitem,
282
+ ],
283
+ } as Query;
284
+
285
+ // Act
286
+ const result = Helper.LevelBuilder(mockQuery, '1');
287
+
288
+ // Assert
289
+ expect(result.length).toBe(2);
290
+ });
291
+
292
+ it('should handle empty work items array', () => {
293
+ // Arrange
294
+ const mockQuery = {
295
+ workItems: [],
296
+ } as unknown as Query;
297
+
298
+ // Act
299
+ const result = Helper.LevelBuilder(mockQuery, '0');
300
+
301
+ // Assert
302
+ expect(result).toEqual([]);
303
+ });
304
+
305
+ it('should not duplicate work items', () => {
306
+ // Arrange
307
+ const workItem = { Source: 0, fields: [{ value: '1' }], level: 0 } as unknown as Workitem;
308
+ const mockQuery: Query = {
309
+ workItems: [workItem, workItem],
310
+ } as Query;
311
+
312
+ // Act
313
+ const result = Helper.LevelBuilder(mockQuery, '0');
314
+
315
+ // Assert
316
+ // Should only include the work item once
317
+ expect(result.length).toBe(1);
318
+ });
319
+
320
+ it('should handle nested hierarchy', () => {
321
+ // Arrange
322
+ const mockQuery: Query = {
323
+ workItems: [
324
+ { Source: 0, fields: [{ value: '100' }], level: 0 } as unknown as Workitem,
325
+ { Source: '100', fields: [{ value: '200' }], level: 0 } as unknown as Workitem,
326
+ { Source: '200', fields: [{ value: '300' }], level: 0 } as unknown as Workitem,
327
+ ],
328
+ } as Query;
329
+
330
+ // Act
331
+ const result = Helper.LevelBuilder(mockQuery, '100');
332
+
333
+ // Assert
334
+ expect(result.length).toBe(3);
335
+ });
336
+ });
337
+ });