forked from spy4x/seed
-
Notifications
You must be signed in to change notification settings - Fork 0
/
notificationCreated.eventHandler.spec.ts
115 lines (106 loc) · 3.55 KB
/
notificationCreated.eventHandler.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { Test } from '@nestjs/testing';
import {
CommandBusExt,
NotificationCreatedEvent,
NotificationSendPushCommand,
PaginationResponseDTO,
QueryBusExt,
UserDevicesFindMyQuery,
UserGetQuery,
} from '@seed/back/api/shared';
import { NotificationCreatedEventHandler } from './notificationCreated.eventHandler';
import { mockNotifications, mockUserDevices } from '@seed/shared/mock-data';
import { User, UserDevice } from '@prisma/client';
describe(NotificationCreatedEventHandler.name, () => {
// region VARIABLES
const commandBusExecuteMock = jest.fn();
const commandBusMock = jest.fn().mockImplementation(() => ({
execute: commandBusExecuteMock,
}));
const queryBusExecuteMock = jest.fn();
const queryBusMock = jest.fn().mockImplementation(() => ({
execute: queryBusExecuteMock,
}));
let handler: NotificationCreatedEventHandler;
const [notification] = mockNotifications;
const event = new NotificationCreatedEvent(notification);
// endregion
// region SETUP
beforeAll(async () => {
const moduleRef = await Test.createTestingModule({
providers: [
NotificationCreatedEventHandler,
{ provide: QueryBusExt, useClass: queryBusMock },
{ provide: CommandBusExt, useClass: commandBusMock },
],
}).compile();
handler = moduleRef.get(NotificationCreatedEventHandler);
});
beforeEach(() => {
commandBusExecuteMock.mockReset();
queryBusExecuteMock.mockReset();
});
function runTest(options: {
testName: string;
user: null | Partial<User>;
userDevices: UserDevice[];
commandCalled: boolean;
}): void {
it(options.testName, async () => {
queryBusExecuteMock.mockImplementation(query => {
if (query instanceof UserGetQuery) {
return options.user;
}
if (query instanceof UserDevicesFindMyQuery) {
return new PaginationResponseDTO<UserDevice>(options.userDevices, 1, 20, options.userDevices.length);
}
throw new Error('Unknown Query');
});
await handler.handle(event);
let queryBusCalledTimes = 1;
expect(queryBusExecuteMock).toBeCalledWith(new UserGetQuery(notification.userId));
if (options.user && options.user.isPushNotificationsEnabled) {
queryBusCalledTimes++;
expect(queryBusExecuteMock).toBeCalledWith(new UserDevicesFindMyQuery(notification.userId));
}
expect(queryBusExecuteMock).toBeCalledTimes(queryBusCalledTimes);
if (options.commandCalled) {
expect(commandBusExecuteMock).toBeCalledWith(
new NotificationSendPushCommand(
notification,
'Welcome to the app 🙂',
'Feel free to contact us with any question or share your feedback!',
mockUserDevices.map(ud => ud.fcmToken),
),
);
} else {
expect(commandBusExecuteMock).not.toBeCalled();
}
});
}
// endregion
runTest({
testName: `should stop if user doesn't exist`,
user: null,
userDevices: [],
commandCalled: false,
});
runTest({
testName: `should stop if user doesn't want to receive push notifications`,
user: { isPushNotificationsEnabled: false },
userDevices: [],
commandCalled: false,
});
runTest({
testName: `should stop if user doesn't have any userDevices`,
user: { isPushNotificationsEnabled: true },
userDevices: [],
commandCalled: false,
});
runTest({
testName: `should execute NotificationSendPushCommand`,
user: { isPushNotificationsEnabled: true },
userDevices: mockUserDevices,
commandCalled: true,
});
});