agent-ecosystem/test/features/member-work-sync/main/CompositeMemberWorkSyncBusySignal.test.ts
2026-06-02 08:56:20 +03:00

68 lines
2.1 KiB
TypeScript

import { CompositeMemberWorkSyncBusySignal } from '@features/member-work-sync/main/infrastructure/CompositeMemberWorkSyncBusySignal';
import { describe, expect, it, vi } from 'vitest';
describe('CompositeMemberWorkSyncBusySignal', () => {
it('does not block nudges forever when one busy signal fails', async () => {
const logger = { debug: vi.fn(), error: vi.fn(), warn: vi.fn() };
const signal = new CompositeMemberWorkSyncBusySignal(
[
{
isBusy: vi.fn(async () => {
throw new Error('delivery status unavailable');
}),
},
{
isBusy: vi.fn(async () => ({ busy: false })),
},
],
logger
);
await expect(
signal.isBusy({
teamName: 'team-a',
memberName: 'bob',
nowIso: '2026-04-29T00:00:00.000Z',
workSyncIntent: 'agenda_sync',
taskRefs: [{ teamName: 'team-a', taskId: 'task-1', displayId: '11111111' }],
})
).resolves.toEqual({ busy: false });
expect(logger.warn).toHaveBeenCalledWith(
'member work sync busy signal failed',
expect.objectContaining({
teamName: 'team-a',
memberName: 'bob',
error: 'Error: delivery status unavailable',
})
);
});
it('still stops at the first positive busy signal', async () => {
const secondSignal = vi.fn(async () => ({ busy: false }));
const signal = new CompositeMemberWorkSyncBusySignal([
{
isBusy: vi.fn(async () => ({
busy: true,
reason: 'active_tool_activity',
retryAfterIso: '2026-04-29T00:01:00.000Z',
})),
},
{ isBusy: secondSignal },
]);
await expect(
signal.isBusy({
teamName: 'team-a',
memberName: 'bob',
nowIso: '2026-04-29T00:00:00.000Z',
workSyncIntent: 'agenda_sync',
taskRefs: [{ teamName: 'team-a', taskId: 'task-1', displayId: '11111111' }],
})
).resolves.toEqual({
busy: true,
reason: 'active_tool_activity',
retryAfterIso: '2026-04-29T00:01:00.000Z',
});
expect(secondSignal).not.toHaveBeenCalled();
});
});