39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import { createVisibilityAwarePollingFallback } from '../../apps/dashboard/src/features/operations/realtime-fallback.js';
|
|
|
|
describe('visibility-aware realtime fallback', () => {
|
|
it('polls only while stale and visible, including immediately on returning visible', () => {
|
|
let visible = false;
|
|
let interval: (() => void) | undefined;
|
|
let visibilityListener: (() => void) | undefined;
|
|
const poll = vi.fn();
|
|
const fallback = createVisibilityAwarePollingFallback({
|
|
intervalMs: 5_000,
|
|
poll,
|
|
scheduler: {
|
|
setInterval(callback) { interval = callback; return 'timer'; },
|
|
clearInterval: vi.fn(),
|
|
},
|
|
visibility: {
|
|
isVisible: () => visible,
|
|
subscribe(listener) { visibilityListener = listener; return vi.fn(); },
|
|
},
|
|
});
|
|
|
|
fallback.start();
|
|
fallback.setStale(true);
|
|
interval?.();
|
|
expect(poll).not.toHaveBeenCalled();
|
|
|
|
visible = true;
|
|
visibilityListener?.();
|
|
expect(poll).toHaveBeenCalledOnce();
|
|
interval?.();
|
|
expect(poll).toHaveBeenCalledTimes(2);
|
|
|
|
fallback.setStale(false);
|
|
interval?.();
|
|
expect(poll).toHaveBeenCalledTimes(2);
|
|
});
|
|
});
|