feat(PBI-74): unknown-event fallback tests (Story 6)
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) <noreply@anthropic.com>
This commit is contained in:
parent
96fc50154d
commit
fad0374b1d
1 changed files with 62 additions and 11 deletions
|
|
@ -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<typeof vi.fn> {
|
||||
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<string, unknown>)
|
||||
|
||||
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<string, unknown>)
|
||||
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<string, unknown>)
|
||||
|
||||
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<string, unknown>)
|
||||
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<string, unknown>)
|
||||
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<string, unknown>)
|
||||
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<string, unknown>)
|
||||
expect(spy).toHaveBeenCalledWith('unknown-event')
|
||||
})
|
||||
})
|
||||
|
||||
// ─────────────────────────────────────────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue