"""Unit tests for Spotify chart date probing logic.""" from datetime import date import pytest from src import spotify @pytest.fixture() def mock_token(mocker): mocker.patch('src.spotify._get_oauth_token', return_value='tok') @pytest.fixture() def mock_probe(mocker): return mocker.patch('src.spotify._probe') @pytest.fixture() def mock_today(mocker): mock = mocker.patch('src.spotify.date') mock.today.return_value = date(2026, 6, 30) return mock def test_returns_today_when_200(mock_token, mock_probe, mock_today): mock_probe.return_value = 200 assert spotify.get_latest_chart_date() == '2026-06-30' def test_falls_back_to_yesterday_on_404(mock_token, mock_probe, mock_today): mock_probe.side_effect = [404, 200] assert spotify.get_latest_chart_date() == '2026-06-29' def test_returns_none_on_network_error(mock_token, mock_probe, mock_today): mock_probe.return_value = None assert spotify.get_latest_chart_date() is None def test_returns_none_on_unexpected_status(mock_token, mock_probe, mock_today): """401/429/5xx must not be silently treated as 'no chart yet'.""" for bad_status in (401, 429, 500, 503): mock_probe.return_value = bad_status result = spotify.get_latest_chart_date() assert result is None, f'Expected None for status {bad_status}' def test_returns_none_when_no_date_found_in_window(mock_token, mock_probe, mock_today): mock_probe.return_value = 404 assert spotify.get_latest_chart_date() is None