github-issue-tower-defence-management 1.153.5 → 1.154.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 +14 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +187 -6
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/bin/adapter/repositories/issue/RestIssueRepository.js +6 -0
- package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -1
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js +10 -16
- package/bin/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.js.map +1 -1
- package/bin/domain/usecases/IssueRejectionEvaluator.js +28 -11
- package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js +15 -3
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/console/ui/e2e/consoleTestHarness.ts +14 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +252 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +288 -6
- package/src/adapter/repositories/issue/RestIssueRepository.test.ts +19 -0
- package/src/adapter/repositories/issue/RestIssueRepository.ts +13 -0
- package/src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.test.ts +211 -200
- package/src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts +13 -18
- package/src/domain/usecases/IssueRejectionEvaluator.ts +49 -15
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +154 -0
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +33 -5
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +8 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +9 -2
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts +1 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -1
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts +2 -2
- package/types/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.d.ts.map +1 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts +6 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
- package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts +1 -1
- package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts.map +1 -1
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +3 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConvertCheckboxToIssueInStoryIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts"],"names":[],"mappings":";;;AAIA,mCAAuC;AACvC,+DAAgE;AAGhE,MAAa,yCAAyC;IACpD,YACW,
|
|
1
|
+
{"version":3,"file":"ConvertCheckboxToIssueInStoryIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/ConvertCheckboxToIssueInStoryIssueUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,17 +7,11 @@ class IssueRejectionEvaluator {
|
|
|
7
7
|
this.evaluate = async (issue, labelsNotRequiringPullRequest = [], options = {}) => {
|
|
8
8
|
const rejections = [];
|
|
9
9
|
let approvedPrUrl = null;
|
|
10
|
-
|
|
11
|
-
const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
|
|
12
|
-
const hasLabelNotRequiringPullRequest = issue.labels.some((label) => labelsNotRequiringPullRequest.includes(label));
|
|
13
|
-
if (!hasLlmAgentLabel &&
|
|
14
|
-
!hasLabelNotRequiringPullRequest &&
|
|
15
|
-
this.isPullRequestRequiredByBody(issue.body) &&
|
|
16
|
-
(categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))) {
|
|
10
|
+
if (this.requiresPullRequestEvaluation(issue, labelsNotRequiringPullRequest)) {
|
|
17
11
|
let prsToCheck;
|
|
18
12
|
let anyPrResolutionFailed = false;
|
|
19
13
|
if (issue.isPr) {
|
|
20
|
-
const resolved = await this.resolveOpenPrsForPrItem(issue.url);
|
|
14
|
+
const resolved = await this.resolveOpenPrsForPrItem(issue.url, options.resolvedOpenPrByUrl ?? null);
|
|
21
15
|
if (resolved === null) {
|
|
22
16
|
// getOpenPullRequest failed transiently: the PR's state is unknown
|
|
23
17
|
// for this cycle, so skip it without emitting any rejection.
|
|
@@ -26,7 +20,7 @@ class IssueRejectionEvaluator {
|
|
|
26
20
|
prsToCheck = resolved;
|
|
27
21
|
}
|
|
28
22
|
else if (options.relatedOpenPrUrls != null) {
|
|
29
|
-
const resolved = await this.resolveOpenPrsFromUrls(options.relatedOpenPrUrls);
|
|
23
|
+
const resolved = await this.resolveOpenPrsFromUrls(options.relatedOpenPrUrls, options.resolvedOpenPrByUrl ?? null);
|
|
30
24
|
prsToCheck = resolved.prs;
|
|
31
25
|
anyPrResolutionFailed = resolved.anyResolutionFailed;
|
|
32
26
|
}
|
|
@@ -115,10 +109,26 @@ class IssueRejectionEvaluator {
|
|
|
115
109
|
}
|
|
116
110
|
return { rejections, approvedPrUrl };
|
|
117
111
|
};
|
|
112
|
+
// Whether this item's pull requests are looked at at all. A caller that
|
|
113
|
+
// resolves pull request state in one batch for a whole cycle asks this first,
|
|
114
|
+
// so the batch covers exactly the items evaluate would have resolved.
|
|
115
|
+
this.requiresPullRequestEvaluation = (issue, labelsNotRequiringPullRequest = []) => {
|
|
116
|
+
const categoryLabels = issue.labels.filter((label) => label.startsWith('category:'));
|
|
117
|
+
const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
|
|
118
|
+
const hasLabelNotRequiringPullRequest = issue.labels.some((label) => labelsNotRequiringPullRequest.includes(label));
|
|
119
|
+
return (!hasLlmAgentLabel &&
|
|
120
|
+
!hasLabelNotRequiringPullRequest &&
|
|
121
|
+
this.isPullRequestRequiredByBody(issue.body) &&
|
|
122
|
+
(categoryLabels.length <= 0 || categoryLabels.includes('category:e2e')));
|
|
123
|
+
};
|
|
118
124
|
// Returns null when getOpenPullRequest throws (e.g. a transient GitHub
|
|
119
125
|
// GraphQL server error): the PR's state is unknown for this cycle and the
|
|
120
126
|
// caller skips it instead of letting the error abort the schedule cycle.
|
|
121
|
-
this.resolveOpenPrsForPrItem = async (prUrl) => {
|
|
127
|
+
this.resolveOpenPrsForPrItem = async (prUrl, resolvedOpenPrByUrl) => {
|
|
128
|
+
if (resolvedOpenPrByUrl?.has(prUrl)) {
|
|
129
|
+
const alreadyResolved = resolvedOpenPrByUrl.get(prUrl) ?? null;
|
|
130
|
+
return alreadyResolved === null ? [] : [alreadyResolved];
|
|
131
|
+
}
|
|
122
132
|
let pr;
|
|
123
133
|
try {
|
|
124
134
|
pr = await this.issueRepository.getOpenPullRequest(prUrl);
|
|
@@ -144,11 +154,18 @@ class IssueRejectionEvaluator {
|
|
|
144
154
|
// remaining URLs are still resolved; anyResolutionFailed reports whether at
|
|
145
155
|
// least one URL failed so the caller can avoid treating an unknown state as
|
|
146
156
|
// PULL_REQUEST_NOT_FOUND.
|
|
147
|
-
this.resolveOpenPrsFromUrls = async (prUrls) => {
|
|
157
|
+
this.resolveOpenPrsFromUrls = async (prUrls, resolvedOpenPrByUrl) => {
|
|
148
158
|
const uniquePrUrls = Array.from(new Set(prUrls));
|
|
149
159
|
const resolvedPrs = [];
|
|
150
160
|
let anyResolutionFailed = false;
|
|
151
161
|
for (const prUrl of uniquePrUrls) {
|
|
162
|
+
if (resolvedOpenPrByUrl?.has(prUrl)) {
|
|
163
|
+
const alreadyResolved = resolvedOpenPrByUrl.get(prUrl) ?? null;
|
|
164
|
+
if (alreadyResolved !== null) {
|
|
165
|
+
resolvedPrs.push(alreadyResolved);
|
|
166
|
+
}
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
152
169
|
let pr;
|
|
153
170
|
try {
|
|
154
171
|
pr = await this.issueRepository.getOpenPullRequest(prUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IssueRejectionEvaluator.js","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"IssueRejectionEvaluator.js","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -39,6 +39,18 @@ class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
39
39
|
const { issues } = await this.issueRepository.getAllIssues(projectId);
|
|
40
40
|
const awaitingQualityCheckIssues = issues.filter((issue) => issue.status === WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME);
|
|
41
41
|
const relatedOpenPrUrlsByIssueUrl = this.buildRelatedOpenPrUrlsByIssueUrl(issues);
|
|
42
|
+
const unreadPullRequests = issues.filter((issue) => issue.status === WorkflowStatus_1.DEFAULT_STATUS_NAME && issue.isPr);
|
|
43
|
+
const labelsNotRequiringPullRequest = (0, resolveLabelsNotRequiringPullRequest_1.resolveLabelsNotRequiringPullRequest)(params);
|
|
44
|
+
const willBeEvaluated = (item) => (0, isAuthorAuthorizedForAutoStatusCheck_1.isAuthorAuthorizedForAutoStatusCheck)(item.author, allowedIssueAuthors) &&
|
|
45
|
+
this.issueRejectionEvaluator.requiresPullRequestEvaluation(item, labelsNotRequiringPullRequest);
|
|
46
|
+
const resolvedOpenPrByUrl = await this.issueRepository.getOpenPullRequests(Array.from(new Set([
|
|
47
|
+
...awaitingQualityCheckIssues
|
|
48
|
+
.filter(willBeEvaluated)
|
|
49
|
+
.flatMap((issue) => relatedOpenPrUrlsByIssueUrl.get(issue.url) ?? []),
|
|
50
|
+
...unreadPullRequests
|
|
51
|
+
.filter(willBeEvaluated)
|
|
52
|
+
.map((pullRequest) => pullRequest.url),
|
|
53
|
+
])));
|
|
42
54
|
for (const issue of awaitingQualityCheckIssues) {
|
|
43
55
|
const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
|
|
44
56
|
if (hasLlmAgentLabel) {
|
|
@@ -48,8 +60,9 @@ class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
48
60
|
continue;
|
|
49
61
|
}
|
|
50
62
|
try {
|
|
51
|
-
const { rejections, approvedPrUrl } = await this.issueRejectionEvaluator.evaluate(issue,
|
|
63
|
+
const { rejections, approvedPrUrl } = await this.issueRejectionEvaluator.evaluate(issue, labelsNotRequiringPullRequest, {
|
|
52
64
|
relatedOpenPrUrls: relatedOpenPrUrlsByIssueUrl.get(issue.url) ?? null,
|
|
65
|
+
resolvedOpenPrByUrl,
|
|
53
66
|
});
|
|
54
67
|
if (rejections.length === 1 &&
|
|
55
68
|
rejections[0].type === 'PULL_REQUEST_NOT_FOUND' &&
|
|
@@ -84,7 +97,6 @@ class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
84
97
|
}
|
|
85
98
|
}
|
|
86
99
|
const projectStory = project.story;
|
|
87
|
-
const unreadPullRequests = issues.filter((issue) => issue.status === WorkflowStatus_1.DEFAULT_STATUS_NAME && issue.isPr);
|
|
88
100
|
for (const pullRequest of unreadPullRequests) {
|
|
89
101
|
const hasLlmAgentLabel = pullRequest.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
|
|
90
102
|
if (hasLlmAgentLabel) {
|
|
@@ -94,7 +106,7 @@ class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
94
106
|
continue;
|
|
95
107
|
}
|
|
96
108
|
try {
|
|
97
|
-
const { rejections } = await this.issueRejectionEvaluator.evaluate(pullRequest,
|
|
109
|
+
const { rejections } = await this.issueRejectionEvaluator.evaluate(pullRequest, labelsNotRequiringPullRequest, { resolvedOpenPrByUrl });
|
|
98
110
|
if (rejections.length > 0) {
|
|
99
111
|
if (!pullRequest.assignees.includes(params.manager)) {
|
|
100
112
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertNotReadyReviewQueueIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts"],"names":[],"mappings":";;;AAIA,uEAAoE;AACpE,uFAAoF;AACpF,iGAA8F;AAC9F,yFAAsF;AACtF,iGAA8F;AAC9F,+DAIoC;AAEpC,qEAAqE;AACrE,8EAA8E;AAC9E,0EAA0E;AAC1E,6EAA6E;AAC7E,kDAAkD;AAClD,MAAM,0BAA0B,GAAG,CAAC,KAAc,EAAW,EAAE;IAC7D,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAc,EAAW,EAAE,CACjD,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,CAAC;AAE1D,MAAa,qCAAqC;IAIhD,YACmB,iBAGhB,EACgB,
|
|
1
|
+
{"version":3,"file":"RevertNotReadyReviewQueueIssueUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -399,9 +399,12 @@ const createStubIssueRepository = (
|
|
|
399
399
|
getAllIssues: () => notImplemented('getAllIssues'),
|
|
400
400
|
getIssueByUrl: async (url: string): Promise<Issue | null> =>
|
|
401
401
|
buildIssueForUrl(url),
|
|
402
|
+
getIssueBodyByUrl: async (url: string): Promise<string | null> =>
|
|
403
|
+
buildIssueForUrl(url)?.body ?? null,
|
|
402
404
|
createNewIssue: () => notImplemented('createNewIssue'),
|
|
403
405
|
searchIssue: () => notImplemented('searchIssue'),
|
|
404
406
|
updateIssue: () => notImplemented('updateIssue'),
|
|
407
|
+
updateIssueBody: () => notImplemented('updateIssueBody'),
|
|
405
408
|
updateNextActionDate: async (): Promise<void> => undefined,
|
|
406
409
|
updateNextActionHour: () => notImplemented('updateNextActionHour'),
|
|
407
410
|
updateProjectTextField: () => notImplemented('updateProjectTextField'),
|
|
@@ -426,6 +429,17 @@ const createStubIssueRepository = (
|
|
|
426
429
|
url === CONSOLE_E2E_AWAITING_QUALITY_CHECK_PR_URL
|
|
427
430
|
? awaitingQualityCheckPullRequest
|
|
428
431
|
: null,
|
|
432
|
+
getOpenPullRequests: async (
|
|
433
|
+
urls: string[],
|
|
434
|
+
): Promise<Map<string, RelatedPullRequest | null>> =>
|
|
435
|
+
new Map(
|
|
436
|
+
urls.map((url) => [
|
|
437
|
+
url,
|
|
438
|
+
url === CONSOLE_E2E_AWAITING_QUALITY_CHECK_PR_URL
|
|
439
|
+
? awaitingQualityCheckPullRequest
|
|
440
|
+
: null,
|
|
441
|
+
]),
|
|
442
|
+
),
|
|
429
443
|
getPullRequestChangedFilePaths: async (): Promise<string[]> => [],
|
|
430
444
|
approvePullRequest: async (): Promise<void> => undefined,
|
|
431
445
|
requestChangesWithInlineComment: async (
|
|
@@ -1668,6 +1668,64 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
1668
1668
|
});
|
|
1669
1669
|
});
|
|
1670
1670
|
|
|
1671
|
+
describe('getIssueBodyByUrl', () => {
|
|
1672
|
+
afterEach(() => {
|
|
1673
|
+
jest.restoreAllMocks();
|
|
1674
|
+
});
|
|
1675
|
+
|
|
1676
|
+
it('reads the body over the REST issue endpoint', async () => {
|
|
1677
|
+
const fetchSpy = jest.spyOn(global, 'fetch').mockResolvedValueOnce(
|
|
1678
|
+
new Response(JSON.stringify({ body: 'story issue body' }), {
|
|
1679
|
+
status: 200,
|
|
1680
|
+
headers: { 'Content-Type': 'application/json' },
|
|
1681
|
+
}),
|
|
1682
|
+
);
|
|
1683
|
+
|
|
1684
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1685
|
+
const result = await repository.getIssueBodyByUrl(
|
|
1686
|
+
'https://github.com/HiromiShikata/test-repository/issues/42',
|
|
1687
|
+
);
|
|
1688
|
+
|
|
1689
|
+
expect(result).toBe('story issue body');
|
|
1690
|
+
expect(fetchSpy).toHaveBeenCalledWith(
|
|
1691
|
+
'https://api.github.com/repos/HiromiShikata/test-repository/issues/42',
|
|
1692
|
+
expect.objectContaining({ method: 'GET' }),
|
|
1693
|
+
);
|
|
1694
|
+
});
|
|
1695
|
+
|
|
1696
|
+
it('returns null when the issue no longer exists', async () => {
|
|
1697
|
+
jest.spyOn(global, 'fetch').mockResolvedValueOnce(
|
|
1698
|
+
new Response('Not Found', {
|
|
1699
|
+
status: 404,
|
|
1700
|
+
statusText: 'Not Found',
|
|
1701
|
+
}),
|
|
1702
|
+
);
|
|
1703
|
+
|
|
1704
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1705
|
+
const result = await repository.getIssueBodyByUrl(
|
|
1706
|
+
'https://github.com/HiromiShikata/test-repository/issues/42',
|
|
1707
|
+
);
|
|
1708
|
+
|
|
1709
|
+
expect(result).toBeNull();
|
|
1710
|
+
});
|
|
1711
|
+
|
|
1712
|
+
it('throws when the API fails for a reason other than the issue being absent', async () => {
|
|
1713
|
+
jest.spyOn(global, 'fetch').mockResolvedValueOnce(
|
|
1714
|
+
new Response('Bad Gateway', {
|
|
1715
|
+
status: 502,
|
|
1716
|
+
statusText: 'Bad Gateway',
|
|
1717
|
+
}),
|
|
1718
|
+
);
|
|
1719
|
+
|
|
1720
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
1721
|
+
await expect(
|
|
1722
|
+
repository.getIssueBodyByUrl(
|
|
1723
|
+
'https://github.com/HiromiShikata/test-repository/issues/42',
|
|
1724
|
+
),
|
|
1725
|
+
).rejects.toThrow('502');
|
|
1726
|
+
});
|
|
1727
|
+
});
|
|
1728
|
+
|
|
1671
1729
|
describe('getIssueOrPullRequestComments', () => {
|
|
1672
1730
|
afterEach(() => {
|
|
1673
1731
|
jest.restoreAllMocks();
|
|
@@ -2339,6 +2397,9 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2339
2397
|
prNumber: number;
|
|
2340
2398
|
reviewThreadsAfter: string | null;
|
|
2341
2399
|
}) => Response | object;
|
|
2400
|
+
slimPullRequestBatch?: (
|
|
2401
|
+
variables: Record<string, unknown>,
|
|
2402
|
+
) => Response | object;
|
|
2342
2403
|
branchRules?: (url: string) => Response | object;
|
|
2343
2404
|
branchDetail?: (url: string) => Response | object;
|
|
2344
2405
|
checkRuns?: (url: string) => Response | object;
|
|
@@ -2363,6 +2424,7 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2363
2424
|
prNumber: number;
|
|
2364
2425
|
reviewThreadsAfter: string | null;
|
|
2365
2426
|
};
|
|
2427
|
+
rawVariables: Record<string, unknown>;
|
|
2366
2428
|
};
|
|
2367
2429
|
|
|
2368
2430
|
const parseGraphqlRequestBody = (init?: RequestInit): GraphqlRequestBody => {
|
|
@@ -2401,6 +2463,7 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2401
2463
|
return {
|
|
2402
2464
|
query: parsed.query,
|
|
2403
2465
|
variables: { owner, repo, prNumber, reviewThreadsAfter },
|
|
2466
|
+
rawVariables: Object.fromEntries(Object.entries(variables)),
|
|
2404
2467
|
};
|
|
2405
2468
|
};
|
|
2406
2469
|
|
|
@@ -2421,6 +2484,12 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2421
2484
|
) {
|
|
2422
2485
|
return toResponse(routes.mergeability());
|
|
2423
2486
|
}
|
|
2487
|
+
if (
|
|
2488
|
+
body.query.includes('PullRequestSlimStatusBatch') &&
|
|
2489
|
+
routes.slimPullRequestBatch
|
|
2490
|
+
) {
|
|
2491
|
+
return toResponse(routes.slimPullRequestBatch(body.rawVariables));
|
|
2492
|
+
}
|
|
2424
2493
|
if (body.query.includes('headRefOid') && routes.slimPullRequest) {
|
|
2425
2494
|
return toResponse(routes.slimPullRequest(body.variables));
|
|
2426
2495
|
}
|
|
@@ -2472,6 +2541,14 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2472
2541
|
body.includes('mergeStateStatus'),
|
|
2473
2542
|
);
|
|
2474
2543
|
|
|
2544
|
+
const countSlimPullRequestBatchQueries = (fetchSpy: FetchSpy): number =>
|
|
2545
|
+
countCallsMatching(
|
|
2546
|
+
fetchSpy,
|
|
2547
|
+
(url, body) =>
|
|
2548
|
+
url === 'https://api.github.com/graphql' &&
|
|
2549
|
+
body.includes('PullRequestSlimStatusBatch'),
|
|
2550
|
+
);
|
|
2551
|
+
|
|
2475
2552
|
const buildSlimPullRequestResponse = (
|
|
2476
2553
|
overrides: {
|
|
2477
2554
|
url?: string;
|
|
@@ -2508,6 +2585,181 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
2508
2585
|
},
|
|
2509
2586
|
});
|
|
2510
2587
|
|
|
2588
|
+
const buildSlimPullRequestNode = (
|
|
2589
|
+
overrides: Parameters<typeof buildSlimPullRequestResponse>[0] = {},
|
|
2590
|
+
) => buildSlimPullRequestResponse(overrides).data.repository.pullRequest;
|
|
2591
|
+
|
|
2592
|
+
describe('getOpenPullRequests batched resolution', () => {
|
|
2593
|
+
afterEach(() => {
|
|
2594
|
+
jest.restoreAllMocks();
|
|
2595
|
+
});
|
|
2596
|
+
|
|
2597
|
+
const prUrlOf = (prNumber: number): string =>
|
|
2598
|
+
`https://github.com/HiromiShikata/test-repository/pull/${prNumber}`;
|
|
2599
|
+
|
|
2600
|
+
it('resolves every pull request state in one GraphQL request', async () => {
|
|
2601
|
+
const prNumbers = [31, 32, 33];
|
|
2602
|
+
const capturedVariables: Record<string, unknown>[] = [];
|
|
2603
|
+
const fetchSpy = mockFetchRoutes({
|
|
2604
|
+
slimPullRequestBatch: (variables) => {
|
|
2605
|
+
capturedVariables.push(variables);
|
|
2606
|
+
return {
|
|
2607
|
+
data: Object.fromEntries(
|
|
2608
|
+
prNumbers.map((prNumber, index) => [
|
|
2609
|
+
`pullRequest${index}`,
|
|
2610
|
+
{
|
|
2611
|
+
pullRequest: buildSlimPullRequestNode({
|
|
2612
|
+
url: prUrlOf(prNumber),
|
|
2613
|
+
headRefName: `feature-${prNumber}`,
|
|
2614
|
+
}),
|
|
2615
|
+
},
|
|
2616
|
+
]),
|
|
2617
|
+
),
|
|
2618
|
+
};
|
|
2619
|
+
},
|
|
2620
|
+
checkRuns: () => ({
|
|
2621
|
+
total_count: 1,
|
|
2622
|
+
check_runs: [{ id: 1, name: 'ci', conclusion: 'success' }],
|
|
2623
|
+
}),
|
|
2624
|
+
});
|
|
2625
|
+
|
|
2626
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2627
|
+
const resolved = await repository.getOpenPullRequests(
|
|
2628
|
+
prNumbers.map(prUrlOf),
|
|
2629
|
+
);
|
|
2630
|
+
|
|
2631
|
+
expect(countSlimPullRequestBatchQueries(fetchSpy)).toBe(1);
|
|
2632
|
+
expect(capturedVariables).toHaveLength(1);
|
|
2633
|
+
expect(capturedVariables[0].prNumber0).toBe(31);
|
|
2634
|
+
expect(capturedVariables[0].prNumber2).toBe(33);
|
|
2635
|
+
expect(Array.from(resolved.keys())).toEqual(prNumbers.map(prUrlOf));
|
|
2636
|
+
for (const prNumber of prNumbers) {
|
|
2637
|
+
expect(resolved.get(prUrlOf(prNumber))?.branchName).toBe(
|
|
2638
|
+
`feature-${prNumber}`,
|
|
2639
|
+
);
|
|
2640
|
+
}
|
|
2641
|
+
});
|
|
2642
|
+
|
|
2643
|
+
it('resolves a pull request the batch reports as not found to an absent pull request', async () => {
|
|
2644
|
+
mockFetchRoutes({
|
|
2645
|
+
slimPullRequestBatch: () => ({
|
|
2646
|
+
data: { pullRequest0: null },
|
|
2647
|
+
errors: [
|
|
2648
|
+
{
|
|
2649
|
+
message: 'Could not resolve to a PullRequest',
|
|
2650
|
+
type: 'NOT_FOUND',
|
|
2651
|
+
path: ['pullRequest0', 'pullRequest'],
|
|
2652
|
+
},
|
|
2653
|
+
],
|
|
2654
|
+
}),
|
|
2655
|
+
});
|
|
2656
|
+
|
|
2657
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2658
|
+
const resolved = await repository.getOpenPullRequests([prUrlOf(31)]);
|
|
2659
|
+
|
|
2660
|
+
expect(resolved.has(prUrlOf(31))).toBe(true);
|
|
2661
|
+
expect(resolved.get(prUrlOf(31))).toBeNull();
|
|
2662
|
+
});
|
|
2663
|
+
|
|
2664
|
+
it('omits a pull request whose alias failed for a reason other than not found so an unknown state is not read as absent', async () => {
|
|
2665
|
+
mockFetchRoutes({
|
|
2666
|
+
slimPullRequestBatch: () => ({
|
|
2667
|
+
data: { pullRequest0: null },
|
|
2668
|
+
errors: [
|
|
2669
|
+
{
|
|
2670
|
+
message: 'Something went wrong while executing your query',
|
|
2671
|
+
type: 'SERVICE_UNAVAILABLE',
|
|
2672
|
+
path: ['pullRequest0', 'pullRequest'],
|
|
2673
|
+
},
|
|
2674
|
+
],
|
|
2675
|
+
}),
|
|
2676
|
+
});
|
|
2677
|
+
|
|
2678
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2679
|
+
const resolved = await repository.getOpenPullRequests([prUrlOf(31)]);
|
|
2680
|
+
|
|
2681
|
+
expect(resolved.has(prUrlOf(31))).toBe(false);
|
|
2682
|
+
});
|
|
2683
|
+
|
|
2684
|
+
it('omits a pull request whose review threads do not fit one page so it is resolved by the paginating path', async () => {
|
|
2685
|
+
mockFetchRoutes({
|
|
2686
|
+
slimPullRequestBatch: () => ({
|
|
2687
|
+
data: {
|
|
2688
|
+
pullRequest0: {
|
|
2689
|
+
pullRequest: buildSlimPullRequestNode({
|
|
2690
|
+
reviewThreads: {
|
|
2691
|
+
pageInfo: { endCursor: 'cursor-1', hasNextPage: true },
|
|
2692
|
+
nodes: [{ isResolved: true }],
|
|
2693
|
+
},
|
|
2694
|
+
}),
|
|
2695
|
+
},
|
|
2696
|
+
},
|
|
2697
|
+
}),
|
|
2698
|
+
});
|
|
2699
|
+
|
|
2700
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2701
|
+
const resolved = await repository.getOpenPullRequests([prUrlOf(31)]);
|
|
2702
|
+
|
|
2703
|
+
expect(resolved.has(prUrlOf(31))).toBe(false);
|
|
2704
|
+
});
|
|
2705
|
+
|
|
2706
|
+
it('leaves every url of a failed batch unresolved so the caller falls back to the single query', async () => {
|
|
2707
|
+
mockFetchRoutes({
|
|
2708
|
+
slimPullRequestBatch: () => ({
|
|
2709
|
+
data: null,
|
|
2710
|
+
errors: [
|
|
2711
|
+
{ message: 'Something went wrong while executing your query' },
|
|
2712
|
+
],
|
|
2713
|
+
}),
|
|
2714
|
+
});
|
|
2715
|
+
|
|
2716
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2717
|
+
const resolved = await repository.getOpenPullRequests([
|
|
2718
|
+
prUrlOf(31),
|
|
2719
|
+
prUrlOf(32),
|
|
2720
|
+
]);
|
|
2721
|
+
|
|
2722
|
+
expect(resolved.size).toBe(0);
|
|
2723
|
+
});
|
|
2724
|
+
|
|
2725
|
+
it('resolves an issue url to an absent pull request without issuing any request', async () => {
|
|
2726
|
+
const fetchSpy = mockFetchRoutes({});
|
|
2727
|
+
const issueUrl =
|
|
2728
|
+
'https://github.com/HiromiShikata/test-repository/issues/31';
|
|
2729
|
+
|
|
2730
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2731
|
+
const resolved = await repository.getOpenPullRequests([issueUrl]);
|
|
2732
|
+
|
|
2733
|
+
expect(resolved.get(issueUrl)).toBeNull();
|
|
2734
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
2735
|
+
});
|
|
2736
|
+
|
|
2737
|
+
it('splits more pull requests than one batch holds into separate GraphQL requests', async () => {
|
|
2738
|
+
const prNumbers = Array.from({ length: 101 }, (_, index) => 1000 + index);
|
|
2739
|
+
const fetchSpy = mockFetchRoutes({
|
|
2740
|
+
slimPullRequestBatch: (variables) => ({
|
|
2741
|
+
data: Object.fromEntries(
|
|
2742
|
+
Object.keys(variables)
|
|
2743
|
+
.filter((name) => name.startsWith('prNumber'))
|
|
2744
|
+
.map((name) => [
|
|
2745
|
+
`pullRequest${name.slice('prNumber'.length)}`,
|
|
2746
|
+
{ pullRequest: buildSlimPullRequestNode() },
|
|
2747
|
+
]),
|
|
2748
|
+
),
|
|
2749
|
+
}),
|
|
2750
|
+
checkRuns: () => ({ total_count: 0, check_runs: [] }),
|
|
2751
|
+
});
|
|
2752
|
+
|
|
2753
|
+
const { repository } = createApiV3CheerioRestIssueRepository();
|
|
2754
|
+
const resolved = await repository.getOpenPullRequests(
|
|
2755
|
+
prNumbers.map(prUrlOf),
|
|
2756
|
+
);
|
|
2757
|
+
|
|
2758
|
+
expect(countSlimPullRequestBatchQueries(fetchSpy)).toBe(2);
|
|
2759
|
+
expect(resolved.size).toBe(prNumbers.length);
|
|
2760
|
+
});
|
|
2761
|
+
});
|
|
2762
|
+
|
|
2511
2763
|
describe('getOpenPullRequest CI state computation', () => {
|
|
2512
2764
|
afterEach(() => {
|
|
2513
2765
|
jest.restoreAllMocks();
|