@elisra-devops/docgen-data-provider 0.4.6

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.
@@ -0,0 +1,435 @@
1
+ import { TFSServices } from "../helpers/tfs";
2
+ import { Workitem } from "../models/tfs-data";
3
+ import { Helper, suiteData, Links, Trace, Relations } from "../helpers/helper";
4
+ import { Query, TestSteps } from "../models/tfs-data";
5
+ import { QueryType } from "../models/tfs-data";
6
+ import { QueryAllTypes } from "../models/tfs-data";
7
+ import { Column } from "../models/tfs-data";
8
+ import { value } from "../models/tfs-data";
9
+ import { TestCase } from "../models/tfs-data";
10
+ import * as xml2js from "xml2js";
11
+
12
+ import logger from "../utils/logger";
13
+
14
+ export default class TicketsDataProvider {
15
+ orgUrl: string = "";
16
+ token: string = "";
17
+ queriesList: Array<any> = new Array<any>();
18
+
19
+ constructor(orgUrl: string, token: string) {
20
+ this.orgUrl = orgUrl;
21
+ this.token = token;
22
+ }
23
+
24
+ async GetWorkItem(
25
+ project: string,
26
+ id: string
27
+ ): Promise<any> {
28
+ let url = `${this.orgUrl}${project}/_apis/wit/workitems/${id}?$expand=All`;
29
+ return TFSServices.getItemContent(url, this.token);
30
+ }
31
+ async GetLinksByIds(
32
+ project: string,
33
+ ids: any
34
+ ) {
35
+ var trace: Array<Trace> = new Array<Trace>();
36
+ let wis = await this.PopulateWorkItemsByIds(ids, project);
37
+ let linksMap: any = await this.GetRelationsIds(wis);
38
+
39
+ let relations;
40
+ for (let i = 0; i < wis.length; i++) {
41
+ let traceItem: Trace; //= new Trace();
42
+ traceItem = await this.GetParentLink(project, wis[i]);
43
+
44
+ if (linksMap.get(wis[i].id).rels.length > 0) {
45
+ relations = await this.PopulateWorkItemsByIds(
46
+ linksMap.get(wis[i].id).rels,
47
+ project
48
+ );
49
+ traceItem.links = await this.GetLinks(project, wis[i], relations);
50
+ }
51
+ trace.push(traceItem);
52
+ }
53
+ return trace;
54
+ }
55
+ async GetParentLink(
56
+ project: string,
57
+ wi: any
58
+ ) {
59
+ let trace: Trace = new Trace();
60
+ if (wi != null) {
61
+ trace.id = wi.id;
62
+ trace.title = wi.fields["System.Title"];
63
+ trace.url = this.orgUrl + project + "/_workitems/edit/" + wi.id;
64
+ if (
65
+ wi.fields["System.CustomerId"] != null &&
66
+ wi.fields["System.CustomerId"] != undefined
67
+ ) {
68
+ trace.customerId = wi.fields["System.CustomerId"];
69
+ }
70
+ }
71
+ return trace;
72
+ }
73
+ async GetRelationsIds(
74
+ ids: any
75
+ ) {
76
+ let rel = new Map<string, Relations>();
77
+ try {
78
+ for (let i = 0; i < ids.length; i++) {
79
+ var link = new Relations();
80
+ link.id = ids[i].id;
81
+ if (ids[i].relations != null)
82
+ for (let j = 0; j < ids[i].relations.length; j++) {
83
+ if (ids[i].relations[j].rel != "AttachedFile") {
84
+ let index = ids[i].relations[j].url.lastIndexOf("/");
85
+ let id = ids[i].relations[j].url.substring(index + 1);
86
+ link.rels.push(id);
87
+ }
88
+ }
89
+ rel.set(ids[i].id, link);
90
+ }
91
+ } catch (e) {}
92
+ return rel;
93
+ }
94
+ async GetLinks(
95
+ project: string,
96
+ wi: any,
97
+ links: any
98
+ ) {
99
+ var linkList: Array<Links> = new Array<Links>();
100
+ for (let i = 0; i < wi.relations.length; i++) {
101
+ for (let j = 0; j < links.length; j++) {
102
+ let index = wi.relations[i].url.lastIndexOf("/");
103
+ let linkId = wi.relations[i].url.substring(index + 1);
104
+ if (linkId == links[j].id) {
105
+ var link = new Links();
106
+ link.type = wi.relations[i].rel;
107
+ link.id = links[j].id;
108
+ link.title = links[j].fields["System.Title"];
109
+ link.description = links[j].fields["System.Description"];
110
+ link.url = this.orgUrl + project + "/_workitems/edit/" + linkId;
111
+ linkList.push(link);
112
+ break;
113
+ }
114
+ }
115
+ }
116
+ return linkList;
117
+ }
118
+ // gets queries recursiv
119
+ async GetSharedQueries(
120
+ project: string,
121
+ path: string
122
+ ): Promise<any> {
123
+ let url;
124
+ try {
125
+ if (path == "")
126
+ url = `${this.orgUrl}${project}/_apis/wit/queries/Shared%20Queries?$depth=1`;
127
+ else
128
+ url = `${this.orgUrl}${project}/_apis/wit/queries/${path}?$depth=1`;
129
+ let queries: any = await TFSServices.getItemContent(url, this.token);
130
+ for (let i = 0; i < queries.children.length; i++)
131
+ if (queries.children[i].isFolder) {
132
+ this.queriesList.push(queries.children[i]);
133
+ await this.GetSharedQueries(project, queries.children[i].path);
134
+ } else {
135
+ this.queriesList.push(queries.children[i]);
136
+ }
137
+ return this.GetModeledQuery(this.queriesList);
138
+ } catch (e) {}
139
+ }
140
+ // get queris structured
141
+ GetModeledQuery(
142
+ list: Array<any>
143
+ ): Array<any> {
144
+ let queryListObject: Array<any> = [];
145
+ list.forEach((query) => {
146
+ let newObj = {
147
+ queryName: query.name,
148
+ wiql: query._links.wiql != null ? query._links.wiql : null,
149
+ id: query.id,
150
+ };
151
+ queryListObject.push(newObj);
152
+ });
153
+ return queryListObject;
154
+ }
155
+ // gets query results
156
+ async GetQueryResultsByWiqlHref(
157
+ wiqlHref: string,
158
+ project: string
159
+ ): Promise<any> {
160
+ try {
161
+ let results: any = await TFSServices.getItemContent(wiqlHref, this.token);
162
+ let modeledResult = await this.GetModeledQueryResults(results, project);
163
+ if (modeledResult.queryType == "tree") {
164
+ let levelResults: Array<Workitem> = Helper.LevelBuilder(
165
+ modeledResult,
166
+ modeledResult.workItems[0].fields[0].value
167
+ );
168
+ return levelResults;
169
+ }
170
+ return modeledResult.workItems;
171
+ } catch (e) {}
172
+ }
173
+ // gets query results
174
+ async GetQueryResultsByWiqlString(
175
+ wiql: string,
176
+ projectName: string
177
+ ): Promise<any> {
178
+ let res;
179
+ let url = `${this.orgUrl}${projectName}/_apis/wit/wiql?$top=2147483646&expand={all}`;
180
+ try {
181
+ res = await TFSServices.getItemContent(url, this.token, "post", {
182
+ query: wiql,
183
+ });
184
+ } catch (error) {
185
+ console.log(error);
186
+ return [];
187
+ }
188
+ return res;
189
+ }
190
+ async GetQueryResultById(
191
+ query: string,
192
+ project: string
193
+ ): Promise<any> {
194
+ var url = `${this.orgUrl}${project}/_apis/wit/queries/${query}`;
195
+ let querie: any = await TFSServices.getItemContent(url, this.token);
196
+ var wiql = querie._links.wiql;
197
+ return await this.GetQueryResultsByWiqlHref(wiql.href, project);
198
+ }
199
+
200
+ async PopulateWorkItemsByIds(
201
+ workItemsArray: any[] = [],
202
+ projectName: string = ""
203
+ ): Promise<any[]> {
204
+ let url = `${this.orgUrl}${projectName}/_apis/wit/workitemsbatch`;
205
+ let res: any[] = [];
206
+ let divByMax = Math.floor(workItemsArray.length / 200);
207
+ let modulusByMax = workItemsArray.length % 200;
208
+ //iterating
209
+ for (let i = 0; i < divByMax; i++) {
210
+ let from = i * 200;
211
+ let to = (i + 1) * 200;
212
+ let currentIds = workItemsArray.slice(from, to);
213
+ try {
214
+ let subRes = await TFSServices.getItemContent(url, this.token, "post", {
215
+ $expand: "Relations",
216
+ ids: currentIds,
217
+ });
218
+ res = [...res, ...subRes.value];
219
+ } catch (error) {
220
+ logger.error(`error populating workitems array`);
221
+ logger.error(JSON.stringify(error));
222
+ return [];
223
+ }
224
+ }
225
+ //compliting the rimainder
226
+ if (modulusByMax !== 0) {
227
+ try {
228
+ let currentIds = workItemsArray.slice(
229
+ workItemsArray.length - modulusByMax,
230
+ workItemsArray.length
231
+ );
232
+ let subRes = await TFSServices.getItemContent(url, this.token, "post", {
233
+ $expand: "Relations",
234
+ ids: currentIds,
235
+ });
236
+ res = [...res, ...subRes.value];
237
+ } catch (error) {
238
+ logger.error(`error populating workitems array`);
239
+ logger.error(JSON.stringify(error));
240
+ return [];
241
+ }
242
+ } //if
243
+
244
+ return res;
245
+ }
246
+
247
+ async GetModeledQueryResults(
248
+ results: any,
249
+ project: string
250
+ ) {
251
+ let ticketsDataProvider = new TicketsDataProvider(
252
+ this.orgUrl,
253
+ this.token,
254
+ );
255
+ var queryResult: Query = new Query();
256
+ queryResult.asOf = results.asOf;
257
+ queryResult.queryResultType = results.queryResultType;
258
+ queryResult.queryType = results.queryType;
259
+ if (results.queryType == QueryType.Flat) {
260
+ // //Flat Query
261
+ //TODo: attachment
262
+ //TODO:check if wi.relations exist
263
+ //TODO: add attachment to any list from 1
264
+ for (var j = 0; j < results.workItems.length; j++) {
265
+ let wi = await ticketsDataProvider.GetWorkItem(
266
+ project,
267
+ results.workItems[j].id
268
+ );
269
+
270
+ queryResult.workItems[j] = new Workitem();
271
+ queryResult.workItems[j].url = results.workItems[j].url;
272
+ queryResult.workItems[j].fields = new Array(results.columns.length);
273
+ if (wi.relations != null) {
274
+ queryResult.workItems[j].attachments = wi.relations;
275
+ }
276
+ var rel = new QueryAllTypes();
277
+ for (var i = 0; i < results.columns.length; i++) {
278
+ queryResult.columns[i] = new Column();
279
+ queryResult.workItems[j].fields[i] = new value();
280
+ queryResult.columns[i].name = results.columns[i].name;
281
+ queryResult.columns[i].referenceName =
282
+ results.columns[i].referenceName;
283
+ queryResult.columns[i].url = results.columns[i].url;
284
+ if (results.columns[i].referenceName.toUpperCase() == "SYSTEM.ID") {
285
+ queryResult.workItems[j].fields[i].value = wi.id.toString();
286
+ queryResult.workItems[j].fields[i].name = "ID";
287
+ } else if (
288
+ results.columns[i].referenceName.toUpperCase() ==
289
+ "SYSTEM.ASSIGNEDTO" &&
290
+ wi.fields[results.columns[i].referenceName] != null
291
+ )
292
+ queryResult.workItems[j].fields[i].value =
293
+ wi.fields[results.columns[i].referenceName].displayName;
294
+ else {
295
+ let s: string = wi.fields[results.columns[i].referenceName];
296
+ queryResult.workItems[j].fields[i].value =
297
+ wi.fields[results.columns[i].referenceName];
298
+ queryResult.workItems[j].fields[i].name = results.columns[i].name;
299
+ }
300
+ }
301
+ }
302
+ } //Tree Query
303
+ else {
304
+ this.BuildColumns(results, queryResult);
305
+ for (var j = 0; j < results.workItemRelations.length; j++) {
306
+ if (results.workItemRelations[j].target != null) {
307
+ let wiT = await ticketsDataProvider.GetWorkItem(
308
+ project,
309
+ results.workItemRelations[j].target.id
310
+ );
311
+ // var rel = new QueryAllTypes();
312
+ queryResult.workItems[j] = new Workitem();
313
+ queryResult.workItems[j].url = wiT.url;
314
+ queryResult.workItems[j].fields = new Array(results.columns.length);
315
+ if (wiT.relations != null) {
316
+ queryResult.workItems[j].attachments = wiT.relations;
317
+ }
318
+ // rel.q = queryResult;
319
+ for (i = 0; i < queryResult.columns.length; i++) {
320
+ //.. rel.q.workItems[j].fields[i] = new value();
321
+ queryResult.workItems[j].fields[i] = new value();
322
+ queryResult.workItems[j].fields[i].name =
323
+ queryResult.columns[i].name;
324
+ if (
325
+ results.columns[i].referenceName.toUpperCase() ==
326
+ "SYSTEM.ASSIGNEDTO" &&
327
+ wiT.fields[results.columns[i].referenceName] != null
328
+ )
329
+ queryResult.workItems[j].fields[i].value =
330
+ wiT.fields[results.columns[i].referenceName].displayName;
331
+ else
332
+ queryResult.workItems[j].fields[i].value =
333
+ wiT.fields[queryResult.columns[i].referenceName];
334
+ //}
335
+ }
336
+ if (results.workItemRelations[j].source != null)
337
+ queryResult.workItems[j].Source =
338
+ results.workItemRelations[j].source.id;
339
+ }
340
+ }
341
+ }
342
+ return queryResult;
343
+ }
344
+
345
+ BuildColumns(
346
+ results: any,
347
+ queryResult: Query
348
+ ) {
349
+ for (var i = 0; i < results.columns.length; i++) {
350
+ queryResult.columns[i] = new Column();
351
+ queryResult.columns[i].name = results.columns[i].name;
352
+ queryResult.columns[i].referenceName = results.columns[i].referenceName;
353
+ queryResult.columns[i].url = results.columns[i].url;
354
+ }
355
+ }
356
+
357
+ async GetIterationsByTeamName(
358
+ projectName: string,
359
+ teamName: string
360
+ ): Promise<any[]> {
361
+ let res: any;
362
+ let url;
363
+ if (teamName) {
364
+ url = `${this.orgUrl}${projectName}/${teamName}/_apis/work/teamsettings/iterations`;
365
+ } else {
366
+ url = `${this.orgUrl}${projectName}/_apis/work/teamsettings/iterations`;
367
+ }
368
+ res = await TFSServices.getItemContent(url, this.token, "get");
369
+ return res;
370
+ } //GetIterationsByTeamName
371
+
372
+ async CreateNewWorkItem(
373
+ projectName: string,
374
+ wiBody: any,
375
+ wiType: string,
376
+ byPass: boolean
377
+ ) {
378
+ let url =
379
+ `${this.orgUrl}${projectName}/_apis/wit/workitems/$${wiType}?bypassRules=${String(byPass).toString()}`;
380
+ return TFSServices.getItemContent(url,this.token,"POST",wiBody,{"Content-Type": "application/json-patch+json"});
381
+ } //CreateNewWorkItem
382
+
383
+ async GetWorkitemAttachments(
384
+ project: string,
385
+ id: string
386
+ ) {
387
+ let attachmentList: Array<string> = [];
388
+ let ticketsDataProvider = new TicketsDataProvider(
389
+ this.orgUrl,
390
+ this.token,
391
+ );
392
+ try {
393
+ let wi = await ticketsDataProvider.GetWorkItem(project, id);
394
+ if (!wi.relations) return [];
395
+ await Promise.all(
396
+ wi.relations.map(async (relation: any) => {
397
+ if (relation.rel == "AttachedFile") {
398
+ let attachment = JSON.parse(JSON.stringify(relation));
399
+ attachment.downloadUrl = `${relation.url}/${relation.attributes.name}`;
400
+ attachmentList.push(attachment);
401
+ }
402
+ })
403
+ );
404
+ return attachmentList;
405
+ } catch (e) {
406
+ logger.error(`error fetching attachments for work item ${id}`);
407
+ logger.error(`${JSON.stringify(e)}`);
408
+ return [];
409
+ }
410
+ }
411
+
412
+ async GetWorkitemAttachmentsJSONData(
413
+ project: string,
414
+ attachmentId: string
415
+ ) {
416
+ let wiuRL =`${this.orgUrl}${project}/_apis/wit/attachments/${attachmentId}`;
417
+ let attachment = await TFSServices.getItemContent(wiuRL, this.token);
418
+ return attachment;
419
+ }
420
+
421
+ async UpdateWorkItem(
422
+ projectName: string,
423
+ wiBody: any,
424
+ workItemId: number,
425
+ byPass: boolean
426
+ ) {
427
+ let res: any;
428
+ let url: string =
429
+ `${this.orgUrl}${projectName}/_apis/wit/workitems/${workItemId}?bypassRules=${String(byPass).toString()}`;
430
+ res = await TFSServices.getItemContent(url, this.token, "patch", wiBody, {
431
+ "Content-Type": "application/json-patch+json",
432
+ });
433
+ return res;
434
+ } //CreateNewWorkItem
435
+ }
@@ -0,0 +1,207 @@
1
+ import DgDataProviderAzureDevOps from "../..";
2
+
3
+ require("dotenv").config();
4
+ jest.setTimeout(60000);
5
+ const orgUrl = process.env.ORG_URL;
6
+ const token = process.env.PAT;
7
+
8
+ const dgDataProviderAzureDevOps = new DgDataProviderAzureDevOps(orgUrl,token);
9
+
10
+
11
+ describe("git module - tests", () => {
12
+ test("should return repo list for teamProject", async () => {
13
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
14
+ let json: any = await gitDataProvider.GetTeamProjectGitReposList(
15
+ "tests"
16
+ );
17
+ expect(json).toBeDefined();
18
+ });
19
+ test("should return repo from repoid", async () => {
20
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
21
+ let json: any = await gitDataProvider.GetGitRepoFromRepoId(
22
+ "68f2aee7-0864-458e-93ce-320303a080ed"
23
+ );
24
+ expect(json).toBeDefined();
25
+ });
26
+ test("should return repo by pullrequest id", async () => {
27
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
28
+ let json: any = await gitDataProvider.GetGitRepoFromPrId(
29
+ 73
30
+ );
31
+ expect(json.repository).toBeDefined();
32
+ });
33
+ test("should return commits by pullrequest & repo id", async () => {
34
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
35
+ let json: any = await gitDataProvider.GetGitRepoFromPrId(73);
36
+ let commitJson: any = await gitDataProvider.GetPullRequestCommits(
37
+ json.repository.id,
38
+ 73
39
+ );
40
+ expect(commitJson.value.length).toBeGreaterThan(0);
41
+ });
42
+ test("should return pullrequest threads", async () => {
43
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
44
+ let json = await gitDataProvider.GetPullRequestComments(
45
+ "tests",
46
+ "68f2aee7-0864-458e-93ce-320303a080ed",
47
+ 73
48
+ );
49
+ expect(json.count).toBeDefined;
50
+ });
51
+ test("should create pullrequest thread", async () => {
52
+ let data = {
53
+ comments: [
54
+ {
55
+ parentCommentId: 0,
56
+ content: "Should we add a comment about what this value means?",
57
+ commentType: 1,
58
+ },
59
+ ],
60
+ status: 1,
61
+ threadContext: {
62
+ filePath: "/assaf.txt",
63
+ leftFileEnd: null,
64
+ leftFileStart: null,
65
+ rightFileEnd: {
66
+ line: 2,
67
+ offset: 1,
68
+ },
69
+ rightFileStart: {
70
+ line: 2,
71
+ offset: 5,
72
+ },
73
+ },
74
+ pullRequestThreadContext: {
75
+ changeTrackingId: 1,
76
+ iterationContext: {
77
+ firstComparingIteration: 1,
78
+ secondComparingIteration: 1,
79
+ },
80
+ },
81
+ };
82
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
83
+ let json = await gitDataProvider.CreatePullRequestComment(
84
+ "tests",
85
+ "68f2aee7-0864-458e-93ce-320303a080ed",
86
+ 73,
87
+ data
88
+ );
89
+ expect(json.comment).toBeDefined;
90
+ });
91
+ test("should return commits with linked items in date range", async () => {
92
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
93
+ let commitRange = await gitDataProvider.GetCommitsInDateRange(
94
+ "Azuretraining",
95
+ "b77bccb5-38de-4dca-9dcb-b0f8046bc045",
96
+ "2016-10-21T12:51:51Z",
97
+ "2024-10-24T12:51:51Z",
98
+ "main"
99
+ );
100
+ let items = await gitDataProvider.GetItemsInCommitRange(
101
+ "Azuretraining",
102
+ "b77bccb5-38de-4dca-9dcb-b0f8046bc045",
103
+ commitRange
104
+ );
105
+ expect(items[0].workItem).toBeDefined();
106
+ });
107
+ test("should return source trigger commit for pipline", async () => {
108
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
109
+ let json = await gitDataProvider.GetCommitForPipeline(
110
+ "tests",
111
+ 248
112
+ );
113
+ expect(json).toBe("59d59691ee002815e7aa774f0a90ef28a6e4708f");
114
+ });
115
+ test("should return commits in commit range", async () => {
116
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
117
+ let json = await gitDataProvider.GetCommitsInCommitRange(
118
+ "tests",
119
+ "68f2aee7-0864-458e-93ce-320303a080ed",
120
+ "4ce7f96f74f10bb60d27d7180a8d1bd44da1ffac",
121
+ "e46f8023be49db94b5cf188b41f7ba9db6fd8274"
122
+ );
123
+ expect(json.count).toBeGreaterThan(0);
124
+ });
125
+ test("should return items linked in build range", async () => {
126
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
127
+ let json = await gitDataProvider.GetItemsForPipelinesRange(
128
+ "tests",
129
+ 244,
130
+ 244
131
+ );
132
+ expect(json.length).toBeGreaterThan(0);
133
+ });
134
+ test("should return commits range between dates ", async () => {
135
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
136
+ let json = await gitDataProvider.GetCommitsInDateRange(
137
+ "tests",
138
+ "68f2aee7-0864-458e-93ce-320303a080ed",
139
+ "2009-11-30T12:51:51Z",
140
+ "2021-11-30T12:51:51Z"
141
+ );
142
+ expect(json.count).toBeGreaterThanOrEqual(14);
143
+ });
144
+ test("should return all commits for repo ", async ()=>{
145
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
146
+ let json = await gitDataProvider.GetCommitsForRepo(
147
+ "tests",
148
+ "68f2aee7-0864-458e-93ce-320303a080ed",
149
+ "master"
150
+ );
151
+ expect(json.count).toBeGreaterThanOrEqual(0);
152
+ })
153
+ test("should return all pullrequests for repo ", async ()=>{
154
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
155
+ let json = await gitDataProvider.GetPullRequestsForRepo(
156
+ "tests",
157
+ "68f2aee7-0864-458e-93ce-320303a080ed"
158
+ );
159
+ expect(json.count).toBeGreaterThanOrEqual(0);
160
+ })
161
+
162
+ test("should return all pullrequests for repo with Given PrId ", async ()=>{
163
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
164
+ let json = await gitDataProvider.GetItemsInPullRequestRange(
165
+ "tests",
166
+ "68f2aee7-0864-458e-93ce-320303a080ed",
167
+ [73,74]
168
+ );
169
+ expect(json.count).toBeGreaterThanOrEqual(0);
170
+ })
171
+
172
+ test("should return branches of repository ", async ()=>{
173
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
174
+ let json = await gitDataProvider.GetRepoBranches(
175
+ "tests",
176
+ "68f2aee7-0864-458e-93ce-320303a080ed",
177
+ );
178
+ expect(json.count).toBeGreaterThanOrEqual(0);
179
+ })
180
+
181
+ }); //describe
182
+
183
+ test("should return pull requests in commit range without linked items", async () => {
184
+ let gitDataProvider = await dgDataProviderAzureDevOps.getGitDataProvider();
185
+
186
+ // Get the commit range using the date range
187
+ let commitRange = await gitDataProvider.GetCommitsInDateRange(
188
+ "Azuretraining",
189
+ "b77bccb5-38de-4dca-9dcb-b0f8046bc045",
190
+ "2023-7-21T12:51:51Z",
191
+ "2024-8-21T12:51:51Z",
192
+ "main"
193
+ );
194
+
195
+ // Use the new function to get pull requests without linked items
196
+ let pullRequests = await gitDataProvider.GetPullRequestsInCommitRangeWithoutLinkedItems(
197
+ "Azuretraining",
198
+ "b77bccb5-38de-4dca-9dcb-b0f8046bc045",
199
+ commitRange
200
+ );
201
+
202
+ // Print the pull requests
203
+ console.log("Pull Requests:", pullRequests);
204
+
205
+ expect(pullRequests).toBeDefined();
206
+ expect(pullRequests.length).toBeGreaterThan(0);
207
+ });
@@ -0,0 +1,34 @@
1
+ import DgDataProviderAzureDevOps from "../..";
2
+
3
+ require("dotenv").config();
4
+ jest.setTimeout(60000);
5
+
6
+ const orgUrl = process.env.ORG_URL;
7
+ const token = process.env.PAT;
8
+ const dgDataProviderAzureDevOps = new DgDataProviderAzureDevOps(orgUrl,token);
9
+
10
+
11
+ describe("Common functions module - tests", () => {
12
+ test("should return all collecttion projects", async () => {
13
+ let managmentDataProvider = await dgDataProviderAzureDevOps.getMangementDataProvider();
14
+ let json = await managmentDataProvider.GetProjects();
15
+ expect(json.count).toBeGreaterThanOrEqual(1);
16
+ });
17
+ test("should return project by name", async () => {
18
+ let managmentDataProvider = await dgDataProviderAzureDevOps.getMangementDataProvider();
19
+ let json = await managmentDataProvider.GetProjectByName("tests");
20
+ expect(json.name).toBe("tests");
21
+ });
22
+ test("should return project by id", async () => {
23
+ let managmentDataProvider = await dgDataProviderAzureDevOps.getMangementDataProvider();
24
+ let json = await managmentDataProvider.GetProjectByID(
25
+ "45a48633-890c-42bb-ace3-148d17806857"
26
+ );
27
+ expect(json.name).toBe("tests");
28
+ });
29
+ test("should return all collecttion link types", async () => {
30
+ let managmentDataProvider = await dgDataProviderAzureDevOps.getMangementDataProvider();
31
+ let json = await managmentDataProvider.GetCllectionLinkTypes();
32
+ expect(json.count).toBeGreaterThan(1);
33
+ });
34
+ }); //describe