From fad0374b1d68883dcfaeff8a8f2895a8935a29db Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Sun, 10 May 2026 01:21:19 +0200 Subject: [PATCH] feat(PBI-74): unknown-event fallback tests (Story 6) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit T-865 (isUnknownEntityEvent filter) en T-866 (resync-trigger in applyRealtimeEvent) zijn al in Story 1 geïmplementeerd in store.ts; deze story breidt de test-coverage uit met expliciete negatieve cases voor het type-veld noise pattern. T-867 — 5 nieuwe vitest-cases: - unknown entity met ANDER product_id → geen resync - claude_job_status (type) → geen resync - worker_heartbeat (type) → geen resync - claude_job_enqueued (type) → geen resync - payload zonder entity en zonder type → genegeerd - question-entity (entity-veld, geen type, niet pbi/story/task) → resync trigger Verify: lint+typecheck clean, 651/651 tests groen. Refs: PBI-74, ST-1323, T-865..T-867 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../stores/product-workspace/store.test.ts | 73 ++++++++++++++++--- 1 file changed, 62 insertions(+), 11 deletions(-) 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') + }) }) // ─────────────────────────────────────────────────────────────────────────