42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
|
|
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") == {}
|