test_session.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. """Tests for the pure SessionTracker module (no fakes, no I/O)."""
  2. from stt_daemon.session import SessionTracker
  3. def _counter():
  4. """Deterministic id factory: returns id-1, id-2, ... and records call times."""
  5. calls = []
  6. def factory(now):
  7. calls.append(now)
  8. return f"id-{len(calls)}"
  9. return factory, calls
  10. def test_current_id_is_none_before_first_observe():
  11. factory, _ = _counter()
  12. tracker = SessionTracker(300.0, factory)
  13. assert tracker.current_id is None
  14. def test_first_observe_mints_the_factory_id_for_now():
  15. def factory(now):
  16. return f"id-{now}"
  17. tracker = SessionTracker(300.0, factory)
  18. assert tracker.observe(100.0) == factory(100.0)
  19. def test_same_id_within_gap_then_new_id_beyond_gap():
  20. gap = 1.0
  21. factory, calls = _counter()
  22. tracker = SessionTracker(gap, factory)
  23. first = tracker.observe(100.0)
  24. # `gap - 1` after the first observation: still inside the gap, same id.
  25. assert tracker.observe(100.0 + gap - 1) == first
  26. # Beyond the gap: a new id, and the factory minted exactly twice.
  27. assert tracker.observe(100.0 + gap + 1) != first
  28. assert len(calls) == 2
  29. def test_exact_gap_boundary_does_not_mint():
  30. gap = 300.0
  31. factory, calls = _counter()
  32. tracker = SessionTracker(gap, factory)
  33. first = tracker.observe(100.0)
  34. # now - last == gap is NOT > gap, so the boundary must not roll over.
  35. assert tracker.observe(100.0 + gap) == first
  36. assert len(calls) == 1
  37. def test_just_beyond_gap_mints_a_new_id():
  38. gap = 300.0
  39. factory, calls = _counter()
  40. tracker = SessionTracker(gap, factory)
  41. first = tracker.observe(100.0)
  42. assert tracker.observe(100.0 + gap + 1) != first
  43. assert len(calls) == 2
  44. def test_zero_gap_returns_one_id_forever():
  45. factory, calls = _counter()
  46. tracker = SessionTracker(0.0, factory)
  47. first = tracker.observe(0.0)
  48. assert tracker.observe(1_000_000.0) == first
  49. assert tracker.observe(1_000_000_000.0) == first
  50. assert len(calls) == 1
  51. def test_negative_gap_also_disables_rollover():
  52. factory, calls = _counter()
  53. tracker = SessionTracker(-5.0, factory)
  54. first = tracker.observe(100.0)
  55. assert tracker.observe(100.0 + 86_400.0) == first
  56. assert len(calls) == 1
  57. def test_large_jump_yields_exactly_one_new_id():
  58. gap = 300.0
  59. factory, calls = _counter()
  60. tracker = SessionTracker(gap, factory)
  61. first = tracker.observe(100.0)
  62. after = tracker.observe(100.0 + 86_400.0)
  63. assert after != first
  64. assert len(calls) == 2
  65. def test_current_id_tracks_the_latest_minted_id():
  66. factory, _ = _counter()
  67. tracker = SessionTracker(300.0, factory)
  68. assert tracker.current_id is None
  69. first = tracker.observe(100.0)
  70. assert tracker.current_id == first
  71. rolled = tracker.observe(100.0 + 301)
  72. assert tracker.current_id == rolled