Skip to content

Commit 0263f5e

Browse files
committed
refactor(handlers): consistently pass GitifyNotification
Signed-off-by: Adam Setch <adam.setch@outlook.com>
1 parent dac3850 commit 0263f5e

25 files changed

+155
-162
lines changed

src/renderer/__mocks__/notifications-mocks.ts

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import { Constants } from '../constants';
22
import type {
33
AccountNotifications,
44
GitifyNotification,
5-
GitifyNotificationState,
65
GitifyRepository,
76
GitifySubject,
87
Hostname,
98
Link,
10-
SubjectType,
119
} from '../types';
1210
import {
1311
mockEnterpriseNotifications,
@@ -42,20 +40,6 @@ export const mockSingleAccountNotifications: AccountNotifications[] = [
4240
},
4341
];
4442

45-
export function createMockSubject(mocks: {
46-
title?: string;
47-
type?: SubjectType;
48-
state?: GitifyNotificationState;
49-
}): GitifySubject {
50-
return {
51-
title: mocks.title ?? 'Mock Subject',
52-
type: mocks.type ?? ('Unknown' as SubjectType),
53-
state: mocks.state ?? ('Unknown' as GitifyNotificationState),
54-
url: null,
55-
latestCommentUrl: null,
56-
};
57-
}
58-
5943
export function createPartialMockNotification(
6044
subject: Partial<GitifySubject>,
6145
repository?: Partial<GitifyRepository>,

src/renderer/components/notifications/NotificationRow.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ export const NotificationRow: FC<NotificationRowProps> = ({
6262
};
6363

6464
const handler = createNotificationHandler(notification);
65-
const NotificationIcon = handler.iconType(notification.subject);
66-
const iconColor = handler.iconColor(notification.subject);
65+
const NotificationIcon = handler.iconType(notification);
66+
const iconColor = handler.iconColor(notification);
6767
const notificationType = handler.formattedNotificationType(notification);
6868
const notificationNumber = handler.formattedNotificationNumber(notification);
6969
const notificationTitle = handler.formattedNotificationTitle(notification);

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import {
2-
createMockSubject,
3-
createPartialMockNotification,
4-
} from '../../../__mocks__/notifications-mocks';
1+
import { createPartialMockNotification } from '../../../__mocks__/notifications-mocks';
52
import { mockSettings } from '../../../__mocks__/state-mocks';
63
import type { GitifyNotification } from '../../../types';
74
import {
@@ -178,11 +175,14 @@ describe('renderer/utils/notifications/handlers/checkSuite.ts', () => {
178175
it.each(
179176
Object.entries(cases) as Array<[GitifyCheckSuiteStatus, IconColor]>,
180177
)('iconType for check suite with status %s', (checkSuiteStatus, checkSuiteIconType) => {
181-
expect(
182-
checkSuiteHandler.iconType(
183-
createMockSubject({ type: 'CheckSuite', state: checkSuiteStatus }),
184-
).displayName,
185-
).toBe(checkSuiteIconType);
178+
const mockNotification = createPartialMockNotification({
179+
type: 'CheckSuite',
180+
state: checkSuiteStatus,
181+
});
182+
183+
expect(checkSuiteHandler.iconType(mockNotification).displayName).toBe(
184+
checkSuiteIconType,
185+
);
186186
});
187187
});
188188

@@ -206,11 +206,14 @@ describe('renderer/utils/notifications/handlers/checkSuite.ts', () => {
206206
it.each(
207207
Object.entries(cases) as Array<[GitifyCheckSuiteStatus, IconColor]>,
208208
)('iconColor for check suite with status %s', (checkSuiteStatus, checkSuiteIconColor) => {
209-
expect(
210-
checkSuiteHandler.iconColor(
211-
createMockSubject({ type: 'CheckSuite', state: checkSuiteStatus }),
212-
),
213-
).toBe(checkSuiteIconColor);
209+
const mockNotification = createPartialMockNotification({
210+
type: 'CheckSuite',
211+
state: checkSuiteStatus,
212+
});
213+
214+
expect(checkSuiteHandler.iconColor(mockNotification)).toBe(
215+
checkSuiteIconColor,
216+
);
214217
});
215218
});
216219

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ class CheckSuiteHandler extends DefaultHandler {
4848
return {};
4949
}
5050

51-
iconType(subject: GitifySubject): FC<OcticonProps> | null {
52-
switch (subject.state as GitifyCheckSuiteStatus) {
51+
iconType(notification: GitifyNotification): FC<OcticonProps> {
52+
switch (notification.subject.state as GitifyCheckSuiteStatus) {
5353
case 'CANCELLED':
5454
return StopIcon;
5555
case 'FAILURE':
@@ -63,14 +63,14 @@ class CheckSuiteHandler extends DefaultHandler {
6363
}
6464
}
6565

66-
iconColor(subject: GitifySubject): IconColor {
67-
switch (subject.state as GitifyCheckSuiteStatus) {
66+
iconColor(notification: GitifyNotification): IconColor {
67+
switch (notification.subject.state as GitifyCheckSuiteStatus) {
6868
case 'SUCCESS':
6969
return IconColor.GREEN;
7070
case 'FAILURE':
7171
return IconColor.RED;
7272
default:
73-
return defaultHandler.iconColor(subject);
73+
return defaultHandler.iconColor(notification);
7474
}
7575
}
7676

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import axios from 'axios';
22
import nock from 'nock';
33

4-
import {
5-
createMockSubject,
6-
createPartialMockNotification,
7-
} from '../../../__mocks__/notifications-mocks';
4+
import { createPartialMockNotification } from '../../../__mocks__/notifications-mocks';
85
import { mockSettings } from '../../../__mocks__/state-mocks';
96
import { createPartialMockUser } from '../../../__mocks__/user-mocks';
107
import type { GitifyNotification, Link } from '../../../types';
@@ -99,9 +96,13 @@ describe('renderer/utils/notifications/handlers/commit.ts', () => {
9996
});
10097

10198
it('iconType', () => {
102-
expect(
103-
commitHandler.iconType(createMockSubject({ type: 'Commit' })).displayName,
104-
).toBe('GitCommitIcon');
99+
const mockNotification = createPartialMockNotification({
100+
type: 'Commit',
101+
});
102+
103+
expect(commitHandler.iconType(mockNotification).displayName).toBe(
104+
'GitCommitIcon',
105+
);
105106
});
106107

107108
it('defaultUrl', () => {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class CommitHandler extends DefaultHandler {
6565
};
6666
}
6767

68-
iconType(_subject: GitifySubject): FC<OcticonProps> | null {
68+
iconType(_notification: GitifyNotification): FC<OcticonProps> {
6969
return GitCommitIcon;
7070
}
7171
}

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
import {
2-
createMockSubject,
3-
createPartialMockNotification,
4-
} from '../../../__mocks__/notifications-mocks';
1+
import { createPartialMockNotification } from '../../../__mocks__/notifications-mocks';
52
import { mockSettings } from '../../../__mocks__/state-mocks';
63
import type { GitifyNotification } from '../../../types';
74
import {
@@ -37,22 +34,27 @@ describe('renderer/utils/notifications/handlers/default.ts', () => {
3734
});
3835

3936
it('iconType', () => {
40-
expect(defaultHandler.iconType(createMockSubject({})).displayName).toBe(
37+
const mockNotification = createPartialMockNotification({});
38+
39+
expect(defaultHandler.iconType(mockNotification).displayName).toBe(
4140
'QuestionIcon',
4241
);
4342
});
4443

4544
describe('iconColor', () => {
46-
it('returns GRAY for any state (fallback behavior)', () => {
45+
it('returns GRAY for any unrecognized state (fallback behavior)', () => {
4746
const states: Array<GitifyNotificationState | null | undefined> = [
4847
'unknown' as GitifyNotificationState,
4948
null,
5049
undefined,
5150
];
5251

5352
states.forEach((state) => {
54-
const subject = createMockSubject({ state });
55-
expect(defaultHandler.iconColor(subject)).toBe(IconColor.GRAY);
53+
const mockNotification = createPartialMockNotification({
54+
state: state,
55+
});
56+
57+
expect(defaultHandler.iconColor(mockNotification)).toBe(IconColor.GRAY);
5658
});
5759
});
5860
});

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ export class DefaultHandler implements NotificationTypeHandler {
2626
return {};
2727
}
2828

29-
iconType(_subject: GitifySubject): FC<OcticonProps> | null {
29+
iconType(_notification: GitifyNotification): FC<OcticonProps> {
3030
return QuestionIcon;
3131
}
3232

33-
iconColor(_subject: GitifySubject): IconColor {
33+
iconColor(_notification: GitifyNotification): IconColor {
3434
return IconColor.GRAY;
3535
}
3636

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

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import axios from 'axios';
22
import nock from 'nock';
33

4-
import {
5-
createMockSubject,
6-
createPartialMockNotification,
7-
} from '../../../__mocks__/notifications-mocks';
4+
import { createPartialMockNotification } from '../../../__mocks__/notifications-mocks';
85
import { mockSettings } from '../../../__mocks__/state-mocks';
96
import { createMockGraphQLAuthor } from '../../../__mocks__/user-mocks';
107
import type { GitifyNotification } from '../../../types';
@@ -308,11 +305,14 @@ describe('renderer/utils/notifications/handlers/discussion.ts', () => {
308305
it.each(
309306
Object.entries(cases) as Array<[GitifyDiscussionState, IconColor]>,
310307
)('iconType for discussion with state %s', (discussionState, discussionIconType) => {
311-
expect(
312-
discussionHandler.iconType(
313-
createMockSubject({ type: 'Discussion', state: discussionState }),
314-
).displayName,
315-
).toBe(discussionIconType);
308+
const mockNotification = createPartialMockNotification({
309+
type: 'Discussion',
310+
state: discussionState,
311+
});
312+
313+
expect(discussionHandler.iconType(mockNotification).displayName).toBe(
314+
discussionIconType,
315+
);
316316
});
317317
});
318318

@@ -329,11 +329,14 @@ describe('renderer/utils/notifications/handlers/discussion.ts', () => {
329329
it.each(
330330
Object.entries(cases) as Array<[GitifyDiscussionState, IconColor]>,
331331
)('iconColor for discussion with state %s', (discussionState, discussionIconColor) => {
332-
expect(
333-
discussionHandler.iconColor(
334-
createMockSubject({ type: 'Discussion', state: discussionState }),
335-
),
336-
).toBe(discussionIconColor);
332+
const mockNotification = createPartialMockNotification({
333+
type: 'Discussion',
334+
state: discussionState,
335+
});
336+
337+
expect(discussionHandler.iconColor(mockNotification)).toBe(
338+
discussionIconColor,
339+
);
337340
});
338341
});
339342

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ class DiscussionHandler extends DefaultHandler {
6969
};
7070
}
7171

72-
iconType(subject: GitifySubject): FC<OcticonProps> | null {
73-
switch (subject.state as GitifyDiscussionState) {
72+
iconType(notification: GitifyNotification): FC<OcticonProps> {
73+
switch (notification.subject.state as GitifyDiscussionState) {
7474
case 'DUPLICATE':
7575
return DiscussionDuplicateIcon;
7676
case 'OUTDATED':
@@ -82,14 +82,14 @@ class DiscussionHandler extends DefaultHandler {
8282
}
8383
}
8484

85-
iconColor(subject: GitifySubject): IconColor {
86-
switch (subject.state) {
85+
iconColor(notification: GitifyNotification): IconColor {
86+
switch (notification.subject.state) {
8787
case 'ANSWERED':
8888
return IconColor.GREEN;
8989
case 'RESOLVED':
9090
return IconColor.PURPLE;
9191
default:
92-
return defaultHandler.iconColor(subject);
92+
return defaultHandler.iconColor(notification);
9393
}
9494
}
9595

0 commit comments

Comments
 (0)