github-issue-tower-defence-management 1.148.24 → 1.148.25
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/.github/workflows/publish.yml +40 -7
- package/.prettierignore +1 -0
- package/CHANGELOG.md +7 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +6 -2
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -1
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js +19 -0
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/scripts/defaultBranchTipVerify.sh +23 -0
- package/scripts/testWorkflowRunVerify.sh +47 -0
- package/src/adapter/ci/publishTestWorkflowGate.test.ts +653 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +108 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +10 -2
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +28 -0
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +212 -0
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +32 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +1 -1
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -1
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts +3 -2
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts.map +1 -1
|
@@ -268,6 +268,114 @@ describe('ApiV3CheerioRestIssueRepository', () => {
|
|
|
268
268
|
});
|
|
269
269
|
});
|
|
270
270
|
|
|
271
|
+
describe('get', () => {
|
|
272
|
+
it('reads the single project item scoped to the given project without consulting the getAllIssues memo', async () => {
|
|
273
|
+
const {
|
|
274
|
+
repository,
|
|
275
|
+
graphqlProjectItemRepository,
|
|
276
|
+
localStorageCacheRepository,
|
|
277
|
+
projectRepository,
|
|
278
|
+
dateRepository,
|
|
279
|
+
} = createApiV3CheerioRestIssueRepository();
|
|
280
|
+
const project = buildTestProject('test-project-id');
|
|
281
|
+
dateRepository.now.mockResolvedValue(new Date('2026-07-07T00:00:00Z'));
|
|
282
|
+
localStorageCacheRepository.getSingle.mockResolvedValue(null);
|
|
283
|
+
projectRepository.getProject.mockResolvedValue(project);
|
|
284
|
+
graphqlProjectItemRepository.fetchProjectItems.mockResolvedValue([]);
|
|
285
|
+
localStorageCacheRepository.setSingle.mockResolvedValue();
|
|
286
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl.mockResolvedValue(
|
|
287
|
+
buildProjectItem('https://github.com/o/r/issues/1', 'live title'),
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
await repository.getAllIssues('test-project-id');
|
|
291
|
+
const issue = await repository.get(
|
|
292
|
+
'https://github.com/o/r/issues/1',
|
|
293
|
+
project,
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
expect(issue?.title).toBe('live title');
|
|
297
|
+
expect(
|
|
298
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl.mock.calls,
|
|
299
|
+
).toEqual([['https://github.com/o/r/issues/1', 'test-project-id']]);
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
const issueUrlOnTwoProjects = 'https://github.com/o/r/issues/1';
|
|
303
|
+
|
|
304
|
+
const buildProjectScopedItem = (
|
|
305
|
+
itemId: string,
|
|
306
|
+
status: string,
|
|
307
|
+
story: string,
|
|
308
|
+
nextActionHour: string,
|
|
309
|
+
): ProjectItem => ({
|
|
310
|
+
...buildProjectItem(issueUrlOnTwoProjects, itemId),
|
|
311
|
+
id: itemId,
|
|
312
|
+
customFields: [
|
|
313
|
+
{ name: 'Status', value: status },
|
|
314
|
+
{ name: 'story', value: story },
|
|
315
|
+
{ name: 'nextActionHour', value: nextActionHour },
|
|
316
|
+
],
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
const itemOnOtherProject = buildProjectScopedItem(
|
|
320
|
+
'item-on-other-project',
|
|
321
|
+
'Awaiting Workspace',
|
|
322
|
+
'other story',
|
|
323
|
+
'9',
|
|
324
|
+
);
|
|
325
|
+
const itemOnRequestedProject = buildProjectScopedItem(
|
|
326
|
+
'item-on-requested-project',
|
|
327
|
+
'Preparation',
|
|
328
|
+
'requested story',
|
|
329
|
+
'17',
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
const arrangeItemsOnTwoProjects = (
|
|
333
|
+
graphqlProjectItemRepository: ReturnType<
|
|
334
|
+
typeof createApiV3CheerioRestIssueRepository
|
|
335
|
+
>['graphqlProjectItemRepository'],
|
|
336
|
+
): void => {
|
|
337
|
+
const itemsByProjectId = new Map<string, ProjectItem>([
|
|
338
|
+
['other-project-id', itemOnOtherProject],
|
|
339
|
+
['requested-project-id', itemOnRequestedProject],
|
|
340
|
+
]);
|
|
341
|
+
graphqlProjectItemRepository.fetchProjectItemByUrl.mockImplementation(
|
|
342
|
+
async (_issueUrl: string, projectId?: string) =>
|
|
343
|
+
projectId === undefined
|
|
344
|
+
? Array.from(itemsByProjectId.values())[0]
|
|
345
|
+
: (itemsByProjectId.get(projectId) ?? null),
|
|
346
|
+
);
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
it('returns the project item of the requested project when the issue is on two projects', async () => {
|
|
350
|
+
const { repository, graphqlProjectItemRepository } =
|
|
351
|
+
createApiV3CheerioRestIssueRepository();
|
|
352
|
+
arrangeItemsOnTwoProjects(graphqlProjectItemRepository);
|
|
353
|
+
|
|
354
|
+
const issue = await repository.get(
|
|
355
|
+
issueUrlOnTwoProjects,
|
|
356
|
+
buildTestProject('requested-project-id'),
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
expect(issue?.itemId).toBe('item-on-requested-project');
|
|
360
|
+
expect(issue?.status).toBe('Preparation');
|
|
361
|
+
expect(issue?.story).toBe('requested story');
|
|
362
|
+
expect(issue?.nextActionHour).toBe(17);
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('returns null when the issue has project items only on other projects', async () => {
|
|
366
|
+
const { repository, graphqlProjectItemRepository } =
|
|
367
|
+
createApiV3CheerioRestIssueRepository();
|
|
368
|
+
arrangeItemsOnTwoProjects(graphqlProjectItemRepository);
|
|
369
|
+
|
|
370
|
+
const issue = await repository.get(
|
|
371
|
+
issueUrlOnTwoProjects,
|
|
372
|
+
buildTestProject('project-without-any-item'),
|
|
373
|
+
);
|
|
374
|
+
|
|
375
|
+
expect(issue).toBeNull();
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
|
|
271
379
|
describe('getAllIssues incremental fetch', () => {
|
|
272
380
|
it('light-scans the lastFetchedAt UTC day with no previous-day overlap, detail-fetches changed items by id, and upserts by url', async () => {
|
|
273
381
|
const {
|
|
@@ -911,8 +911,16 @@ export class ApiV3CheerioRestIssueRepository
|
|
|
911
911
|
searchIssues = (query: string): Promise<SearchedIssue[]> => {
|
|
912
912
|
return this.restIssueRepository.searchIssues(query);
|
|
913
913
|
};
|
|
914
|
-
get = async (
|
|
915
|
-
|
|
914
|
+
get = async (issueUrl: string, project: Project): Promise<Issue | null> => {
|
|
915
|
+
const projectItem =
|
|
916
|
+
await this.graphqlProjectItemRepository.fetchProjectItemByUrl(
|
|
917
|
+
issueUrl,
|
|
918
|
+
project.id,
|
|
919
|
+
);
|
|
920
|
+
if (!projectItem) {
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
return this.convertProjectItemToIssue(projectItem);
|
|
916
924
|
};
|
|
917
925
|
update = async (issue: Issue, _project: Project): Promise<void> => {
|
|
918
926
|
await this.updateIssue(issue);
|
|
@@ -281,6 +281,34 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
281
281
|
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
282
282
|
});
|
|
283
283
|
|
|
284
|
+
it('should read the issue scoped to the project it was given and throw IssueNotFoundError when the issue has no item on that project', async () => {
|
|
285
|
+
const issueUrlOnAnotherProjectOnly =
|
|
286
|
+
'https://github.com/user/repo/issues/7';
|
|
287
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
288
|
+
mockIssueRepository.get.mockImplementation(
|
|
289
|
+
async (issueUrl: string, project: Project) =>
|
|
290
|
+
project.id === mockProject.id
|
|
291
|
+
? null
|
|
292
|
+
: createMockIssue({ url: issueUrl, status: 'Preparation' }),
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
await expect(
|
|
296
|
+
useCase.run({
|
|
297
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
298
|
+
issueUrl: issueUrlOnAnotherProjectOnly,
|
|
299
|
+
thresholdForAutoReject: 3,
|
|
300
|
+
workflowBlockerResolvedWebhookUrl: null,
|
|
301
|
+
allowedIssueAuthors: null,
|
|
302
|
+
}),
|
|
303
|
+
).rejects.toThrow(`Issue not found: ${issueUrlOnAnotherProjectOnly}`);
|
|
304
|
+
expect(mockIssueRepository.get.mock.calls).toEqual([
|
|
305
|
+
[issueUrlOnAnotherProjectOnly, mockProject],
|
|
306
|
+
]);
|
|
307
|
+
expect(mockIssueRepository.update).not.toHaveBeenCalled();
|
|
308
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
309
|
+
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
|
|
310
|
+
});
|
|
311
|
+
|
|
284
312
|
it('should process a pull request URL the same as an issue URL when the project item resolves', async () => {
|
|
285
313
|
const prIssue = createMockIssue({
|
|
286
314
|
url: 'https://github.com/user/repo/pull/77',
|
|
@@ -112,6 +112,7 @@ describe('RevertOrphanedPreparationUseCase', () => {
|
|
|
112
112
|
| 'updateStatus'
|
|
113
113
|
| 'findRelatedOpenPRs'
|
|
114
114
|
| 'getOpenPullRequest'
|
|
115
|
+
| 'get'
|
|
115
116
|
>
|
|
116
117
|
>;
|
|
117
118
|
let mockIssueCommentRepository: Mocked<
|
|
@@ -136,6 +137,11 @@ describe('RevertOrphanedPreparationUseCase', () => {
|
|
|
136
137
|
updateStatus: jest.fn().mockResolvedValue(undefined),
|
|
137
138
|
findRelatedOpenPRs: jest.fn().mockResolvedValue([]),
|
|
138
139
|
getOpenPullRequest: jest.fn().mockResolvedValue(null),
|
|
140
|
+
get: jest
|
|
141
|
+
.fn()
|
|
142
|
+
.mockImplementation(async (issueUrl: string) =>
|
|
143
|
+
createMockIssue({ url: issueUrl, status: 'Preparation' }),
|
|
144
|
+
),
|
|
139
145
|
};
|
|
140
146
|
mockIssueCommentRepository = {
|
|
141
147
|
getCommentsFromIssue: jest.fn().mockResolvedValue([]),
|
|
@@ -1424,4 +1430,210 @@ describe('RevertOrphanedPreparationUseCase', () => {
|
|
|
1424
1430
|
'Auto Status Check: REJECTED\n- ORPHANED_PREPARATION',
|
|
1425
1431
|
);
|
|
1426
1432
|
});
|
|
1433
|
+
|
|
1434
|
+
describe('live status re-read before writing', () => {
|
|
1435
|
+
const arrangeSnapshotSaysPreparation = (
|
|
1436
|
+
liveStatus: string | null,
|
|
1437
|
+
comments: { author: string; content: string; createdAt: Date }[],
|
|
1438
|
+
): Issue => {
|
|
1439
|
+
const snapshotIssue = createMockIssue({
|
|
1440
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
1441
|
+
status: 'Preparation',
|
|
1442
|
+
});
|
|
1443
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
1444
|
+
project: mockProject,
|
|
1445
|
+
issues: [snapshotIssue],
|
|
1446
|
+
cacheUsed: false,
|
|
1447
|
+
});
|
|
1448
|
+
mockIssueRepository.get.mockResolvedValue(
|
|
1449
|
+
liveStatus === null
|
|
1450
|
+
? null
|
|
1451
|
+
: createMockIssue({
|
|
1452
|
+
url: snapshotIssue.url,
|
|
1453
|
+
status: liveStatus,
|
|
1454
|
+
}),
|
|
1455
|
+
);
|
|
1456
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
1457
|
+
stdout: '',
|
|
1458
|
+
stderr: '',
|
|
1459
|
+
exitCode: 1,
|
|
1460
|
+
});
|
|
1461
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue(
|
|
1462
|
+
comments,
|
|
1463
|
+
);
|
|
1464
|
+
return snapshotIssue;
|
|
1465
|
+
};
|
|
1466
|
+
|
|
1467
|
+
it('does not write Failed Preparation when the live status has already moved to Awaiting Workspace', async () => {
|
|
1468
|
+
arrangeSnapshotSaysPreparation('Awaiting Workspace', [
|
|
1469
|
+
{
|
|
1470
|
+
author: 'bot',
|
|
1471
|
+
content: 'Auto Status Check: REJECTED\n- ORPHANED_PREPARATION',
|
|
1472
|
+
createdAt: new Date(),
|
|
1473
|
+
},
|
|
1474
|
+
{
|
|
1475
|
+
author: 'bot',
|
|
1476
|
+
content: 'Auto Status Check: REJECTED\n- ORPHANED_PREPARATION',
|
|
1477
|
+
createdAt: new Date(),
|
|
1478
|
+
},
|
|
1479
|
+
{
|
|
1480
|
+
author: 'bot',
|
|
1481
|
+
content:
|
|
1482
|
+
'Issue has next action date or hour set: nextActionDate=null, nextActionHour=null',
|
|
1483
|
+
createdAt: new Date(),
|
|
1484
|
+
},
|
|
1485
|
+
]);
|
|
1486
|
+
|
|
1487
|
+
await useCase.run({
|
|
1488
|
+
projectUrl: 'https://github.com/user/repo',
|
|
1489
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
1490
|
+
thresholdForAutoReject: 3,
|
|
1491
|
+
});
|
|
1492
|
+
|
|
1493
|
+
expect(
|
|
1494
|
+
mockIssueRepository.updateStatus.mock.calls.map((call) => call[2]),
|
|
1495
|
+
).toEqual([]);
|
|
1496
|
+
expect(mockIssueCommentRepository.createComment.mock.calls).toHaveLength(
|
|
1497
|
+
0,
|
|
1498
|
+
);
|
|
1499
|
+
expect(mockIssueRepository.get.mock.calls).toHaveLength(1);
|
|
1500
|
+
expect(mockIssueRepository.get.mock.calls[0][0]).toBe(
|
|
1501
|
+
'https://github.com/user/repo/issues/10',
|
|
1502
|
+
);
|
|
1503
|
+
expect(mockIssueRepository.get.mock.calls[0][1]).toBe(mockProject);
|
|
1504
|
+
});
|
|
1505
|
+
|
|
1506
|
+
it('does not write Awaiting Quality Check when the live status has already moved to Awaiting Workspace', async () => {
|
|
1507
|
+
arrangeSnapshotSaysPreparation('Awaiting Workspace', [
|
|
1508
|
+
{
|
|
1509
|
+
author: 'bot',
|
|
1510
|
+
content: 'From: :robot: agent',
|
|
1511
|
+
createdAt: new Date(),
|
|
1512
|
+
},
|
|
1513
|
+
]);
|
|
1514
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
1515
|
+
createPassingPr(),
|
|
1516
|
+
]);
|
|
1517
|
+
|
|
1518
|
+
await useCase.run({
|
|
1519
|
+
projectUrl: 'https://github.com/user/repo',
|
|
1520
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
1521
|
+
thresholdForAutoReject: 3,
|
|
1522
|
+
});
|
|
1523
|
+
|
|
1524
|
+
expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(0);
|
|
1525
|
+
expect(mockIssueCommentRepository.createComment.mock.calls).toHaveLength(
|
|
1526
|
+
0,
|
|
1527
|
+
);
|
|
1528
|
+
});
|
|
1529
|
+
|
|
1530
|
+
it('does not write any status when the live read finds no issue', async () => {
|
|
1531
|
+
arrangeSnapshotSaysPreparation(null, []);
|
|
1532
|
+
|
|
1533
|
+
await useCase.run({
|
|
1534
|
+
projectUrl: 'https://github.com/user/repo',
|
|
1535
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
1536
|
+
thresholdForAutoReject: 3,
|
|
1537
|
+
});
|
|
1538
|
+
|
|
1539
|
+
expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(0);
|
|
1540
|
+
expect(mockIssueCommentRepository.createComment.mock.calls).toHaveLength(
|
|
1541
|
+
0,
|
|
1542
|
+
);
|
|
1543
|
+
});
|
|
1544
|
+
|
|
1545
|
+
it('still writes Failed Preparation when the live status is confirmed as Preparation', async () => {
|
|
1546
|
+
const snapshotIssue = arrangeSnapshotSaysPreparation('Preparation', [
|
|
1547
|
+
{
|
|
1548
|
+
author: 'bot',
|
|
1549
|
+
content: 'Auto Status Check: REJECTED\n- ORPHANED_PREPARATION',
|
|
1550
|
+
createdAt: new Date(),
|
|
1551
|
+
},
|
|
1552
|
+
{
|
|
1553
|
+
author: 'bot',
|
|
1554
|
+
content: 'Auto Status Check: REJECTED\n- ORPHANED_PREPARATION',
|
|
1555
|
+
createdAt: new Date(),
|
|
1556
|
+
},
|
|
1557
|
+
]);
|
|
1558
|
+
|
|
1559
|
+
await useCase.run({
|
|
1560
|
+
projectUrl: 'https://github.com/user/repo',
|
|
1561
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
1562
|
+
thresholdForAutoReject: 3,
|
|
1563
|
+
});
|
|
1564
|
+
|
|
1565
|
+
expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(1);
|
|
1566
|
+
expect(mockIssueRepository.updateStatus.mock.calls[0][1]).toBe(
|
|
1567
|
+
snapshotIssue,
|
|
1568
|
+
);
|
|
1569
|
+
expect(mockIssueRepository.updateStatus.mock.calls[0][2]).toBe('5');
|
|
1570
|
+
});
|
|
1571
|
+
|
|
1572
|
+
it('logs the error, skips the candidate and keeps processing the next candidate when the live read rejects', async () => {
|
|
1573
|
+
const failingIssue = createMockIssue({
|
|
1574
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
1575
|
+
status: 'Preparation',
|
|
1576
|
+
});
|
|
1577
|
+
const followingIssue = createMockIssue({
|
|
1578
|
+
url: 'https://github.com/user/repo/issues/11',
|
|
1579
|
+
number: 11,
|
|
1580
|
+
itemId: 'item-11',
|
|
1581
|
+
status: 'Preparation',
|
|
1582
|
+
});
|
|
1583
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
1584
|
+
project: mockProject,
|
|
1585
|
+
issues: [failingIssue, followingIssue],
|
|
1586
|
+
cacheUsed: false,
|
|
1587
|
+
});
|
|
1588
|
+
const liveReadError = new Error(
|
|
1589
|
+
'GitHub GraphQL API returned no data for a single project item read',
|
|
1590
|
+
);
|
|
1591
|
+
mockIssueRepository.get.mockImplementation(async (issueUrl: string) => {
|
|
1592
|
+
if (issueUrl === failingIssue.url) {
|
|
1593
|
+
throw liveReadError;
|
|
1594
|
+
}
|
|
1595
|
+
return createMockIssue({ url: issueUrl, status: 'Preparation' });
|
|
1596
|
+
});
|
|
1597
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
1598
|
+
stdout: '',
|
|
1599
|
+
stderr: '',
|
|
1600
|
+
exitCode: 1,
|
|
1601
|
+
});
|
|
1602
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([]);
|
|
1603
|
+
const consoleErrorSpy = jest
|
|
1604
|
+
.spyOn(console, 'error')
|
|
1605
|
+
.mockImplementation(() => undefined);
|
|
1606
|
+
|
|
1607
|
+
try {
|
|
1608
|
+
await useCase.run({
|
|
1609
|
+
projectUrl: 'https://github.com/user/repo',
|
|
1610
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
1611
|
+
thresholdForAutoReject: 3,
|
|
1612
|
+
});
|
|
1613
|
+
|
|
1614
|
+
expect(
|
|
1615
|
+
consoleErrorSpy.mock.calls.filter(
|
|
1616
|
+
(call) =>
|
|
1617
|
+
typeof call[0] === 'string' &&
|
|
1618
|
+
call[0].includes(failingIssue.url) &&
|
|
1619
|
+
call[1] === liveReadError,
|
|
1620
|
+
),
|
|
1621
|
+
).toHaveLength(1);
|
|
1622
|
+
} finally {
|
|
1623
|
+
consoleErrorSpy.mockRestore();
|
|
1624
|
+
}
|
|
1625
|
+
|
|
1626
|
+
expect(
|
|
1627
|
+
mockIssueRepository.updateStatus.mock.calls.map((call) => [
|
|
1628
|
+
call[1].url,
|
|
1629
|
+
call[2],
|
|
1630
|
+
]),
|
|
1631
|
+
).toEqual([[followingIssue.url, '1']]);
|
|
1632
|
+
expect(
|
|
1633
|
+
mockIssueCommentRepository.createComment.mock.calls.map(
|
|
1634
|
+
(call) => call[0].url,
|
|
1635
|
+
),
|
|
1636
|
+
).toEqual([followingIssue.url]);
|
|
1637
|
+
});
|
|
1638
|
+
});
|
|
1427
1639
|
});
|
|
@@ -6,6 +6,7 @@ import { IssueCommentRepository } from './adapter-interfaces/IssueCommentReposit
|
|
|
6
6
|
import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
7
7
|
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
8
8
|
import { Issue } from '../entities/Issue';
|
|
9
|
+
import { Project } from '../entities/Project';
|
|
9
10
|
import { Comment } from '../entities/Comment';
|
|
10
11
|
import {
|
|
11
12
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
@@ -39,6 +40,7 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
39
40
|
| 'updateStatus'
|
|
40
41
|
| 'findRelatedOpenPRs'
|
|
41
42
|
| 'getOpenPullRequest'
|
|
43
|
+
| 'get'
|
|
42
44
|
>,
|
|
43
45
|
readonly issueCommentRepository: Pick<
|
|
44
46
|
IssueCommentRepository,
|
|
@@ -103,6 +105,13 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
103
105
|
resolveLabelsNotRequiringPullRequest(params),
|
|
104
106
|
params.allowedIssueAuthors,
|
|
105
107
|
);
|
|
108
|
+
const isStillInPreparation = await this.isStillInPreparation(
|
|
109
|
+
issue,
|
|
110
|
+
project,
|
|
111
|
+
);
|
|
112
|
+
if (!isStillInPreparation) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
106
115
|
if (outcome === 'returnToLabelSelectedAgent') {
|
|
107
116
|
await this.issueRepository.updateStatus(
|
|
108
117
|
project,
|
|
@@ -174,6 +183,29 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
174
183
|
}
|
|
175
184
|
};
|
|
176
185
|
|
|
186
|
+
private isStillInPreparation = async (
|
|
187
|
+
issue: Issue,
|
|
188
|
+
project: Project,
|
|
189
|
+
): Promise<boolean> => {
|
|
190
|
+
let liveIssue: Issue | null;
|
|
191
|
+
try {
|
|
192
|
+
liveIssue = await this.issueRepository.get(issue.url, project);
|
|
193
|
+
} catch (error) {
|
|
194
|
+
console.error(
|
|
195
|
+
`Failed to re-read the live status before reverting orphaned preparation. issueUrl: ${issue.url}`,
|
|
196
|
+
error,
|
|
197
|
+
);
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (liveIssue === null) {
|
|
201
|
+
console.error(
|
|
202
|
+
`Issue not found while re-reading its live status before reverting orphaned preparation. issueUrl: ${issue.url}`,
|
|
203
|
+
);
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
return liveIssue.status === PREPARATION_STATUS_NAME;
|
|
207
|
+
};
|
|
208
|
+
|
|
177
209
|
private evaluateOutcome = async (
|
|
178
210
|
issue: Issue,
|
|
179
211
|
labelsNotRequiringPullRequest: string[],
|
|
@@ -76,7 +76,7 @@ export declare class ApiV3CheerioRestIssueRepository extends BaseGitHubRepositor
|
|
|
76
76
|
removeLabel: (issue: Issue, label: string) => Promise<void>;
|
|
77
77
|
updateAssigneeList: (issue: Pick<Issue, "org" | "repo" | "number">, assigneeList: Member["name"][]) => Promise<void>;
|
|
78
78
|
searchIssues: (query: string) => Promise<SearchedIssue[]>;
|
|
79
|
-
get: (
|
|
79
|
+
get: (issueUrl: string, project: Project) => Promise<Issue | null>;
|
|
80
80
|
update: (issue: Issue, _project: Project) => Promise<void>;
|
|
81
81
|
private parseIssueUrl;
|
|
82
82
|
private computePrStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ApiV3CheerioRestIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,10 @@ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
|
4
4
|
import { LocalCommandRunner } from './adapter-interfaces/LocalCommandRunner';
|
|
5
5
|
export declare class RevertOrphanedPreparationUseCase {
|
|
6
6
|
readonly projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>;
|
|
7
|
-
readonly issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest'>;
|
|
7
|
+
readonly issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'get'>;
|
|
8
8
|
readonly issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>;
|
|
9
9
|
readonly localCommandRunner: LocalCommandRunner;
|
|
10
|
-
constructor(projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>, issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, localCommandRunner: LocalCommandRunner);
|
|
10
|
+
constructor(projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>, issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'get'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, localCommandRunner: LocalCommandRunner);
|
|
11
11
|
run: (params: {
|
|
12
12
|
projectUrl: string;
|
|
13
13
|
preparationProcessCheckCommand: string;
|
|
@@ -19,6 +19,7 @@ export declare class RevertOrphanedPreparationUseCase {
|
|
|
19
19
|
labelsNotRequiringPullRequest?: string[] | null;
|
|
20
20
|
allowedIssueAuthors?: string[] | null;
|
|
21
21
|
}) => Promise<void>;
|
|
22
|
+
private isStillInPreparation;
|
|
22
23
|
private evaluateOutcome;
|
|
23
24
|
private resolveOpenPrsForPrItem;
|
|
24
25
|
private reportBodyHasNextStep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertOrphanedPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertOrphanedPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"RevertOrphanedPreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertOrphanedPreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAwB7E,qBAAa,gCAAgC;IAEzC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAC9B,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC;IACD,QAAQ,CAAC,eAAe,EAAE,IAAI,CAC5B,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,KAAK,CACR;IACD,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CACnC,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC;IACD,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB;gBAhBtC,iBAAiB,EAAE,IAAI,CAC9B,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACQ,eAAe,EAAE,IAAI,CAC5B,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,KAAK,CACR,EACQ,sBAAsB,EAAE,IAAI,CACnC,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC,EACQ,kBAAkB,EAAE,kBAAkB;IAGjD,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,8BAA8B,EAAE,MAAM,CAAC;QACvC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,0BAA0B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3C,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACvC,6BAA6B,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QAChD,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC,IAAI,CAAC,CA0Hf;IAEF,OAAO,CAAC,oBAAoB,CAqB1B;IAEF,OAAO,CAAC,eAAe,CAwFrB;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,eAAe,CA6BrB;IAEF,OAAO,CAAC,YAAY,CA+BlB;CACH"}
|