from __future__ import annotations from datetime import UTC, datetime, timedelta from repub.datastar import TabStateStore def test_tab_state_store_tracks_page_state_per_tab_and_connection_count() -> None: store = TabStateStore() store.connect("tab-1") store.connect("tab-1") store.update_page_state( "tab-1", "runs", lambda state: {**state, "completed_page": 2}, ) assert store.get_tab_state("tab-1") == {"runs": {"completed_page": 2}} store.disconnect("tab-1") assert store.get_tab_state("tab-1") == {"runs": {"completed_page": 2}} store.disconnect("tab-1") assert store.get_tab_state("tab-1") is None def test_tab_state_store_cleans_only_stale_disconnected_tabs() -> None: store = TabStateStore(clean_age_threshold=timedelta(hours=24)) now = datetime(2026, 3, 31, 12, 0, tzinfo=UTC) store.connect("stale-tab", now=now - timedelta(days=2)) store.connect("fresh-tab", now=now) removed = store.cleanup_stale(now=now) assert removed == {"stale-tab"} assert store.get_tab_state("stale-tab") is None assert store.get_tab_state("fresh-tab") == {}