stackchain-dashboard/tests/test_today_timer_handoff.py
timmy 8d12a0384b
All checks were successful
CI / lint (pull_request) Successful in 3m11s
CI / build-release (pull_request) Successful in 6s
CI / browser-journey (pull_request) Successful in 2m22s
CI / release-candidate (pull_request) Has been skipped
feat: hand off active Today sessions across devices (Closes #1022)
2026-08-17 12:44:01 +00:00

52 lines
1.6 KiB
Python

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},
]