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([]); }); });