Event-driven cleanup removes stale dashboard messages as soon as Discord emits messageCreate, while preserving the tracked status message.
96 lines
2.4 KiB
TypeScript
96 lines
2.4 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
|
vi.mock('../config.js', () => ({
|
|
STATUS_CHANNEL_ID: 'status-channel',
|
|
}));
|
|
|
|
vi.mock('../logger.js', () => ({
|
|
logger: {
|
|
debug: vi.fn(),
|
|
info: vi.fn(),
|
|
},
|
|
}));
|
|
|
|
const readDashboardStatusMessageIdMock = vi.hoisted(() =>
|
|
vi.fn(() => 'dashboard-current'),
|
|
);
|
|
|
|
vi.mock('../status-dashboard.js', () => ({
|
|
readDashboardStatusMessageId: readDashboardStatusMessageIdMock,
|
|
}));
|
|
|
|
import {
|
|
deleteOwnDashboardDuplicateOnCreate,
|
|
isDashboardTrackedSend,
|
|
} from './discord-dashboard-create-cleanup.js';
|
|
|
|
function makeDashboardMessage(overrides: {
|
|
id?: string;
|
|
channelId?: string;
|
|
content?: string;
|
|
}) {
|
|
return {
|
|
id: overrides.id ?? 'dashboard-stale',
|
|
channelId: overrides.channelId ?? 'status-channel',
|
|
content: overrides.content ?? '🤖 *모델 구성*\nMemory 3.3/91.4GB',
|
|
delete: vi.fn().mockResolvedValue(undefined),
|
|
} as any;
|
|
}
|
|
|
|
describe('discord dashboard create cleanup', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
readDashboardStatusMessageIdMock.mockReturnValue('dashboard-current');
|
|
});
|
|
|
|
it('detects tracked dashboard sends', () => {
|
|
expect(
|
|
isDashboardTrackedSend(
|
|
'dc:status-channel',
|
|
'🤖 *모델 구성*\nMemory 7.5/251.7GB',
|
|
),
|
|
).toBe(true);
|
|
expect(isDashboardTrackedSend('dc:other', '🤖 *모델 구성*')).toBe(false);
|
|
expect(isDashboardTrackedSend('dc:status-channel', 'normal')).toBe(false);
|
|
});
|
|
|
|
it('deletes stale own dashboard messages on create event', async () => {
|
|
const msg = makeDashboardMessage({ id: 'dashboard-stale' });
|
|
|
|
await deleteOwnDashboardDuplicateOnCreate({
|
|
message: msg,
|
|
channelName: 'discord',
|
|
graceUntil: 0,
|
|
now: 100,
|
|
});
|
|
|
|
expect(msg.delete).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
it('keeps the tracked dashboard message', async () => {
|
|
const msg = makeDashboardMessage({ id: 'dashboard-current' });
|
|
|
|
await deleteOwnDashboardDuplicateOnCreate({
|
|
message: msg,
|
|
channelName: 'discord',
|
|
graceUntil: 0,
|
|
now: 100,
|
|
});
|
|
|
|
expect(msg.delete).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('keeps dashboard messages during tracked send grace period', async () => {
|
|
const msg = makeDashboardMessage({ id: 'dashboard-new' });
|
|
|
|
await deleteOwnDashboardDuplicateOnCreate({
|
|
message: msg,
|
|
channelName: 'discord',
|
|
graceUntil: 200,
|
|
now: 100,
|
|
});
|
|
|
|
expect(msg.delete).not.toHaveBeenCalled();
|
|
});
|
|
});
|