66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
import json
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
|
|
POLLER = Path(__file__).parents[1] / "frontend" / "context-poller.js"
|
|
|
|
|
|
def run_node(script: str) -> dict:
|
|
result = subprocess.run(
|
|
["node", "-e", script], check=True, capture_output=True, text=True
|
|
)
|
|
return json.loads(result.stdout)
|
|
|
|
|
|
def test_context_poller_is_single_flight_and_pauses_until_visible():
|
|
script = f"""
|
|
const createContextPoller = require({json.dumps(str(POLLER))});
|
|
let calls = 0;
|
|
let hidden = false;
|
|
let resolveRequest;
|
|
const timers = [];
|
|
const poller = createContextPoller({{
|
|
fetchContext: () => {{
|
|
calls += 1;
|
|
if (calls > 1) return Promise.resolve({{ repos: [] }});
|
|
return new Promise((resolve) => {{ resolveRequest = resolve; }});
|
|
}},
|
|
onSnapshot: () => {{}},
|
|
onError: () => {{}},
|
|
isHidden: () => hidden,
|
|
setTimer: (callback) => {{ timers.push(callback); return timers.length; }},
|
|
clearTimer: () => {{}},
|
|
intervalMs: 8000,
|
|
}});
|
|
|
|
(async () => {{
|
|
const first = poller.start();
|
|
const joined = poller.refresh();
|
|
const callsWhilePending = calls;
|
|
resolveRequest({{ repos: [] }});
|
|
await Promise.all([first, joined]);
|
|
|
|
hidden = true;
|
|
poller.setVisible(false);
|
|
const scheduled = timers.shift();
|
|
if (scheduled) scheduled();
|
|
await Promise.resolve();
|
|
const callsWhileHidden = calls;
|
|
|
|
hidden = false;
|
|
await poller.setVisible(true);
|
|
process.stdout.write(JSON.stringify({{
|
|
callsWhilePending,
|
|
callsWhileHidden,
|
|
callsAfterResume: calls,
|
|
}}));
|
|
}})();
|
|
"""
|
|
|
|
assert run_node(script) == {
|
|
"callsWhilePending": 1,
|
|
"callsWhileHidden": 1,
|
|
"callsAfterResume": 2,
|
|
}
|