@oneuptime/common 12.0.29 → 12.0.30
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/Models/DatabaseModels/Index.ts +11 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/EnvironmentConfig.ts +138 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Services/Index.ts +12 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +369 -0
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/build/dist/Models/DatabaseModels/Index.js +11 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +102 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Services/Index.js +12 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import UserNotificationSettingService from "../../../Server/Services/UserNotificationSettingService";
|
|
2
|
+
import UserNotificationSetting from "../../../Models/DatabaseModels/UserNotificationSetting";
|
|
3
|
+
import NotificationSettingEventType from "../../../Types/NotificationSetting/NotificationSettingEventType";
|
|
4
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
5
|
+
import PositiveNumber from "../../../Types/PositiveNumber";
|
|
6
|
+
import {
|
|
7
|
+
afterEach,
|
|
8
|
+
beforeEach,
|
|
9
|
+
describe,
|
|
10
|
+
expect,
|
|
11
|
+
jest,
|
|
12
|
+
test,
|
|
13
|
+
} from "@jest/globals";
|
|
14
|
+
|
|
15
|
+
/*
|
|
16
|
+
* The two shift-reminder notification settings — "before my on-call shift
|
|
17
|
+
* starts" and "my upcoming on-call shift is reassigned" — must exist as
|
|
18
|
+
* UserNotificationSetting rows, because sendUserNotification sends NOTHING
|
|
19
|
+
* for a (user, project, event) without a row. Pinned here:
|
|
20
|
+
*
|
|
21
|
+
* 1. addShiftReminderNotificationSettings writes exactly those two rows,
|
|
22
|
+
* with email AND push on (a reminder that only lands in a mailbox is
|
|
23
|
+
* easy to miss at 05:45), as root;
|
|
24
|
+
* 2. it is idempotent: an existing row is left alone, a missing one is
|
|
25
|
+
* created, and calling it again creates nothing;
|
|
26
|
+
* 3. addOnCallNotificationSettings — the project-join path — reaches them,
|
|
27
|
+
* so new members get them without the data migration;
|
|
28
|
+
* 4. the older on-call events keep their email-only default (push is not
|
|
29
|
+
* flipped on for anybody else by this change).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
33
|
+
"11111111-1111-4111-8111-111111111111",
|
|
34
|
+
);
|
|
35
|
+
const USER_ID: ObjectID = new ObjectID("22222222-2222-4222-8222-222222222222");
|
|
36
|
+
|
|
37
|
+
const REMINDER_EVENTS: Array<NotificationSettingEventType> = [
|
|
38
|
+
NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS,
|
|
39
|
+
NotificationSettingEventType.SEND_WHEN_USER_ON_CALL_SHIFT_IS_REASSIGNED,
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
const OLDER_ON_CALL_EVENTS: Array<NotificationSettingEventType> = [
|
|
43
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_ON_CALL_ROSTER,
|
|
44
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_NEXT_ON_CALL_ROSTER,
|
|
45
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_ADDED_TO_ON_CALL_POLICY,
|
|
46
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_REMOVED_FROM_ON_CALL_POLICY,
|
|
47
|
+
NotificationSettingEventType.SEND_WHEN_USER_IS_NO_LONGER_ACTIVE_ON_ON_CALL_ROSTER,
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
interface StoredSetting {
|
|
51
|
+
userId: string;
|
|
52
|
+
projectId: string;
|
|
53
|
+
eventType: NotificationSettingEventType;
|
|
54
|
+
alertByEmail: boolean;
|
|
55
|
+
alertByPush: boolean;
|
|
56
|
+
isRoot: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function key(data: {
|
|
60
|
+
userId: unknown;
|
|
61
|
+
projectId: unknown;
|
|
62
|
+
eventType: unknown;
|
|
63
|
+
}): string {
|
|
64
|
+
return `${String(data.userId)}|${String(data.projectId)}|${String(
|
|
65
|
+
data.eventType,
|
|
66
|
+
)}`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
describe("UserNotificationSettingService shift-reminder defaults", () => {
|
|
70
|
+
let store: Map<string, StoredSetting>;
|
|
71
|
+
let createCalls: number;
|
|
72
|
+
|
|
73
|
+
beforeEach(() => {
|
|
74
|
+
store = new Map<string, StoredSetting>();
|
|
75
|
+
createCalls = 0;
|
|
76
|
+
|
|
77
|
+
jest
|
|
78
|
+
.spyOn(UserNotificationSettingService, "countBy")
|
|
79
|
+
.mockImplementation(((args: {
|
|
80
|
+
query: { userId: ObjectID; projectId: ObjectID; eventType: string };
|
|
81
|
+
}): Promise<PositiveNumber> => {
|
|
82
|
+
return Promise.resolve(
|
|
83
|
+
new PositiveNumber(store.has(key(args.query)) ? 1 : 0),
|
|
84
|
+
);
|
|
85
|
+
}) as never);
|
|
86
|
+
|
|
87
|
+
jest
|
|
88
|
+
.spyOn(UserNotificationSettingService, "create")
|
|
89
|
+
.mockImplementation(((args: {
|
|
90
|
+
data: UserNotificationSetting;
|
|
91
|
+
props: { isRoot?: boolean };
|
|
92
|
+
}): Promise<UserNotificationSetting> => {
|
|
93
|
+
createCalls++;
|
|
94
|
+
|
|
95
|
+
const item: UserNotificationSetting = args.data;
|
|
96
|
+
const stored: StoredSetting = {
|
|
97
|
+
userId: String(item.userId),
|
|
98
|
+
projectId: String(item.projectId),
|
|
99
|
+
eventType: item.eventType as NotificationSettingEventType,
|
|
100
|
+
alertByEmail: Boolean(item.alertByEmail),
|
|
101
|
+
alertByPush: Boolean(item.alertByPush),
|
|
102
|
+
isRoot: Boolean(args.props.isRoot),
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
store.set(key(stored), stored);
|
|
106
|
+
|
|
107
|
+
return Promise.resolve(item);
|
|
108
|
+
}) as never);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
afterEach(() => {
|
|
112
|
+
jest.restoreAllMocks();
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
function stored(eventType: NotificationSettingEventType): StoredSetting {
|
|
116
|
+
const setting: StoredSetting | undefined = store.get(
|
|
117
|
+
key({ userId: USER_ID, projectId: PROJECT_ID, eventType }),
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
if (!setting) {
|
|
121
|
+
throw new Error(`no settings row for ${eventType}`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return setting;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
test("creates both reminder events with email and push on, as root", async () => {
|
|
128
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
129
|
+
USER_ID,
|
|
130
|
+
PROJECT_ID,
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
expect(createCalls).toBe(2);
|
|
134
|
+
expect(
|
|
135
|
+
Array.from(store.values())
|
|
136
|
+
.map((s: StoredSetting) => {
|
|
137
|
+
return s.eventType;
|
|
138
|
+
})
|
|
139
|
+
.sort(),
|
|
140
|
+
).toEqual([...REMINDER_EVENTS].sort());
|
|
141
|
+
|
|
142
|
+
for (const eventType of REMINDER_EVENTS) {
|
|
143
|
+
const setting: StoredSetting = stored(eventType);
|
|
144
|
+
|
|
145
|
+
expect(setting.alertByEmail).toBe(true);
|
|
146
|
+
expect(setting.alertByPush).toBe(true);
|
|
147
|
+
expect(setting.isRoot).toBe(true);
|
|
148
|
+
expect(setting.userId).toBe(USER_ID.toString());
|
|
149
|
+
expect(setting.projectId).toBe(PROJECT_ID.toString());
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("is idempotent: a second call creates nothing", async () => {
|
|
154
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
155
|
+
USER_ID,
|
|
156
|
+
PROJECT_ID,
|
|
157
|
+
);
|
|
158
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
159
|
+
USER_ID,
|
|
160
|
+
PROJECT_ID,
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
expect(createCalls).toBe(2);
|
|
164
|
+
expect(store.size).toBe(2);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("fills in only the missing row when one of the two already exists", async () => {
|
|
168
|
+
store.set(
|
|
169
|
+
key({
|
|
170
|
+
userId: USER_ID,
|
|
171
|
+
projectId: PROJECT_ID,
|
|
172
|
+
eventType:
|
|
173
|
+
NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS,
|
|
174
|
+
}),
|
|
175
|
+
{
|
|
176
|
+
userId: USER_ID.toString(),
|
|
177
|
+
projectId: PROJECT_ID.toString(),
|
|
178
|
+
eventType:
|
|
179
|
+
NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS,
|
|
180
|
+
// The user switched push off; the backfill must not touch that.
|
|
181
|
+
alertByEmail: true,
|
|
182
|
+
alertByPush: false,
|
|
183
|
+
isRoot: true,
|
|
184
|
+
},
|
|
185
|
+
);
|
|
186
|
+
|
|
187
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
188
|
+
USER_ID,
|
|
189
|
+
PROJECT_ID,
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
expect(createCalls).toBe(1);
|
|
193
|
+
expect(
|
|
194
|
+
stored(NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS)
|
|
195
|
+
.alertByPush,
|
|
196
|
+
).toBe(false);
|
|
197
|
+
expect(
|
|
198
|
+
stored(
|
|
199
|
+
NotificationSettingEventType.SEND_WHEN_USER_ON_CALL_SHIFT_IS_REASSIGNED,
|
|
200
|
+
).alertByPush,
|
|
201
|
+
).toBe(true);
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("is scoped to the (user, project) it is called for", async () => {
|
|
205
|
+
const otherProject: ObjectID = new ObjectID(
|
|
206
|
+
"33333333-3333-4333-8333-333333333333",
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
210
|
+
USER_ID,
|
|
211
|
+
PROJECT_ID,
|
|
212
|
+
);
|
|
213
|
+
await UserNotificationSettingService.addShiftReminderNotificationSettings(
|
|
214
|
+
USER_ID,
|
|
215
|
+
otherProject,
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
expect(store.size).toBe(4);
|
|
219
|
+
expect(
|
|
220
|
+
Array.from(store.values()).filter((s: StoredSetting) => {
|
|
221
|
+
return s.projectId === otherProject.toString();
|
|
222
|
+
}),
|
|
223
|
+
).toHaveLength(2);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("addOnCallNotificationSettings (the project-join path) includes both reminder events", async () => {
|
|
227
|
+
await UserNotificationSettingService.addOnCallNotificationSettings(
|
|
228
|
+
USER_ID,
|
|
229
|
+
PROJECT_ID,
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
for (const eventType of REMINDER_EVENTS) {
|
|
233
|
+
expect(stored(eventType).alertByEmail).toBe(true);
|
|
234
|
+
expect(stored(eventType).alertByPush).toBe(true);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// The five pre-existing on-call events are still written, email-only.
|
|
238
|
+
for (const eventType of OLDER_ON_CALL_EVENTS) {
|
|
239
|
+
expect(stored(eventType).alertByEmail).toBe(true);
|
|
240
|
+
expect(stored(eventType).alertByPush).toBe(false);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
expect(createCalls).toBe(
|
|
244
|
+
OLDER_ON_CALL_EVENTS.length + REMINDER_EVENTS.length,
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
test("addDefaultNotificationSettingsForUser (what TeamMember creation calls) reaches them too", async () => {
|
|
249
|
+
await UserNotificationSettingService.addDefaultNotificationSettingsForUser(
|
|
250
|
+
USER_ID,
|
|
251
|
+
PROJECT_ID,
|
|
252
|
+
);
|
|
253
|
+
|
|
254
|
+
for (const eventType of REMINDER_EVENTS) {
|
|
255
|
+
expect(stored(eventType).alertByPush).toBe(true);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("the two event type strings are the ones the runner sends on", () => {
|
|
260
|
+
expect(
|
|
261
|
+
NotificationSettingEventType.SEND_BEFORE_USER_ON_CALL_SHIFT_STARTS,
|
|
262
|
+
).toBe("Before user's on-call shift starts");
|
|
263
|
+
expect(
|
|
264
|
+
NotificationSettingEventType.SEND_WHEN_USER_ON_CALL_SHIFT_IS_REASSIGNED,
|
|
265
|
+
).toBe("User's upcoming on-call shift is reassigned");
|
|
266
|
+
});
|
|
267
|
+
});
|