"""Tests for the pure SessionTracker module (no fakes, no I/O).""" from stt_daemon.session import SessionTracker def _counter(): """Deterministic id factory: returns id-1, id-2, ... and records call times.""" calls = [] def factory(now): calls.append(now) return f"id-{len(calls)}" return factory, calls def test_current_id_is_none_before_first_observe(): factory, _ = _counter() tracker = SessionTracker(300.0, factory) assert tracker.current_id is None def test_first_observe_mints_the_factory_id_for_now(): def factory(now): return f"id-{now}" tracker = SessionTracker(300.0, factory) assert tracker.observe(100.0) == factory(100.0) def test_same_id_within_gap_then_new_id_beyond_gap(): gap = 1.0 factory, calls = _counter() tracker = SessionTracker(gap, factory) first = tracker.observe(100.0) # `gap - 1` after the first observation: still inside the gap, same id. assert tracker.observe(100.0 + gap - 1) == first # Beyond the gap: a new id, and the factory minted exactly twice. assert tracker.observe(100.0 + gap + 1) != first assert len(calls) == 2 def test_exact_gap_boundary_does_not_mint(): gap = 300.0 factory, calls = _counter() tracker = SessionTracker(gap, factory) first = tracker.observe(100.0) # now - last == gap is NOT > gap, so the boundary must not roll over. assert tracker.observe(100.0 + gap) == first assert len(calls) == 1 def test_just_beyond_gap_mints_a_new_id(): gap = 300.0 factory, calls = _counter() tracker = SessionTracker(gap, factory) first = tracker.observe(100.0) assert tracker.observe(100.0 + gap + 1) != first assert len(calls) == 2 def test_zero_gap_returns_one_id_forever(): factory, calls = _counter() tracker = SessionTracker(0.0, factory) first = tracker.observe(0.0) assert tracker.observe(1_000_000.0) == first assert tracker.observe(1_000_000_000.0) == first assert len(calls) == 1 def test_negative_gap_also_disables_rollover(): factory, calls = _counter() tracker = SessionTracker(-5.0, factory) first = tracker.observe(100.0) assert tracker.observe(100.0 + 86_400.0) == first assert len(calls) == 1 def test_large_jump_yields_exactly_one_new_id(): gap = 300.0 factory, calls = _counter() tracker = SessionTracker(gap, factory) first = tracker.observe(100.0) after = tracker.observe(100.0 + 86_400.0) assert after != first assert len(calls) == 2 def test_current_id_tracks_the_latest_minted_id(): factory, _ = _counter() tracker = SessionTracker(300.0, factory) assert tracker.current_id is None first = tracker.observe(100.0) assert tracker.current_id == first rolled = tracker.observe(100.0 + 301) assert tracker.current_id == rolled