import json import subprocess from pathlib import Path SOURCE = Path(__file__).parents[1] / "frontend" / "today-timer.js" def test_timer_adopts_claimed_elapsed_time(): script = SOURCE.read_text() + r""" const values = new Map(); const storage = { getItem:key=>values.get(key)||null, setItem:(key,value)=>values.set(key,value), }; let now = 100000; const timer = createTodayTimer({storage, getLogin:()=> 'timmy', now:()=>now}); const adopted = timer.adopt('issue:r:42:', 90000, true); now = 105000; process.stdout.write(JSON.stringify({adopted, snapshot:timer.snapshot()})); """ completed = subprocess.run(["node", "-e", script], check=True, capture_output=True, text=True) result = json.loads(completed.stdout) assert result == { "adopted": True, "snapshot": {"identity": "issue:r:42:", "elapsed_ms": 95000, "running": True}, } def test_timer_reports_durable_changes_for_session_sync(): script = SOURCE.read_text() + r""" const values = new Map(); const storage = {getItem:key=>values.get(key)||null,setItem:(key,value)=>values.set(key,value)}; let now = 0; const changes = []; const timer = createTodayTimer({ storage, getLogin:()=> 'timmy', now:()=>now, onChange:snapshot=>changes.push(snapshot), }); timer.activate('issue:r:42:'); now = 5000; timer.pause(); process.stdout.write(JSON.stringify(changes)); """ completed = subprocess.run(["node", "-e", script], check=True, capture_output=True, text=True) assert json.loads(completed.stdout) == [ {"identity": "issue:r:42:", "elapsed_ms": 0, "running": True}, {"identity": "issue:r:42:", "elapsed_ms": 5000, "running": False}, ]