diff --git a/__tests__/stores/product-workspace/store.test.ts b/__tests__/stores/product-workspace/store.test.ts index e53cd65..9f3cea7 100644 --- a/__tests__/stores/product-workspace/store.test.ts +++ b/__tests__/stores/product-workspace/store.test.ts @@ -436,7 +436,7 @@ describe('applyRealtimeEvent — andere product genegeerd', () => { }) describe('applyRealtimeEvent — unknown entity → resync trigger', () => { - it('payload met entity buiten pbi/story/task triggert resyncActiveScopes', () => { + function withSpy(): ReturnType { useProductWorkspaceStore.setState((s) => { s.context.activeProduct = { id: 'prod-1', name: 'Product 1' } }) @@ -444,34 +444,85 @@ describe('applyRealtimeEvent — unknown entity → resync trigger', () => { useProductWorkspaceStore.setState((s) => { s.resyncActiveScopes = spy as unknown as typeof s.resyncActiveScopes }) + return spy + } + it('unknown entity (b.v. comment) met matching product triggert resync', () => { + const spy = withSpy() useProductWorkspaceStore.getState().applyRealtimeEvent({ entity: 'comment', op: 'I', id: 'cm-1', product_id: 'prod-1', } as unknown as Record) - expect(spy).toHaveBeenCalledWith('unknown-event') }) - it('payload met type-veld (job/worker) triggert geen resync', () => { - useProductWorkspaceStore.setState((s) => { - s.context.activeProduct = { id: 'prod-1', name: 'Product 1' } - }) - const spy = vi.fn().mockResolvedValue(undefined) - useProductWorkspaceStore.setState((s) => { - s.resyncActiveScopes = spy as unknown as typeof s.resyncActiveScopes - }) + it('unknown entity met ander product_id triggert geen resync', () => { + const spy = withSpy() + useProductWorkspaceStore.getState().applyRealtimeEvent({ + entity: 'comment', + op: 'I', + id: 'cm-1', + product_id: 'prod-2', + } as unknown as Record) + expect(spy).not.toHaveBeenCalled() + }) + it('claude_job_status (type-veld) triggert geen resync', () => { + const spy = withSpy() useProductWorkspaceStore.getState().applyRealtimeEvent({ type: 'claude_job_status', job_id: 'job-1', product_id: 'prod-1', + status: 'queued', } as unknown as Record) - expect(spy).not.toHaveBeenCalled() }) + + it('worker_heartbeat (type-veld) triggert geen resync', () => { + const spy = withSpy() + useProductWorkspaceStore.getState().applyRealtimeEvent({ + type: 'worker_heartbeat', + worker_id: 'w-1', + product_id: 'prod-1', + } as unknown as Record) + expect(spy).not.toHaveBeenCalled() + }) + + it('claude_job_enqueued (type-veld) triggert geen resync', () => { + const spy = withSpy() + useProductWorkspaceStore.getState().applyRealtimeEvent({ + type: 'claude_job_enqueued', + job_id: 'job-2', + product_id: 'prod-1', + kind: 'PER_TASK', + } as unknown as Record) + expect(spy).not.toHaveBeenCalled() + }) + + it('payload zonder entity en zonder type wordt genegeerd', () => { + const spy = withSpy() + useProductWorkspaceStore.getState().applyRealtimeEvent({ + product_id: 'prod-1', + something: 'else', + } as unknown as Record) + expect(spy).not.toHaveBeenCalled() + }) + + it('question-event met entity-veld maar zonder pbi/story/task triggert resync', () => { + // question is geen pbi/story/task entity dus telt als unknown wanneer + // hij geen 'type' draagt — dat zou een nieuwe entiteit kunnen zijn die + // we nog niet kennen. + const spy = withSpy() + useProductWorkspaceStore.getState().applyRealtimeEvent({ + entity: 'question', + op: 'I', + id: 'q-1', + product_id: 'prod-1', + } as unknown as Record) + expect(spy).toHaveBeenCalledWith('unknown-event') + }) }) // ─────────────────────────────────────────────────────────────────────────