Implement /unnag

This commit is contained in:
2025-07-05 18:10:24 -04:00
parent 88679d2eda
commit 8c2e889f2a
6 changed files with 505 additions and 472 deletions

View File

@@ -1,97 +1,97 @@
import { expect, test, vi, it, describe, beforeEach, afterEach } from "vitest";
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";
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('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,
};
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);
await initAndSyncTables(sequelize);
beforeEach(async () => {
vi.useFakeTimers();
});
beforeEach(async () => {
vi.useFakeTimers();
});
afterEach(async () => {
await Nag.destroy({ where: {} });
await CheckIn.destroy({ where: {} });
vi.useRealTimers();
});
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('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([]);
});
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([]);
});
});