"""Tests for new_music_friday_date logic""" from datetime import date from datetime import datetime import pytest from unittest.mock import patch from unittest.mock import ANY from charts.connectors import redis from charts.connectors import snowflake from charts.constants.new_music_friday import NEW_MUSIC_FRIDAY_DATES_REDIS_KEY from charts.logic import new_music_friday def test_new_music_friday_dates_redis_miss() -> None: """Test new_music_friday_dates redis miss.""" redis_result = None snowflake_result = ( (date.fromisoformat('2025-04-18'),), (date.fromisoformat('2025-04-11'),), (date.fromisoformat('2025-04-04'),), ) with patch.object(redis.client, 'get', return_value=redis_result) as mock_redis_get, \ patch.object(snowflake, 'fetchall_nocache', return_value=snowflake_result) as mock_fetchall, \ patch.object(redis.client, 'set') as mock_redis_set: result = new_music_friday.new_music_friday_dates() assert result == new_music_friday.NewMusicFridayDatesResponse( dates=[ date.fromisoformat('2025-04-18'), date.fromisoformat('2025-04-11'), date.fromisoformat('2025-04-04'), ] ) mock_redis_get.assert_called_once_with(NEW_MUSIC_FRIDAY_DATES_REDIS_KEY) mock_fetchall.assert_called_once() mock_redis_set.assert_called_once_with( NEW_MUSIC_FRIDAY_DATES_REDIS_KEY, '{"dates":["2025-04-18","2025-04-11","2025-04-04"]}', exat=1745488800, ) def test_new_music_friday_dates_redis_get_connection_err() -> None: """Test new_music_friday_dates redis get connection error.""" def redis_side_effect(key: str) -> None: raise redis.exceptions.ConnectionError() snowflake_result = ( (date.fromisoformat('2025-04-18'),), (date.fromisoformat('2025-04-11'),), (date.fromisoformat('2025-04-04'),), ) with patch.object(redis.client, 'get', side_effect=redis_side_effect) as mock_redis_get, \ patch.object(snowflake, 'fetchall_nocache', return_value=snowflake_result) as mock_fetchall, \ patch.object(redis.client, 'set') as mock_redis_set: result = new_music_friday.new_music_friday_dates() assert result == new_music_friday.NewMusicFridayDatesResponse( dates=[ date.fromisoformat('2025-04-18'), date.fromisoformat('2025-04-11'), date.fromisoformat('2025-04-04'), ] ) mock_redis_get.assert_called_once_with(NEW_MUSIC_FRIDAY_DATES_REDIS_KEY) mock_fetchall.assert_called_once() mock_redis_set.assert_called_once_with( NEW_MUSIC_FRIDAY_DATES_REDIS_KEY, '{"dates":["2025-04-18","2025-04-11","2025-04-04"]}', exat=1745488800, ) def test_new_music_friday_dates_redis_invalid() -> None: """Test new_music_friday_dates redis invalid data.""" redis_result = '{"this_does_not_match_the_schema":True}' snowflake_result = ( (date.fromisoformat('2025-04-18'),), (date.fromisoformat('2025-04-11'),), (date.fromisoformat('2025-04-04'),), ) with patch.object(redis.client, 'get', return_value=redis_result) as mock_redis_get, \ patch.object(snowflake, 'fetchall_nocache', return_value=snowflake_result) as mock_fetchall, \ patch.object(redis.client, 'set') as mock_redis_set: result = new_music_friday.new_music_friday_dates() assert result == new_music_friday.NewMusicFridayDatesResponse( dates=[ date.fromisoformat('2025-04-18'), date.fromisoformat('2025-04-11'), date.fromisoformat('2025-04-04'), ] ) mock_redis_get.assert_called_once_with(NEW_MUSIC_FRIDAY_DATES_REDIS_KEY) mock_fetchall.assert_called_once() mock_redis_set.assert_called_once_with( NEW_MUSIC_FRIDAY_DATES_REDIS_KEY, '{"dates":["2025-04-18","2025-04-11","2025-04-04"]}', exat=1745488800, ) def test_new_music_friday_dates_redis_set_connection_err() -> None: """Test new_music_friday_dates redis set connection error.""" redis_result = None snowflake_result = ( (date.fromisoformat('2025-04-18'),), (date.fromisoformat('2025-04-11'),), (date.fromisoformat('2025-04-04'),), ) def redis_set_side_effect(key: str, value: str, exat: int) -> None: raise redis.exceptions.ConnectionError() with patch.object(redis.client, 'get', return_value=redis_result) as mock_redis_get, \ patch.object(snowflake, 'fetchall_nocache', return_value=snowflake_result) as mock_fetchall, \ patch.object(redis.client, 'set', side_effect=redis_set_side_effect) as mock_redis_set: result = new_music_friday.new_music_friday_dates() assert result == new_music_friday.NewMusicFridayDatesResponse( dates=[ date.fromisoformat('2025-04-18'), date.fromisoformat('2025-04-11'), date.fromisoformat('2025-04-04'), ] ) mock_redis_get.assert_called_once_with(NEW_MUSIC_FRIDAY_DATES_REDIS_KEY) mock_fetchall.assert_called_once() mock_redis_set.assert_called_once_with( NEW_MUSIC_FRIDAY_DATES_REDIS_KEY, '{"dates":["2025-04-18","2025-04-11","2025-04-04"]}', exat=1745488800, ) def test_new_music_friday_dates_redis_hit() -> None: """Test new_music_friday_dates redis miss.""" redis_result = '{"dates":["2025-04-18","2025-04-11","2025-04-04"]}' with patch.object(redis.client, 'get', return_value=redis_result) as mock_redis_get, \ patch.object(snowflake, 'fetchall_nocache') as mock_fetchall, \ patch.object(redis.client, 'set') as mock_redis_set: result = new_music_friday.new_music_friday_dates() assert result == new_music_friday.NewMusicFridayDatesResponse( dates=[ date.fromisoformat('2025-04-18'), date.fromisoformat('2025-04-11'), date.fromisoformat('2025-04-04'), ] ) mock_redis_get.assert_called_once_with(NEW_MUSIC_FRIDAY_DATES_REDIS_KEY) mock_fetchall.assert_not_called() mock_redis_set.assert_not_called()