feat(3-2): add recovery tests and story file for automatic recovery on fresh decode
Two-cycle stale→recovery tests confirm that a non-empty fetch after timeout or empty-list correctly resets is_stale=False; no changes to main.py or aircraft.py required as recovery logic was already correct from story 3-1. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -69,3 +69,35 @@ def test_stale_cycle_completes_without_crash(renderer: Renderer) -> None:
|
||||
# Should complete without any exception
|
||||
result = _run_one_cycle(renderer, mock_fetcher, display, last)
|
||||
assert isinstance(result, list)
|
||||
|
||||
|
||||
def test_recovery_after_timeout_returns_fresh(renderer: Renderer) -> None:
|
||||
display = NullDisplay()
|
||||
last = [_make_aircraft()]
|
||||
mock_fetcher = MagicMock()
|
||||
# Cycle 1: timeout → stale
|
||||
mock_fetcher.fetch.side_effect = requests.Timeout
|
||||
stale_result = _run_one_cycle(renderer, mock_fetcher, display, last)
|
||||
assert stale_result[0].is_stale is True
|
||||
# Cycle 2: fresh fetch → recovery
|
||||
fresh_aircraft = [_make_aircraft(icao="DEF456")]
|
||||
mock_fetcher.fetch.side_effect = None
|
||||
mock_fetcher.fetch.return_value = fresh_aircraft
|
||||
recovered = _run_one_cycle(renderer, mock_fetcher, display, stale_result)
|
||||
assert len(recovered) == 1
|
||||
assert recovered[0].is_stale is False
|
||||
assert recovered[0].icao == "DEF456"
|
||||
|
||||
|
||||
def test_recovery_after_empty_returns_fresh(renderer: Renderer) -> None:
|
||||
display = NullDisplay()
|
||||
last = [_make_aircraft()]
|
||||
mock_fetcher = MagicMock()
|
||||
# Cycle 1: empty → stale
|
||||
mock_fetcher.fetch.return_value = []
|
||||
stale_result = _run_one_cycle(renderer, mock_fetcher, display, last)
|
||||
assert stale_result[0].is_stale is True
|
||||
# Cycle 2: non-empty → recovery
|
||||
mock_fetcher.fetch.return_value = [_make_aircraft(icao="GHI789")]
|
||||
recovered = _run_one_cycle(renderer, mock_fetcher, display, stale_result)
|
||||
assert recovered[0].is_stale is False
|
||||
|
||||
Reference in New Issue
Block a user