40 lines
1.6 KiB
TypeScript
40 lines
1.6 KiB
TypeScript
import { describe, expect, test } from 'vitest'
|
|
import { OverlayAction } from '../../../../packages/automation/application/ports/OverlaySyncPort'
|
|
import { IAutomationLifecycleEmitter, LifecycleCallback } from '../../../../packages/automation/infrastructure/adapters/IAutomationLifecycleEmitter'
|
|
import { OverlaySyncService } from '../../../../packages/automation/application/services/OverlaySyncService'
|
|
|
|
class MockLifecycleEmitter implements IAutomationLifecycleEmitter {
|
|
private callbacks: Set<LifecycleCallback> = new Set()
|
|
onLifecycle(cb: LifecycleCallback): void {
|
|
this.callbacks.add(cb)
|
|
}
|
|
offLifecycle(cb: LifecycleCallback): void {
|
|
this.callbacks.delete(cb)
|
|
}
|
|
async emit(event: { type: 'panel-attached'|'modal-opened'|'action-started'|'action-complete'|'action-failed'|'panel-missing'; actionId: string; timestamp: number }) {
|
|
for (const cb of Array.from(this.callbacks)) {
|
|
cb(event)
|
|
}
|
|
}
|
|
}
|
|
|
|
describe('OverlaySyncService timeout (unit)', () => {
|
|
test('startAction with short timeout resolves as tentative when no events', async () => {
|
|
const emitter = new MockLifecycleEmitter()
|
|
const svc = new OverlaySyncService({
|
|
lifecycleEmitter: emitter,
|
|
logger: console as any,
|
|
publisher: { publish: async () => {} },
|
|
})
|
|
|
|
const action: OverlayAction = { id: 'add-car', label: 'Adding...', timeoutMs: 50 }
|
|
|
|
const start = Date.now()
|
|
const ack = await svc.startAction(action)
|
|
const elapsed = Date.now() - start
|
|
|
|
expect(ack.status).toBe('tentative')
|
|
expect(ack.id).toBe('add-car')
|
|
expect(elapsed).toBeGreaterThanOrEqual(40)
|
|
})
|
|
}) |