Clean duplicate dashboard status messages
Clean duplicate Status dashboard messages by marker, preserve the tracked message, and avoid full-channel purge on startup.
This commit is contained in:
88
src/dashboard-message-cleanup.test.ts
Normal file
88
src/dashboard-message-cleanup.test.ts
Normal file
@@ -0,0 +1,88 @@
|
||||
import { describe, expect, it, vi } from 'vitest';
|
||||
|
||||
import {
|
||||
cleanupDashboardDuplicateMessages,
|
||||
purgeDashboardMessages,
|
||||
} from './dashboard-message-cleanup.js';
|
||||
|
||||
function makeChannel(deleteRecentMessagesByContent: any) {
|
||||
return {
|
||||
name: 'discord',
|
||||
connect: vi.fn(),
|
||||
sendMessage: vi.fn(),
|
||||
isConnected: () => true,
|
||||
ownsJid: () => true,
|
||||
disconnect: vi.fn(),
|
||||
deleteRecentMessagesByContent,
|
||||
};
|
||||
}
|
||||
|
||||
describe('cleanupDashboardDuplicateMessages', () => {
|
||||
it('deletes recent dashboard messages except the tracked status message', async () => {
|
||||
const deleteRecentMessagesByContent = vi.fn(async () => 3);
|
||||
const deleted = await cleanupDashboardDuplicateMessages(
|
||||
{
|
||||
statusChannelId: 'status-channel',
|
||||
channels: [makeChannel(deleteRecentMessagesByContent)],
|
||||
},
|
||||
'tracked-message',
|
||||
);
|
||||
|
||||
expect(deleted).toBe(3);
|
||||
expect(deleteRecentMessagesByContent).toHaveBeenCalledWith(
|
||||
'dc:status-channel',
|
||||
{
|
||||
contentIncludes: '🤖 *모델 구성*',
|
||||
exceptMessageId: 'tracked-message',
|
||||
limit: 100,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('skips cleanup when there is no tracked status message yet', async () => {
|
||||
const deleteRecentMessagesByContent = vi.fn(async () => 3);
|
||||
const deleted = await cleanupDashboardDuplicateMessages(
|
||||
{
|
||||
statusChannelId: 'status-channel',
|
||||
channels: [makeChannel(deleteRecentMessagesByContent)],
|
||||
},
|
||||
null,
|
||||
);
|
||||
|
||||
expect(deleted).toBe(0);
|
||||
expect(deleteRecentMessagesByContent).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe('purgeDashboardMessages', () => {
|
||||
it('deletes dashboard marker messages without purging the whole channel', async () => {
|
||||
const deleteRecentMessagesByContent = vi.fn(async () => 2);
|
||||
const deleted = await purgeDashboardMessages({
|
||||
statusChannelId: 'status-channel',
|
||||
channels: [makeChannel(deleteRecentMessagesByContent)],
|
||||
});
|
||||
|
||||
expect(deleted).toBe(2);
|
||||
expect(deleteRecentMessagesByContent).toHaveBeenCalledWith(
|
||||
'dc:status-channel',
|
||||
{
|
||||
contentIncludes: '🤖 *모델 구성*',
|
||||
limit: 100,
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
it('continues deleting dashboard batches until the last batch is partial', async () => {
|
||||
const deleteRecentMessagesByContent = vi
|
||||
.fn()
|
||||
.mockResolvedValueOnce(100)
|
||||
.mockResolvedValueOnce(7);
|
||||
const deleted = await purgeDashboardMessages({
|
||||
statusChannelId: 'status-channel',
|
||||
channels: [makeChannel(deleteRecentMessagesByContent)],
|
||||
});
|
||||
|
||||
expect(deleted).toBe(107);
|
||||
expect(deleteRecentMessagesByContent).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user