Files
EJClaw/src/service-routing.test.ts

78 lines
2.1 KiB
TypeScript

import { beforeEach, describe, expect, it } from 'vitest';
import { _initTestDatabase, setRegisteredGroup } from './db.js';
import {
activateCodexFailover,
getActiveCodexFailoverLeases,
getEffectiveChannelLease,
refreshChannelOwnerCache,
restoreDefaultChannelLease,
} from './service-routing.js';
beforeEach(() => {
_initTestDatabase();
refreshChannelOwnerCache(true);
});
describe('service-routing failover leases', () => {
it('uses codex-review as owner and codex-main as reviewer during failover', () => {
setRegisteredGroup('dc:paired', {
name: 'Paired Room Claude',
folder: 'paired-claude',
trigger: '@Andy',
added_at: '2024-01-01T00:00:00.000Z',
agentType: 'claude-code',
});
setRegisteredGroup('dc:paired', {
name: 'Paired Room Codex',
folder: 'paired-codex',
trigger: '@Codex',
added_at: '2024-01-01T00:00:00.000Z',
agentType: 'codex',
});
activateCodexFailover('dc:paired', 'claude-429');
expect(getEffectiveChannelLease('dc:paired')).toMatchObject({
chat_jid: 'dc:paired',
owner_service_id: 'codex-review',
reviewer_service_id: 'codex-main',
reason: 'claude-429',
explicit: true,
});
expect(getActiveCodexFailoverLeases()).toEqual([
{
chatJid: 'dc:paired',
activatedAt: expect.any(String),
},
]);
});
it('restores the default lease after failover is cleared', () => {
setRegisteredGroup('dc:paired', {
name: 'Paired Room Claude',
folder: 'paired-claude',
trigger: '@Andy',
added_at: '2024-01-01T00:00:00.000Z',
agentType: 'claude-code',
});
setRegisteredGroup('dc:paired', {
name: 'Paired Room Codex',
folder: 'paired-codex',
trigger: '@Codex',
added_at: '2024-01-01T00:00:00.000Z',
agentType: 'codex',
});
activateCodexFailover('dc:paired', 'claude-429');
restoreDefaultChannelLease('dc:paired');
expect(getEffectiveChannelLease('dc:paired')).toMatchObject({
chat_jid: 'dc:paired',
owner_service_id: 'codex-main',
reviewer_service_id: 'claude',
explicit: false,
});
});
});