Skip to content

Commit 0fda87a

Browse files
committed
Add task tests
1 parent 09084b6 commit 0fda87a

4 files changed

Lines changed: 155 additions & 2 deletions

File tree

test/reminders/messages/simpleTaskReportMessage.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { itemFactory } from "../../factories/itemFactory";
44

55
// Mock @src/constants and override EMOJIS
66
jest.mock("@src/constants", () => ({
7-
EMOJIS: ["🧪"],
7+
EMOJIS: ["🧪"],
88
}));
99

1010
describe("simpleTaskReportMessage", () => {

test/reminders/messages/urgentPromotionMessage.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ describe("urgentPromotionMessage", () => {
88

99
expect(result.title).toBe("Urgent Promotional Items Reminder 📬‼️");
1010
expect(result.message).toBe(
11-
"Check out all upcoming tasks [here.](https://github.com/orgs/CarletonComputerScienceSociety/projects/18) 🦆"
11+
"Check out all upcoming tasks [here.](https://github.com/orgs/CarletonComputerScienceSociety/projects/18) 🦆",
1212
);
1313
expect(result.sections).toEqual([]);
1414
});
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import { dailyTasksReminder } from "@src/reminders/tasks/dailyTasksReminder";
2+
import { fetchProjectV2Items } from "@infrastructure/github";
3+
import { sendDiscordItemMessage } from "@infrastructure/discord";
4+
import {
5+
completeTaskReportMessage,
6+
simpleTaskReportMessage,
7+
} from "@src/reminders/messages";
8+
import {
9+
filterOutStatus,
10+
filterForUnassigned,
11+
filterUpcomingItems,
12+
filterForUrgentItems,
13+
} from "@src/items";
14+
15+
// Mock all external dependencies
16+
jest.mock("@infrastructure/github");
17+
jest.mock("@infrastructure/discord");
18+
jest.mock("@src/reminders/messages");
19+
jest.mock("@src/items");
20+
21+
const mockItems = [{ id: 1 }, { id: 2 }];
22+
23+
describe("dailyTasksReminder", () => {
24+
beforeEach(() => {
25+
jest.clearAllMocks();
26+
(filterOutStatus as jest.Mock).mockReturnValue(mockItems);
27+
(filterForUnassigned as jest.Mock).mockReturnValue(["unassigned"]);
28+
(filterUpcomingItems as jest.Mock).mockReturnValue(["upcoming"]);
29+
(filterForUrgentItems as jest.Mock).mockReturnValue(["urgent"]);
30+
});
31+
32+
const mockDayOfWeek = (dayIndex: number) => {
33+
jest.spyOn(Date.prototype, "getDay").mockReturnValue(dayIndex);
34+
};
35+
36+
it("will send a complete report on Tuesday", async () => {
37+
mockDayOfWeek(2); // Tuesday
38+
(fetchProjectV2Items as jest.Mock).mockResolvedValue({ val: mockItems });
39+
(completeTaskReportMessage as jest.Mock).mockReturnValue("full message");
40+
(sendDiscordItemMessage as jest.Mock).mockResolvedValue({ ok: true });
41+
42+
const result = await dailyTasksReminder();
43+
44+
expect(fetchProjectV2Items).toHaveBeenCalled();
45+
expect(completeTaskReportMessage).toHaveBeenCalledWith({
46+
urgentItems: ["urgent"],
47+
unassignedItems: ["unassigned"],
48+
upcomingItems: ["upcoming"],
49+
});
50+
expect(sendDiscordItemMessage).toHaveBeenCalledWith("full message");
51+
expect(result).toEqual({ ok: true });
52+
});
53+
54+
it("will send a simple report on Wednesday", async () => {
55+
mockDayOfWeek(3); // Wednesday
56+
(fetchProjectV2Items as jest.Mock).mockResolvedValue({ val: mockItems });
57+
(simpleTaskReportMessage as jest.Mock).mockReturnValue("simple message");
58+
(sendDiscordItemMessage as jest.Mock).mockResolvedValue({ ok: true });
59+
60+
const result = await dailyTasksReminder();
61+
62+
expect(simpleTaskReportMessage).toHaveBeenCalledWith({
63+
urgentItems: ["urgent"],
64+
unassignedItems: ["unassigned"],
65+
});
66+
expect(sendDiscordItemMessage).toHaveBeenCalledWith("simple message");
67+
expect(result).toEqual({ ok: true });
68+
});
69+
70+
it("will return early if fetchProjectV2Items fails", async () => {
71+
const error = { err: "fetch failed" };
72+
(fetchProjectV2Items as jest.Mock).mockResolvedValue(error);
73+
74+
const result = await dailyTasksReminder();
75+
76+
expect(fetchProjectV2Items).toHaveBeenCalled();
77+
expect(sendDiscordItemMessage).not.toHaveBeenCalled();
78+
expect(result).toEqual(error);
79+
});
80+
});
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { promotionReminder } from "@src/reminders/tasks/promotionReminder";
2+
import { fetchProjectV2Items } from "@infrastructure/github";
3+
import { sendDiscordItemMessage } from "@infrastructure/discord";
4+
import { urgentPromotionMessage } from "@src/reminders/messages";
5+
import {
6+
filterByLabel,
7+
filterForTwentyFourHours,
8+
filterOutStatus,
9+
} from "@src/items";
10+
11+
// Mock dependencies
12+
jest.mock("@infrastructure/github");
13+
jest.mock("@infrastructure/discord");
14+
jest.mock("@src/reminders/messages");
15+
jest.mock("@src/items");
16+
17+
const mockItems = [{ id: 1 }, { id: 2 }];
18+
const mockUrgentItems = [{ id: 2 }];
19+
const mockLabeledItems = [{ id: 2, labels: ["social post"] }];
20+
21+
describe("promotionReminder", () => {
22+
beforeEach(() => {
23+
jest.clearAllMocks();
24+
25+
(filterOutStatus as jest.Mock).mockReturnValue(mockItems);
26+
(filterForTwentyFourHours as jest.Mock).mockReturnValue(mockUrgentItems);
27+
(filterByLabel as jest.Mock).mockReturnValue(mockLabeledItems);
28+
});
29+
30+
it("will return early if fetchProjectV2Items fails", async () => {
31+
const error = { err: "Failed to fetch" };
32+
(fetchProjectV2Items as jest.Mock).mockResolvedValue(error);
33+
34+
const result = await promotionReminder();
35+
36+
expect(fetchProjectV2Items).toHaveBeenCalled();
37+
expect(sendDiscordItemMessage).not.toHaveBeenCalled();
38+
expect(result).toEqual(error);
39+
});
40+
41+
it("will return null if there are no matching labeled items", async () => {
42+
(fetchProjectV2Items as jest.Mock).mockResolvedValue({ val: mockItems });
43+
(filterByLabel as jest.Mock).mockReturnValue([]);
44+
45+
const result = await promotionReminder();
46+
47+
expect(fetchProjectV2Items).toHaveBeenCalled();
48+
expect(sendDiscordItemMessage).not.toHaveBeenCalled();
49+
expect(result).toBeNull();
50+
});
51+
52+
it("will send a Discord message if matching items exist", async () => {
53+
(fetchProjectV2Items as jest.Mock).mockResolvedValue({ val: mockItems });
54+
(urgentPromotionMessage as jest.Mock).mockReturnValue("promotion message");
55+
(sendDiscordItemMessage as jest.Mock).mockResolvedValue({ ok: true });
56+
57+
const result = await promotionReminder();
58+
59+
expect(fetchProjectV2Items).toHaveBeenCalled();
60+
expect(filterOutStatus).toHaveBeenCalledWith(mockItems, "Backlog");
61+
expect(filterForTwentyFourHours).toHaveBeenCalledWith(mockItems);
62+
expect(filterByLabel).toHaveBeenCalledWith(mockUrgentItems, [
63+
"discord announcement",
64+
"social post",
65+
"scs email",
66+
]);
67+
expect(urgentPromotionMessage).toHaveBeenCalledWith({
68+
promotionItems: mockLabeledItems,
69+
});
70+
expect(sendDiscordItemMessage).toHaveBeenCalledWith("promotion message");
71+
expect(result).toEqual({ ok: true });
72+
});
73+
});

0 commit comments

Comments
 (0)