@elisra-devops/docgen-data-provider 1.21.0 → 1.23.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 (49) hide show
  1. package/bin/helpers/helper.js.map +1 -1
  2. package/bin/helpers/test/tfs.test.d.ts +1 -0
  3. package/bin/helpers/test/tfs.test.js +613 -0
  4. package/bin/helpers/test/tfs.test.js.map +1 -0
  5. package/bin/helpers/tfs.js +4 -8
  6. package/bin/helpers/tfs.js.map +1 -1
  7. package/bin/modules/GitDataProvider.js.map +1 -1
  8. package/bin/modules/PipelinesDataProvider.js +3 -2
  9. package/bin/modules/PipelinesDataProvider.js.map +1 -1
  10. package/bin/modules/ResultDataProvider.d.ts +199 -17
  11. package/bin/modules/ResultDataProvider.js +611 -195
  12. package/bin/modules/ResultDataProvider.js.map +1 -1
  13. package/bin/modules/TestDataProvider.js +7 -7
  14. package/bin/modules/TestDataProvider.js.map +1 -1
  15. package/bin/modules/TicketsDataProvider.d.ts +1 -1
  16. package/bin/modules/TicketsDataProvider.js +3 -2
  17. package/bin/modules/TicketsDataProvider.js.map +1 -1
  18. package/bin/modules/test/JfrogDataProvider.test.d.ts +1 -0
  19. package/bin/modules/test/JfrogDataProvider.test.js +110 -0
  20. package/bin/modules/test/JfrogDataProvider.test.js.map +1 -0
  21. package/bin/modules/test/ResultDataProvider.test.d.ts +1 -0
  22. package/bin/modules/test/ResultDataProvider.test.js +478 -0
  23. package/bin/modules/test/ResultDataProvider.test.js.map +1 -0
  24. package/bin/modules/test/gitDataProvider.test.js +424 -120
  25. package/bin/modules/test/gitDataProvider.test.js.map +1 -1
  26. package/bin/modules/test/managmentDataProvider.test.js +283 -28
  27. package/bin/modules/test/managmentDataProvider.test.js.map +1 -1
  28. package/bin/modules/test/pipelineDataProvider.test.js +229 -45
  29. package/bin/modules/test/pipelineDataProvider.test.js.map +1 -1
  30. package/bin/modules/test/testDataProvider.test.js +225 -81
  31. package/bin/modules/test/testDataProvider.test.js.map +1 -1
  32. package/bin/modules/test/ticketsDataProvider.test.js +310 -82
  33. package/bin/modules/test/ticketsDataProvider.test.js.map +1 -1
  34. package/package.json +1 -1
  35. package/src/helpers/helper.ts +16 -14
  36. package/src/helpers/test/tfs.test.ts +748 -0
  37. package/src/helpers/tfs.ts +4 -8
  38. package/src/modules/GitDataProvider.ts +10 -10
  39. package/src/modules/PipelinesDataProvider.ts +2 -2
  40. package/src/modules/ResultDataProvider.ts +815 -260
  41. package/src/modules/TestDataProvider.ts +8 -8
  42. package/src/modules/TicketsDataProvider.ts +5 -9
  43. package/src/modules/test/JfrogDataProvider.test.ts +171 -0
  44. package/src/modules/test/ResultDataProvider.test.ts +581 -0
  45. package/src/modules/test/gitDataProvider.test.ts +671 -187
  46. package/src/modules/test/managmentDataProvider.test.ts +386 -26
  47. package/src/modules/test/pipelineDataProvider.test.ts +281 -52
  48. package/src/modules/test/testDataProvider.test.ts +307 -105
  49. package/src/modules/test/ticketsDataProvider.test.ts +425 -129
@@ -1,129 +1,433 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const __1 = require("../..");
4
- require("dotenv").config();
5
- jest.setTimeout(60000);
6
- const orgUrl = process.env.ORG_URL;
7
- const token = process.env.PAT;
8
- const dgDataProviderAzureDevOps = new __1.default(orgUrl, token);
9
- describe("git module - tests", () => {
10
- test("should return repo list for teamProject", async () => {
11
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
12
- let json = await gitDataProvider.GetTeamProjectGitReposList("tests");
13
- expect(json).toBeDefined();
14
- });
15
- test("should return repo from repoid", async () => {
16
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
17
- let json = await gitDataProvider.GetGitRepoFromRepoId("68f2aee7-0864-458e-93ce-320303a080ed");
18
- expect(json).toBeDefined();
19
- });
20
- test("should return repo by pullrequest id", async () => {
21
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
22
- let json = await gitDataProvider.GetGitRepoFromPrId(73);
23
- expect(json.repository).toBeDefined();
24
- });
25
- test("should return commits by pullrequest & repo id", async () => {
26
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
27
- let json = await gitDataProvider.GetGitRepoFromPrId(73);
28
- let commitJson = await gitDataProvider.GetPullRequestCommits(json.repository.id, 73);
29
- expect(commitJson.value.length).toBeGreaterThan(0);
30
- });
31
- test("should return pullrequest threads", async () => {
32
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
33
- let json = await gitDataProvider.GetPullRequestComments("tests", "68f2aee7-0864-458e-93ce-320303a080ed", 73);
34
- expect(json.count).toBeDefined;
35
- });
36
- test("should create pullrequest thread", async () => {
37
- let data = {
38
- comments: [
3
+ const tfs_1 = require("../../helpers/tfs");
4
+ const GitDataProvider_1 = require("../GitDataProvider");
5
+ const logger_1 = require("../../utils/logger");
6
+ jest.mock('../../helpers/tfs');
7
+ jest.mock('../../utils/logger');
8
+ describe('GitDataProvider - GetCommitForPipeline', () => {
9
+ let gitDataProvider;
10
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
11
+ const mockToken = 'mock-token';
12
+ const mockProjectId = 'project-123';
13
+ const mockBuildId = 456;
14
+ beforeEach(() => {
15
+ jest.clearAllMocks();
16
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
17
+ });
18
+ it('should return the sourceVersion from build information', async () => {
19
+ // Arrange
20
+ const mockCommitSha = 'abc123def456';
21
+ const mockResponse = {
22
+ id: mockBuildId,
23
+ sourceVersion: mockCommitSha,
24
+ status: 'completed'
25
+ };
26
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
27
+ // Act
28
+ const result = await gitDataProvider.GetCommitForPipeline(mockProjectId, mockBuildId);
29
+ // Assert
30
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectId}/_apis/build/builds/${mockBuildId}`, mockToken, 'get');
31
+ expect(result).toBe(mockCommitSha);
32
+ });
33
+ it('should throw an error if the API call fails', async () => {
34
+ // Arrange
35
+ const expectedError = new Error('API call failed');
36
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(expectedError);
37
+ // Act & Assert
38
+ await expect(gitDataProvider.GetCommitForPipeline(mockProjectId, mockBuildId))
39
+ .rejects.toThrow('API call failed');
40
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectId}/_apis/build/builds/${mockBuildId}`, mockToken, 'get');
41
+ });
42
+ it('should return undefined if the response does not contain sourceVersion', async () => {
43
+ // Arrange
44
+ const mockResponse = {
45
+ id: mockBuildId,
46
+ status: 'completed'
47
+ // No sourceVersion property
48
+ };
49
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
50
+ // Act
51
+ const result = await gitDataProvider.GetCommitForPipeline(mockProjectId, mockBuildId);
52
+ // Assert
53
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectId}/_apis/build/builds/${mockBuildId}`, mockToken, 'get');
54
+ expect(result).toBeUndefined();
55
+ });
56
+ it('should correctly construct URL with given project ID and build ID', async () => {
57
+ // Arrange
58
+ const customProjectId = 'custom-project';
59
+ const customBuildId = 789;
60
+ const mockCommitSha = 'xyz789abc';
61
+ const mockResponse = { sourceVersion: mockCommitSha };
62
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
63
+ // Act
64
+ await gitDataProvider.GetCommitForPipeline(customProjectId, customBuildId);
65
+ // Assert
66
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${customProjectId}/_apis/build/builds/${customBuildId}`, mockToken, 'get');
67
+ });
68
+ it('should handle different organization URLs correctly', async () => {
69
+ // Arrange
70
+ const altOrgUrl = 'https://dev.azure.com/different-org/';
71
+ const altGitDataProvider = new GitDataProvider_1.default(altOrgUrl, mockToken);
72
+ const mockResponse = { sourceVersion: 'commit-sha' };
73
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
74
+ // Act
75
+ await altGitDataProvider.GetCommitForPipeline(mockProjectId, mockBuildId);
76
+ // Assert
77
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${altOrgUrl}${mockProjectId}/_apis/build/builds/${mockBuildId}`, mockToken, 'get');
78
+ });
79
+ });
80
+ describe('GitDataProvider - GetTeamProjectGitReposList', () => {
81
+ let gitDataProvider;
82
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
83
+ const mockToken = 'mock-token';
84
+ const mockTeamProject = 'project-123';
85
+ beforeEach(() => {
86
+ jest.clearAllMocks();
87
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
88
+ });
89
+ it('should return sorted repositories when API call succeeds', async () => {
90
+ // Arrange
91
+ const mockRepos = {
92
+ value: [
93
+ { id: 'repo2', name: 'ZRepo' },
94
+ { id: 'repo1', name: 'ARepo' },
95
+ { id: 'repo3', name: 'MRepo' }
96
+ ]
97
+ };
98
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockRepos);
99
+ // Act
100
+ const result = await gitDataProvider.GetTeamProjectGitReposList(mockTeamProject);
101
+ // Assert
102
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}/${mockTeamProject}/_apis/git/repositories`, mockToken, 'get');
103
+ expect(result).toHaveLength(3);
104
+ expect(result[0].name).toBe('ARepo');
105
+ expect(result[1].name).toBe('MRepo');
106
+ expect(result[2].name).toBe('ZRepo');
107
+ expect(logger_1.default.debug).toHaveBeenCalledWith(expect.stringContaining(`fetching repos list for team project - ${mockTeamProject}`));
108
+ });
109
+ it('should return empty array when no repositories exist', async () => {
110
+ // Arrange
111
+ const mockEmptyRepos = { value: [] };
112
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockEmptyRepos);
113
+ // Act
114
+ const result = await gitDataProvider.GetTeamProjectGitReposList(mockTeamProject);
115
+ // Assert
116
+ expect(result).toEqual([]);
117
+ });
118
+ it('should handle API errors appropriately', async () => {
119
+ // Arrange
120
+ const mockError = new Error('API Error');
121
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(mockError);
122
+ // Act & Assert
123
+ await expect(gitDataProvider.GetTeamProjectGitReposList(mockTeamProject))
124
+ .rejects.toThrow('API Error');
125
+ });
126
+ });
127
+ describe('GitDataProvider - GetFileFromGitRepo', () => {
128
+ let gitDataProvider;
129
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
130
+ const mockToken = 'mock-token';
131
+ const mockProjectName = 'project-123';
132
+ const mockRepoId = 'repo-456';
133
+ const mockFileName = 'README.md';
134
+ const mockVersion = { version: 'main', versionType: 'branch' };
135
+ beforeEach(() => {
136
+ jest.clearAllMocks();
137
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
138
+ });
139
+ it('should return file content when file exists', async () => {
140
+ // Arrange
141
+ const mockContent = 'This is a test readme file';
142
+ const mockResponse = { content: mockContent };
143
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
144
+ // Act
145
+ const result = await gitDataProvider.GetFileFromGitRepo(mockProjectName, mockRepoId, mockFileName, mockVersion);
146
+ // Assert
147
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining(`${mockOrgUrl}${mockProjectName}/_apis/git/repositories/${mockRepoId}/items`), mockToken, 'get', {}, {}, false);
148
+ expect(result).toBe(mockContent);
149
+ });
150
+ it('should handle special characters in version by encoding them', async () => {
151
+ // Arrange
152
+ const specialVersion = { version: 'feature/branch#123', versionType: 'branch' };
153
+ const mockResponse = { content: 'content' };
154
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
155
+ // Act
156
+ await gitDataProvider.GetFileFromGitRepo(mockProjectName, mockRepoId, mockFileName, specialVersion);
157
+ // Assert
158
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining('versionDescriptor.version=feature%2Fbranch%23123'), expect.anything(), expect.anything(), expect.anything(), expect.anything(), expect.anything());
159
+ });
160
+ it('should use custom gitRepoUrl if provided', async () => {
161
+ // Arrange
162
+ const mockCustomUrl = 'https://custom.git.url';
163
+ const mockResponse = { content: 'content' };
164
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
165
+ // Act
166
+ await gitDataProvider.GetFileFromGitRepo(mockProjectName, mockRepoId, mockFileName, mockVersion, mockCustomUrl);
167
+ // Assert
168
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining(mockCustomUrl), expect.anything(), expect.anything(), expect.anything(), expect.anything(), expect.anything());
169
+ });
170
+ it('should return undefined when file does not exist', async () => {
171
+ // Arrange
172
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce({});
173
+ // Act
174
+ const result = await gitDataProvider.GetFileFromGitRepo(mockProjectName, mockRepoId, mockFileName, mockVersion);
175
+ // Assert
176
+ expect(result).toBeUndefined();
177
+ });
178
+ it('should log warning and return undefined when error occurs', async () => {
179
+ // Arrange
180
+ const mockError = new Error('File not found');
181
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(mockError);
182
+ // Act
183
+ const result = await gitDataProvider.GetFileFromGitRepo(mockProjectName, mockRepoId, mockFileName, mockVersion);
184
+ // Assert
185
+ expect(logger_1.default.warn).toHaveBeenCalledWith(expect.stringContaining(`File ${mockFileName} could not be read: ${mockError.message}`));
186
+ expect(result).toBeUndefined();
187
+ });
188
+ });
189
+ describe('GitDataProvider - CheckIfItemExist', () => {
190
+ let gitDataProvider;
191
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
192
+ const mockToken = 'mock-token';
193
+ const mockGitApiUrl = 'https://dev.azure.com/orgname/project/_apis/git/repositories/repo-id';
194
+ const mockItemPath = 'path/to/file.txt';
195
+ const mockVersion = { version: 'main', versionType: 'branch' };
196
+ beforeEach(() => {
197
+ jest.clearAllMocks();
198
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
199
+ });
200
+ it('should return true when item exists', async () => {
201
+ // Arrange
202
+ const mockResponse = { path: mockItemPath, content: 'content' };
203
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
204
+ // Act
205
+ const result = await gitDataProvider.CheckIfItemExist(mockGitApiUrl, mockItemPath, mockVersion);
206
+ // Assert
207
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining(`${mockGitApiUrl}/items?path=${mockItemPath}`), mockToken, 'get', {}, {}, false);
208
+ expect(result).toBe(true);
209
+ });
210
+ it('should return false when item does not exist', async () => {
211
+ // Arrange
212
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(new Error('Not found'));
213
+ // Act
214
+ const result = await gitDataProvider.CheckIfItemExist(mockGitApiUrl, mockItemPath, mockVersion);
215
+ // Assert
216
+ expect(result).toBe(false);
217
+ });
218
+ it('should return false when API returns null', async () => {
219
+ // Arrange
220
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(null);
221
+ // Act
222
+ const result = await gitDataProvider.CheckIfItemExist(mockGitApiUrl, mockItemPath, mockVersion);
223
+ // Assert
224
+ expect(result).toBe(false);
225
+ });
226
+ it('should handle special characters in version', async () => {
227
+ // Arrange
228
+ const specialVersion = { version: 'feature/branch#123', versionType: 'branch' };
229
+ const mockResponse = { path: mockItemPath };
230
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
231
+ // Act
232
+ await gitDataProvider.CheckIfItemExist(mockGitApiUrl, mockItemPath, specialVersion);
233
+ // Assert
234
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining('versionDescriptor.version=feature%2Fbranch%23123'), expect.anything(), expect.anything(), expect.anything(), expect.anything(), expect.anything());
235
+ });
236
+ });
237
+ describe('GitDataProvider - GetPullRequestsInCommitRangeWithoutLinkedItems', () => {
238
+ let gitDataProvider;
239
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
240
+ const mockToken = 'mock-token';
241
+ const mockProjectId = 'project-123';
242
+ const mockRepoId = 'repo-456';
243
+ beforeEach(() => {
244
+ jest.clearAllMocks();
245
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
246
+ });
247
+ it('should return filtered pull requests matching commit ids', async () => {
248
+ // Arrange
249
+ const mockCommits = {
250
+ value: [
251
+ { commitId: 'commit-1' },
252
+ { commitId: 'commit-2' }
253
+ ]
254
+ };
255
+ const mockPullRequests = {
256
+ count: 3,
257
+ value: [
39
258
  {
40
- parentCommentId: 0,
41
- content: "Should we add a comment about what this value means?",
42
- commentType: 1,
43
- },
44
- ],
45
- status: 1,
46
- threadContext: {
47
- filePath: "/assaf.txt",
48
- leftFileEnd: null,
49
- leftFileStart: null,
50
- rightFileEnd: {
51
- line: 2,
52
- offset: 1,
259
+ pullRequestId: 101,
260
+ title: 'PR 1',
261
+ createdBy: { displayName: 'User 1' },
262
+ creationDate: '2023-01-01',
263
+ closedDate: '2023-01-02',
264
+ description: 'Description 1',
265
+ lastMergeCommit: { commitId: 'commit-1' }
53
266
  },
54
- rightFileStart: {
55
- line: 2,
56
- offset: 5,
267
+ {
268
+ pullRequestId: 102,
269
+ title: 'PR 2',
270
+ createdBy: { displayName: 'User 2' },
271
+ creationDate: '2023-02-01',
272
+ closedDate: '2023-02-02',
273
+ description: 'Description 2',
274
+ lastMergeCommit: { commitId: 'commit-3' } // Not in our commit range
57
275
  },
58
- },
59
- pullRequestThreadContext: {
60
- changeTrackingId: 1,
61
- iterationContext: {
62
- firstComparingIteration: 1,
63
- secondComparingIteration: 1,
276
+ {
277
+ pullRequestId: 103,
278
+ title: 'PR 3',
279
+ createdBy: { displayName: 'User 3' },
280
+ creationDate: '2023-03-01',
281
+ closedDate: '2023-03-02',
282
+ description: 'Description 3',
283
+ lastMergeCommit: { commitId: 'commit-2' }
284
+ }
285
+ ]
286
+ };
287
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockPullRequests);
288
+ // Act
289
+ const result = await gitDataProvider.GetPullRequestsInCommitRangeWithoutLinkedItems(mockProjectId, mockRepoId, mockCommits);
290
+ // Assert
291
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(expect.stringContaining(`${mockOrgUrl}${mockProjectId}/_apis/git/repositories/${mockRepoId}/pullrequests`), mockToken, 'get');
292
+ expect(result).toHaveLength(2);
293
+ expect(result[0].pullRequestId).toBe(101);
294
+ expect(result[1].pullRequestId).toBe(103);
295
+ expect(logger_1.default.info).toHaveBeenCalledWith(expect.stringContaining('filtered in commit range 2 pullrequests'));
296
+ });
297
+ it('should return empty array when no matching pull requests', async () => {
298
+ // Arrange
299
+ const mockCommits = {
300
+ value: [
301
+ { commitId: 'commit-999' } // Not matching any PRs
302
+ ]
303
+ };
304
+ const mockPullRequests = {
305
+ count: 2,
306
+ value: [
307
+ {
308
+ pullRequestId: 101,
309
+ lastMergeCommit: { commitId: 'commit-1' }
64
310
  },
65
- },
311
+ {
312
+ pullRequestId: 102,
313
+ lastMergeCommit: { commitId: 'commit-2' }
314
+ }
315
+ ]
316
+ };
317
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockPullRequests);
318
+ // Act
319
+ const result = await gitDataProvider.GetPullRequestsInCommitRangeWithoutLinkedItems(mockProjectId, mockRepoId, mockCommits);
320
+ // Assert
321
+ expect(result).toHaveLength(0);
322
+ });
323
+ it('should handle API errors appropriately', async () => {
324
+ // Arrange
325
+ const mockCommits = { value: [{ commitId: 'commit-1' }] };
326
+ const mockError = new Error('API Error');
327
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(mockError);
328
+ // Act & Assert
329
+ await expect(gitDataProvider.GetPullRequestsInCommitRangeWithoutLinkedItems(mockProjectId, mockRepoId, mockCommits)).rejects.toThrow('API Error');
330
+ });
331
+ });
332
+ describe('GitDataProvider - GetRepoReferences', () => {
333
+ let gitDataProvider;
334
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
335
+ const mockToken = 'mock-token';
336
+ const mockProjectId = 'project-123';
337
+ const mockRepoId = 'repo-456';
338
+ beforeEach(() => {
339
+ jest.clearAllMocks();
340
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
341
+ });
342
+ it('should return formatted tags when gitObjectType is "tag"', async () => {
343
+ // Arrange
344
+ const mockTags = {
345
+ count: 2,
346
+ value: [
347
+ { name: 'refs/tags/v1.0.0', objectId: 'tag-1' },
348
+ { name: 'refs/tags/v2.0.0', objectId: 'tag-2' }
349
+ ]
66
350
  };
67
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
68
- let json = await gitDataProvider.CreatePullRequestComment("tests", "68f2aee7-0864-458e-93ce-320303a080ed", 73, data);
69
- expect(json.comment).toBeDefined;
70
- });
71
- test("should return commits with linked items in date range", async () => {
72
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
73
- let commitRange = await gitDataProvider.GetCommitsInDateRange("Azuretraining", "b77bccb5-38de-4dca-9dcb-b0f8046bc045", "2016-10-21T12:51:51Z", "2024-10-24T12:51:51Z", "main");
74
- let items = await gitDataProvider.GetItemsInCommitRange("Azuretraining", "b77bccb5-38de-4dca-9dcb-b0f8046bc045", commitRange);
75
- expect(items[0].workItem).toBeDefined();
76
- });
77
- test("should return source trigger commit for pipline", async () => {
78
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
79
- let json = await gitDataProvider.GetCommitForPipeline("tests", 248);
80
- expect(json).toBe("59d59691ee002815e7aa774f0a90ef28a6e4708f");
81
- });
82
- test("should return commits in commit range", async () => {
83
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
84
- let json = await gitDataProvider.GetCommitsInCommitRange("tests", "68f2aee7-0864-458e-93ce-320303a080ed", "4ce7f96f74f10bb60d27d7180a8d1bd44da1ffac", "e46f8023be49db94b5cf188b41f7ba9db6fd8274");
85
- expect(json.count).toBeGreaterThan(0);
86
- });
87
- test("should return items linked in build range", async () => {
88
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
89
- let json = await gitDataProvider.GetItemsForPipelinesRange("tests", 244, 244);
90
- expect(json.length).toBeGreaterThan(0);
91
- });
92
- test("should return commits range between dates ", async () => {
93
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
94
- let json = await gitDataProvider.GetCommitsInDateRange("tests", "68f2aee7-0864-458e-93ce-320303a080ed", "2009-11-30T12:51:51Z", "2021-11-30T12:51:51Z");
95
- expect(json.count).toBeGreaterThanOrEqual(14);
96
- });
97
- test("should return all commits for repo ", async () => {
98
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
99
- let json = await gitDataProvider.GetCommitsForRepo("tests", "68f2aee7-0864-458e-93ce-320303a080ed", "master");
100
- expect(json.count).toBeGreaterThanOrEqual(0);
101
- });
102
- test("should return all pullrequests for repo ", async () => {
103
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
104
- let json = await gitDataProvider.GetPullRequestsForRepo("tests", "68f2aee7-0864-458e-93ce-320303a080ed");
105
- expect(json.count).toBeGreaterThanOrEqual(0);
106
- });
107
- test("should return all pullrequests for repo with Given PrId ", async () => {
108
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
109
- let json = await gitDataProvider.GetItemsInPullRequestRange("tests", "68f2aee7-0864-458e-93ce-320303a080ed", [73, 74]);
110
- expect(json.count).toBeGreaterThanOrEqual(0);
111
- });
112
- test("should return branches of repository ", async () => {
113
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
114
- let json = await gitDataProvider.GetRepoBranches("tests", "68f2aee7-0864-458e-93ce-320303a080ed");
115
- expect(json.count).toBeGreaterThanOrEqual(0);
116
- });
117
- }); //describe
118
- test("should return pull requests in commit range without linked items", async () => {
119
- let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
120
- // Get the commit range using the date range
121
- let commitRange = await gitDataProvider.GetCommitsInDateRange("Azuretraining", "b77bccb5-38de-4dca-9dcb-b0f8046bc045", "2023-7-21T12:51:51Z", "2024-8-21T12:51:51Z", "main");
122
- // Use the new function to get pull requests without linked items
123
- let pullRequests = await gitDataProvider.GetPullRequestsInCommitRangeWithoutLinkedItems("Azuretraining", "b77bccb5-38de-4dca-9dcb-b0f8046bc045", commitRange);
124
- // Print the pull requests
125
- console.log("Pull Requests:", pullRequests);
126
- expect(pullRequests).toBeDefined();
127
- expect(pullRequests.length).toBeGreaterThan(0);
351
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockTags);
352
+ // Act
353
+ const result = await gitDataProvider.GetRepoReferences(mockProjectId, mockRepoId, 'tag');
354
+ // Assert
355
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectId}/_apis/git/repositories/${mockRepoId}/refs/tags?api-version=5.1`, mockToken, 'get');
356
+ expect(result).toHaveLength(2);
357
+ expect(result[0].name).toBe('v1.0.0');
358
+ expect(result[0].value).toBe('refs/tags/v1.0.0');
359
+ expect(result[1].name).toBe('v2.0.0');
360
+ expect(result[1].value).toBe('refs/tags/v2.0.0');
361
+ });
362
+ it('should return formatted branches when gitObjectType is "branch"', async () => {
363
+ // Arrange
364
+ const mockBranches = {
365
+ count: 2,
366
+ value: [
367
+ { name: 'refs/heads/main', objectId: 'branch-1' },
368
+ { name: 'refs/heads/develop', objectId: 'branch-2' }
369
+ ]
370
+ };
371
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockBranches);
372
+ // Act
373
+ const result = await gitDataProvider.GetRepoReferences(mockProjectId, mockRepoId, 'branch');
374
+ // Assert
375
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectId}/_apis/git/repositories/${mockRepoId}/refs/heads?api-version=5.1`, mockToken, 'get');
376
+ expect(result).toHaveLength(2);
377
+ expect(result[0].name).toBe('main');
378
+ expect(result[0].value).toBe('refs/heads/main');
379
+ expect(result[1].name).toBe('develop');
380
+ expect(result[1].value).toBe('refs/heads/develop');
381
+ });
382
+ it('should throw error for unsupported git object type', async () => {
383
+ // Act & Assert
384
+ await expect(gitDataProvider.GetRepoReferences(mockProjectId, mockRepoId, 'invalid-type')).rejects.toThrow('Unsupported git object type: invalid-type');
385
+ });
386
+ it('should return empty array when no references exist', async () => {
387
+ // Arrange
388
+ const mockEmptyRefs = { count: 0, value: [] };
389
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockEmptyRefs);
390
+ // Act
391
+ const result = await gitDataProvider.GetRepoReferences(mockProjectId, mockRepoId, 'branch');
392
+ // Assert
393
+ expect(result).toEqual([]);
394
+ });
395
+ });
396
+ describe('GitDataProvider - GetJsonFileFromGitRepo', () => {
397
+ let gitDataProvider;
398
+ const mockOrgUrl = 'https://dev.azure.com/orgname/';
399
+ const mockToken = 'mock-token';
400
+ const mockProjectName = 'project-123';
401
+ const mockRepoName = 'repo-456';
402
+ const mockFilePath = 'config/settings.json';
403
+ beforeEach(() => {
404
+ jest.clearAllMocks();
405
+ gitDataProvider = new GitDataProvider_1.default(mockOrgUrl, mockToken);
406
+ });
407
+ it('should parse and return JSON content when file exists', async () => {
408
+ // Arrange
409
+ const mockJsonContent = { setting1: 'value1', setting2: 'value2' };
410
+ const mockResponse = { content: JSON.stringify(mockJsonContent) };
411
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockResponse);
412
+ // Act
413
+ const result = await gitDataProvider.GetJsonFileFromGitRepo(mockProjectName, mockRepoName, mockFilePath);
414
+ // Assert
415
+ expect(tfs_1.TFSServices.getItemContent).toHaveBeenCalledWith(`${mockOrgUrl}${mockProjectName}/_apis/git/repositories/${mockRepoName}/items?path=${mockFilePath}&includeContent=true`, mockToken, 'get');
416
+ expect(result).toEqual(mockJsonContent);
417
+ });
418
+ it('should throw an error for invalid JSON content', async () => {
419
+ // Arrange
420
+ const mockInvalidJson = { content: '{ invalid json' };
421
+ tfs_1.TFSServices.getItemContent.mockResolvedValueOnce(mockInvalidJson);
422
+ // Act & Assert
423
+ await expect(gitDataProvider.GetJsonFileFromGitRepo(mockProjectName, mockRepoName, mockFilePath)).rejects.toThrow(SyntaxError);
424
+ });
425
+ it('should handle API errors appropriately', async () => {
426
+ // Arrange
427
+ const mockError = new Error('API Error');
428
+ tfs_1.TFSServices.getItemContent.mockRejectedValueOnce(mockError);
429
+ // Act & Assert
430
+ await expect(gitDataProvider.GetJsonFileFromGitRepo(mockProjectName, mockRepoName, mockFilePath)).rejects.toThrow('API Error');
431
+ });
128
432
  });
129
433
  //# sourceMappingURL=gitDataProvider.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitDataProvider.test.js","sourceRoot":"","sources":["../../../src/modules/test/gitDataProvider.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitDataProvider.test.js","sourceRoot":"","sources":["../../../src/modules/test/gitDataProvider.test.ts"],"names":[],"mappings":"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"}