"""Unit tests for Amazon Music models layer.""" from unittest.mock import MagicMock, Mock import pytest from analytics.models import amazon_music, utils @pytest.fixture() def mock_snowflake(monkeypatch, mock_config): """Mock for Snowflake database client.""" snowflake_mock = MagicMock() monkeypatch.setattr( 'analytics.models.amazon_music.snowflake', snowflake_mock) return snowflake_mock @pytest.mark.parametrize( 'playlists_urls, db_result, expected_result', [ # All playlists were found [ [{'playlist_link': 'link1'}, {'playlist_link': 'link2'}], [('link1', 'title1', 'author1'), ('link2', 'title2', 'author2')], [ { 'playlist_link': 'link1', 'playlist_title': 'title1', 'playlist_author': 'author1', 'status_code': 200}, { 'playlist_link': 'link2', 'playlist_title': 'title2', 'playlist_author': 'author2', 'status_code': 200}, ] ], # Some of playlists weren't found [ [{'playlist_link': 'link1'}, {'playlist_link': 'link2'}], [('link1', 'title1', 'author1')], [ { 'playlist_link': 'link1', 'playlist_title': 'title1', 'playlist_author': 'author1', 'status_code': 200}, { 'playlist_link': 'link2', 'status_code': 404}, ] ], ], ) def test_get_playlists_metadata( monkeypatch, mock_snowflake, playlists_urls, db_result, expected_result): """Test get_playlists_metadata success.""" # Mocking playlist_urls = playlists_urls sql_loader_mock = Mock() monkeypatch.setattr(amazon_music, '_sql_loader', sql_loader_mock) mock_snowflake.fetchall.return_value = db_result # Tested function call result = amazon_music.get_playlists_metadata( playlist_urls, Mock(), [1, 2], ['theorchard']) # Checks assert expected_result == result.message def test_get_playlists_metadata_exception( monkeypatch, mock_snowflake, mock_sentry): """Test get_playlists_metadata_exception in case of general Exception.""" playlists = [{'playlist_link': 'link1'}, {'playlist_link': 'link2'}] sql_loader = Mock() monkeypatch.setattr(amazon_music, '_sql_loader', sql_loader) mock_snowflake.fetchall.side_effect = Exception() playlists_with_status = Mock() exprected_result = playlists_with_status.return_value monkeypatch.setattr(utils, 'playlists_with_status', playlists_with_status) # Tested function call result = amazon_music.get_playlists_metadata( playlists, Mock(), [1, 2], ['theorchard']) assert result.message == exprected_result playlists_with_status.assert_called_once_with(playlists, 500) assert mock_sentry.captureException.call_count == 1