Skip to content

Commit ab6b9ce

Browse files
authored
Merge pull request #415 from wavect/jc/cron-job-tests
fix: tests: cron job tests
2 parents a778c78 + 9cebdd0 commit ab6b9ce

File tree

3 files changed

+356
-75
lines changed

3 files changed

+356
-75
lines changed

backend/src/cronjobs/cronjobs.types.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export type ReceivableUser = Pick<
2525
| "id"
2626
| "ghostModeRemindersEmail"
2727
| "restrictedViewToken"
28+
| "lastDateModeReminderSent"
2829
>;
2930

3031
export enum TimeSpan {
@@ -40,10 +41,25 @@ export interface OfflineUserSince {
4041

4142
export const goBackInTimeFor = (
4243
value: number,
43-
unit: "hours" | "days",
44+
unit: "hours" | "days" | "months" | "years",
4445
): Date => {
45-
const hours = unit === "days" ? value * 24 : value;
46-
return new Date(new Date().getTime() - hours * 60 * 60 * 1000);
46+
const now = new Date();
47+
switch (unit) {
48+
case "hours":
49+
return new Date(now.getTime() - value * 60 * 60 * 1000);
50+
case "days":
51+
return new Date(now.getTime() - value * 24 * 60 * 60 * 1000);
52+
case "months": {
53+
const date = new Date(now);
54+
date.setMonth(date.getMonth() - value);
55+
return date;
56+
}
57+
case "years": {
58+
const date = new Date(now);
59+
date.setFullYear(date.getFullYear() - value);
60+
return date;
61+
}
62+
}
4763
};
4864

4965
/** @dev String value used for translation keys */

backend/src/cronjobs/ghostmode-reminder.cron.ts

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
goBackInTimeFor,
77
IntervalHour,
88
OfflineUserSince,
9+
ReceivableUser,
910
TimeSpan,
1011
} from "@/cronjobs/cronjobs.types";
1112
import { ENotificationType } from "@/DTOs/abstract/base-notification.adto";
@@ -57,24 +58,27 @@ export class GhostModeReminderCronJob extends BaseCronJob {
5758
"user.lastDateModeChange",
5859
"user.ghostModeRemindersEmail",
5960
"user.restrictedViewToken",
61+
"user.lastDateModeReminderSent",
6062
])
6163
.where("user.dateMode = :mode", { mode: EDateMode.GHOST })
6264
.andWhere("user.lastDateModeChange < :dayAgo", {
6365
dayAgo: goBackInTimeFor(24, "hours"),
6466
})
6567
.andWhere(
66-
"(user.lastDateModeReminderSent IS NULL OR " +
68+
"(user.lastDateModeReminderSent IS NULL) OR " + // Reminded if > 24 hrs off and never reminded
69+
"(user.lastDateModeReminderSent < user.lastDateModeChange) OR " + // Remind if went online in-between
6770
"CASE " +
68-
"WHEN user.lastDateModeChange < :twoWeeksAgo THEN user.lastDateModeReminderSent < :twoWeeksMinTime " +
69-
"WHEN user.lastDateModeChange < :threeDaysAgo THEN user.lastDateModeReminderSent < :threeDaysMinTime " +
70-
"ELSE user.lastDateModeReminderSent < :oneDayMinTime " +
71-
"END)",
71+
"WHEN user.lastDateModeChange < :twoWeeksAgo AND user.lastDateModeReminderSent >= :twoWeeksMinTime THEN 0 " +
72+
"WHEN user.lastDateModeChange < :threeDaysAgo AND user.lastDateModeReminderSent < :threeDaysMinTime AND user.lastDateModeReminderSent > :twoWeeksAgo THEN 1 " +
73+
"WHEN user.lastDateModeChange < :oneDayAgo AND user.lastDateModeReminderSent IS NULL THEN 1 " +
74+
"ELSE 0 " +
75+
"END = 1",
7276
{
7377
twoWeeksAgo: goBackInTimeFor(336, "hours"),
7478
threeDaysAgo: goBackInTimeFor(72, "hours"),
79+
oneDayAgo: goBackInTimeFor(24, "hours"),
7580
twoWeeksMinTime: goBackInTimeFor(336 - 72, "hours"),
7681
threeDaysMinTime: goBackInTimeFor(72 - 24, "hours"),
77-
oneDayMinTime: goBackInTimeFor(24, "hours"),
7882
},
7983
);
8084

@@ -92,15 +96,22 @@ export class GhostModeReminderCronJob extends BaseCronJob {
9296

9397
return users.map((user) => ({
9498
user,
95-
type: this.determineOfflineType(user.lastDateModeChange),
99+
type: this.determineOfflineType(user, user.lastDateModeChange),
96100
}));
97101
}
98102

99-
private determineOfflineType(lastDateModeChange: Date): TimeSpan {
103+
private determineOfflineType(
104+
user: ReceivableUser,
105+
lastDateModeChange: Date,
106+
): TimeSpan {
100107
const hoursGhostMode = differenceInHours(
101108
new Date(),
102109
lastDateModeChange,
103110
);
111+
/** @DEV Edge case: if a user has never been reminded he is always in the 24 hrs bucket */
112+
if (!user.lastDateModeReminderSent) {
113+
return TimeSpan.ONE_DAY;
114+
}
104115
if (hoursGhostMode >= 336) return TimeSpan.TWO_WEEKS;
105116
if (hoursGhostMode >= 72) return TimeSpan.THREE_DAYS;
106117
return TimeSpan.ONE_DAY;

0 commit comments

Comments
 (0)