Implement Nag service
This commit is contained in:
97
commands/calendar/nag/service.test.ts
Normal file
97
commands/calendar/nag/service.test.ts
Normal file
@@ -0,0 +1,97 @@
|
||||
import { expect, test, vi, it, describe, beforeEach, afterEach } from "vitest";
|
||||
import {
|
||||
nextCheckInDate,
|
||||
initAndSyncTables,
|
||||
Nag,
|
||||
CheckIn,
|
||||
findGuiltyNags,
|
||||
getCheckIn,
|
||||
} from "./service";
|
||||
import { Sequelize, literal, Op } from "sequelize";
|
||||
|
||||
describe("nextCheckInDate", () => {
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers(); // Tell vitest to use fake timers
|
||||
});
|
||||
afterEach(() => {
|
||||
vi.useRealTimers(); // Reset date after test runs
|
||||
});
|
||||
it("Returns 9AM if called before 9AM that day", () => {
|
||||
const now = new Date(Date.now());
|
||||
let at9AM = new Date(
|
||||
now.getFullYear(),
|
||||
now.getMonth(),
|
||||
now.getDate(),
|
||||
9,
|
||||
0,
|
||||
);
|
||||
vi.setSystemTime(
|
||||
new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 0),
|
||||
);
|
||||
expect(nextCheckInDate()).toEqual(at9AM);
|
||||
});
|
||||
it("Returns 9AM tomorrow if called after 9AM", () => {
|
||||
const dayInMS = 24 * 60 * 60 * 1000;
|
||||
const now = new Date(Date.now());
|
||||
const tomorrow = new Date(Date.now() + dayInMS);
|
||||
let tomorrow9AM = new Date(
|
||||
tomorrow.getFullYear(),
|
||||
tomorrow.getMonth(),
|
||||
tomorrow.getDate(),
|
||||
9,
|
||||
0,
|
||||
);
|
||||
vi.setSystemTime(
|
||||
new Date(now.getFullYear(), now.getMonth(), now.getDate(), 9, 30),
|
||||
);
|
||||
expect(nextCheckInDate()).toEqual(tomorrow9AM);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Finding nags without check-ins", async () => {
|
||||
const sequelize = new Sequelize("sqlite://:memory:");
|
||||
const exampleNag = {
|
||||
userId: "1234",
|
||||
guildId: "1234",
|
||||
channelId: "1234",
|
||||
messageId: "1234",
|
||||
text: "Example nag 1",
|
||||
mentionHere: false,
|
||||
};
|
||||
|
||||
await initAndSyncTables(sequelize);
|
||||
|
||||
beforeEach(async () => {
|
||||
vi.useFakeTimers();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
await Nag.destroy({ where: {} });
|
||||
await CheckIn.destroy({ where: {} });
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("Finds nags without any check-ins", async () => {
|
||||
const now = new Date();
|
||||
vi.setSystemTime(
|
||||
new Date(now.getFullYear(), now.getMonth(), now.getDate(), 9),
|
||||
);
|
||||
await Nag.create(exampleNag);
|
||||
const results = await findGuiltyNags();
|
||||
expect(results.map((nag) => nag.userId)).toEqual(["1234"]);
|
||||
});
|
||||
|
||||
it("Ignores nags with a recent check-in", async () => {
|
||||
const newNag = await Nag.create(exampleNag);
|
||||
newNag.save();
|
||||
const currentCheckInTime = getCheckIn(9, 0);
|
||||
const newCheckIn = await CheckIn.create({
|
||||
nagId: newNag.id,
|
||||
// 1 hour previously; i.e. we checked in before the required time
|
||||
lastCheckIn: new Date(currentCheckInTime.getTime() - 60 * 60 * 1000),
|
||||
});
|
||||
newCheckIn.save();
|
||||
const results = await findGuiltyNags();
|
||||
expect(results.map((nag) => nag.userId)).toEqual([]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user