fix: route scheduled watcher output by room role

This commit is contained in:
ejclaw
2026-05-26 04:17:59 +09:00
parent d770c40862
commit a6e1b8172c
15 changed files with 288 additions and 156 deletions

View File

@@ -0,0 +1,67 @@
import { beforeEach, describe, expect, it, vi } from 'vitest';
vi.mock('./service-routing.js', () => ({
hasReviewerLease: vi.fn(() => false),
}));
import * as serviceRouting from './service-routing.js';
import { sendScheduledMessage } from './task-scheduler-runtime.js';
describe('scheduled message delivery identity', () => {
beforeEach(() => {
vi.mocked(serviceRouting.hasReviewerLease).mockReturnValue(false);
});
it('uses the default owner identity for owner output in paired rooms', async () => {
vi.mocked(serviceRouting.hasReviewerLease).mockReturnValue(true);
const sendMessage = vi.fn(async () => {});
const sendMessageViaReviewerBot = vi.fn(async () => {});
await sendScheduledMessage(
{ sendMessage, sendMessageViaReviewerBot } as any,
'paired@g.us',
'owner watcher done',
'owner',
);
expect(sendMessage).toHaveBeenCalledWith(
'paired@g.us',
'owner watcher done',
);
expect(sendMessageViaReviewerBot).not.toHaveBeenCalled();
});
it('uses the reviewer identity for claude output in paired rooms', async () => {
vi.mocked(serviceRouting.hasReviewerLease).mockReturnValue(true);
const sendMessage = vi.fn(async () => {});
const sendMessageViaReviewerBot = vi.fn(async () => {});
await sendScheduledMessage(
{ sendMessage, sendMessageViaReviewerBot } as any,
'paired@g.us',
'reviewer watcher done',
'reviewer',
);
expect(sendMessageViaReviewerBot).toHaveBeenCalledWith(
'paired@g.us',
'reviewer watcher done',
);
expect(sendMessage).not.toHaveBeenCalled();
});
it('fails closed for reviewer output when the reviewer bot is missing', async () => {
vi.mocked(serviceRouting.hasReviewerLease).mockReturnValue(true);
const sendMessage = vi.fn(async () => {});
await expect(
sendScheduledMessage(
{ sendMessage } as any,
'paired@g.us',
'reviewer watcher done',
'reviewer',
),
).rejects.toThrow(/reviewer Discord bot/);
expect(sendMessage).not.toHaveBeenCalled();
});
});