Skip to content

Commit 95f85a7

Browse files
authored
feat(pr): add support for merge queue (#2470)
* feat(pr): support github `merge queue` Signed-off-by: Adam Setch <adam.setch@outlook.com> * feat(pr): support github `merge queue` Signed-off-by: Adam Setch <adam.setch@outlook.com> * feat(pr): support github `merge queue` Signed-off-by: Adam Setch <adam.setch@outlook.com> --------- Signed-off-by: Adam Setch <adam.setch@outlook.com>
1 parent 1ba7d24 commit 95f85a7

File tree

5 files changed

+57
-3
lines changed

5 files changed

+57
-3
lines changed

src/renderer/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ export interface GitifyPullRequestReview {
293293

294294
export type GitifyDiscussionState = DiscussionStateReason | 'OPEN' | 'ANSWERED';
295295

296-
export type GitifyPullRequestState = PullRequestState | 'DRAFT';
296+
export type GitifyPullRequestState = PullRequestState | 'DRAFT' | 'MERGE_QUEUE';
297297

298298
export type GitifyIssueState = IssueState | IssueStateReason;
299299

src/renderer/utils/notifications/filters/state.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ describe('renderer/utils/notifications/filters/state.ts', () => {
2222
NOT_PLANNED: 'closed',
2323
RESOLVED: 'closed',
2424

25+
MERGE_QUEUE: 'merged',
2526
MERGED: 'merged',
2627
DRAFT: 'draft',
2728

src/renderer/utils/notifications/filters/state.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ function mapStateToFilter(
8282
case 'NOT_PLANNED':
8383
case 'RESOLVED':
8484
return 'closed';
85+
case 'MERGE_QUEUE':
8586
case 'MERGED':
8687
return 'merged';
8788
case 'DRAFT':

src/renderer/utils/notifications/handlers/pullRequest.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,45 @@ describe('renderer/utils/notifications/handlers/pullRequest.ts', () => {
122122
} as GitifySubject);
123123
});
124124

125+
it('merge queue pull request state', async () => {
126+
const mockPullRequest = mockPullRequestResponseNode({
127+
state: 'OPEN',
128+
isInMergeQueue: true,
129+
});
130+
131+
nock('https://api.github.com')
132+
.post('/graphql')
133+
.reply(200, {
134+
data: {
135+
repository: {
136+
pullRequest: mockPullRequest,
137+
},
138+
},
139+
});
140+
141+
const result = await pullRequestHandler.enrich(
142+
mockNotification,
143+
mockSettings,
144+
);
145+
146+
expect(result).toEqual({
147+
number: 123,
148+
state: 'MERGE_QUEUE',
149+
user: {
150+
login: mockAuthor.login,
151+
html_url: mockAuthor.html_url,
152+
avatar_url: mockAuthor.avatar_url,
153+
type: mockAuthor.type,
154+
},
155+
reviews: null,
156+
labels: [],
157+
linkedIssues: [],
158+
comments: 0,
159+
milestone: null,
160+
htmlUrl: 'https://github.com/gitify-app/notifications-test/pulls/123',
161+
} as GitifySubject);
162+
});
163+
125164
it('merged pull request state', async () => {
126165
const mockPullRequest = mockPullRequestResponseNode({
127166
state: 'MERGED',
@@ -349,6 +388,7 @@ describe('renderer/utils/notifications/handlers/pullRequest.ts', () => {
349388
const cases = {
350389
CLOSED: 'GitPullRequestClosedIcon',
351390
DRAFT: 'GitPullRequestDraftIcon',
391+
MERGE_QUEUE: 'GitMergeQueueIcon',
352392
MERGED: 'GitMergeIcon',
353393
OPEN: 'GitPullRequestIcon',
354394
} satisfies Record<GitifyPullRequestState, string>;
@@ -368,6 +408,7 @@ describe('renderer/utils/notifications/handlers/pullRequest.ts', () => {
368408
const cases = {
369409
CLOSED: IconColor.RED,
370410
DRAFT: IconColor.GRAY,
411+
MERGE_QUEUE: IconColor.YELLOW,
371412
MERGED: IconColor.PURPLE,
372413
OPEN: IconColor.GREEN,
373414
} satisfies Record<GitifyPullRequestState, IconColor>;
@@ -445,6 +486,7 @@ function mockPullRequestResponseNode(mocks: {
445486
state: PullRequestState;
446487
isDraft?: boolean;
447488
merged?: boolean;
489+
isInMergeQueue?: boolean;
448490
}): PullRequestResponse {
449491
return {
450492
__typename: 'PullRequest',
@@ -453,7 +495,7 @@ function mockPullRequestResponseNode(mocks: {
453495
state: mocks.state,
454496
isDraft: mocks.isDraft ?? false,
455497
merged: mocks.merged ?? false,
456-
isInMergeQueue: false,
498+
isInMergeQueue: mocks.isInMergeQueue ?? false,
457499
url: 'https://github.com/gitify-app/notifications-test/pulls/123',
458500
author: mockAuthor,
459501
labels: { nodes: [] },

src/renderer/utils/notifications/handlers/pullRequest.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { FC } from 'react';
33
import type { OcticonProps } from '@primer/octicons-react';
44
import {
55
GitMergeIcon,
6+
GitMergeQueueIcon,
67
GitPullRequestClosedIcon,
78
GitPullRequestDraftIcon,
89
GitPullRequestIcon,
@@ -22,6 +23,9 @@ import type { FetchPullRequestByNumberQuery } from '../../api/graphql/generated/
2223
import { DefaultHandler, defaultHandler } from './default';
2324
import { getNotificationAuthor } from './utils';
2425

26+
type PullRequestReviews =
27+
FetchPullRequestByNumberQuery['repository']['pullRequest']['reviews']['nodes'];
28+
2529
class PullRequestHandler extends DefaultHandler {
2630
readonly type = 'PullRequest' as const;
2731

@@ -35,6 +39,8 @@ class PullRequestHandler extends DefaultHandler {
3539
let prState: GitifyPullRequestState = pr.state;
3640
if (pr.isDraft) {
3741
prState = 'DRAFT';
42+
} else if (pr.isInMergeQueue) {
43+
prState = 'MERGE_QUEUE';
3844
}
3945

4046
const prComment = pr.comments?.nodes[0];
@@ -64,6 +70,8 @@ class PullRequestHandler extends DefaultHandler {
6470
return GitPullRequestDraftIcon;
6571
case 'CLOSED':
6672
return GitPullRequestClosedIcon;
73+
case 'MERGE_QUEUE':
74+
return GitMergeQueueIcon;
6775
case 'MERGED':
6876
return GitMergeIcon;
6977
default:
@@ -77,6 +85,8 @@ class PullRequestHandler extends DefaultHandler {
7785
return IconColor.GREEN;
7886
case 'CLOSED':
7987
return IconColor.RED;
88+
case 'MERGE_QUEUE':
89+
return IconColor.YELLOW;
8090
case 'MERGED':
8191
return IconColor.PURPLE;
8292
default:
@@ -94,7 +104,7 @@ class PullRequestHandler extends DefaultHandler {
94104
export const pullRequestHandler = new PullRequestHandler();
95105

96106
export function getLatestReviewForReviewers(
97-
reviews: FetchPullRequestByNumberQuery['repository']['pullRequest']['reviews']['nodes'],
107+
reviews: PullRequestReviews,
98108
): GitifyPullRequestReview[] {
99109
if (!reviews.length) {
100110
return null;

0 commit comments

Comments
 (0)