fix: align realtime event contracts

This commit is contained in:
jjbrunton committed 2026-08-08 14:54:09 +01:00
1 parent 51e3e28a9b
commit 9f4f198800
2 files changed
+151 -18

No files matched your search

+24 -9
View File
@@ -181,17 +181,32 @@ describe('dashboard endpoint contracts', () => {
it('validates the common error response and typed realtime event envelope', () => {
expect(ErrorResponseSchema.safeParse({ error: 'Conversation not found' }).success).toBe(true);
const occurredAt = '2026-08-08T13:55:00.000Z';
const events = [
{ id: '1', occurredAt, type: 'bot.status.changed', payload: { status: 'running', dryRun: false, reason: 'startup complete' } },
{ id: '2', occurredAt, type: 'message.sent', payload: { messageId: 'm1', recipient: 'alice', conversationId: 'c1' } },
{ id: '3', occurredAt, type: 'message.failed', payload: { recipient: 'alice', reason: 'rate limited', messageId: 'm2', conversationId: 'c1', code: 'limited', retryable: true } },
{ id: '4', occurredAt, type: 'conversation.updated', payload: { conversationId: 'c1', status: 'replied', unreadCount: 1 } },
{ id: '5', occurredAt, type: 'reply.received', payload: { conversationId: 'c1', replyId: 'r1', sender: 'alice', preview: 'Hi' } },
{ id: '6', occurredAt, type: 'sync.started', payload: { syncId: 's1', kind: 'media' } },
{ id: '7', occurredAt, type: 'sync.progress', payload: { syncId: 's1', kind: 'media', completed: 3, total: 10, message: 'Downloading' } },
{ id: '8', occurredAt, type: 'sync.completed', payload: { syncId: 's1', kind: 'media', processed: 10 } },
{ id: '9', occurredAt, type: 'sync.failed', payload: { syncId: 's1', kind: 'media', reason: 'network', code: 'offline' } },
{ id: '10', occurredAt, type: 'rate-limit.changed', payload: { limited: true, remaining: 0, resetsAt: occurredAt, reason: 'hourly' } },
{ id: '11', occurredAt, type: 'reddit.session.changed', payload: { status: 'authenticated', username: 'bot-user', reason: 'login completed' } },
{ id: '12', occurredAt, type: 'log.created', payload: { level: 'info', message: 'Started', data: { port: 3000 } } },
];
for (const event of events) {
expect(DashboardEventSchema.safeParse(event).success, event.type).toBe(true);
}
expect(DashboardEventSchema.safeParse({
id: 'event-1',
type: 'sync.progress',
occurredAt: 1_700_000_000_000,
payload: {
kind: 'delta', phase: 'done', current: 1, total: 1,
startedAt: 1_699_999_999_000,
},
}).success).toBe(true);
id: 'event-13', type: 'log.created', occurredAt: 1_700_000_000_000,
payload: { level: 'info', message: 'Started' },
}).success).toBe(false);
expect(DashboardEventSchema.safeParse({
id: 'event-2', type: 'sync.progress', occurredAt: 'now', payload: null,
id: 'event-14', type: 'sync.completed', occurredAt,
payload: { syncId: 's1', kind: 'media' },
}).success).toBe(false);
expect(LegacyDashboardStreamEventSchema.safeParse({
type: 'connected', timestamp: 1_700_000_000_000,