"""Unit tests for Spotify Snowflake SQL executor.""" import datetime from unittest.mock import MagicMock, patch import config import freezegun import pytest from tests.conftest import check_query, get_args @pytest.fixture def mock_sql_loader(): """Return sql_loader mock.""" sql_loader_path = ( 'snowflake_executor.sql_loader') with patch(sql_loader_path) as sql_loader: yield sql_loader def test_create_artist_link_table(mock_executor): """Test create_artist_link_table method.""" mock_executor.fetchone = MagicMock() mock_executor.create_artist_link_table() query = get_args(mock_executor.fetchone)[0] assert mock_executor.fetchone.call_count == 1 assert check_query(query, [ 'CREATE TABLE', config.snowflake_table_names[ 'soundcloud_artist_to_track']]) def test_create_soundcloud_statistics(mock_executor): """Test create_soundcloud_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_soundcloud_statistics() query = get_args(mock_executor.fetchone)[0] assert mock_executor.fetchone.call_count == 1 assert check_query(query, [ 'CREATE TABLE', config.snowflake_table_names['soundcloud_statistics']]) def test_create_staging_raw_soundcloud_statistics(mock_executor): """Test create_soundcloud_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_staging_raw_soundcloud_statistics() query = get_args(mock_executor.fetchone)[0] assert mock_executor.fetchone.call_count == 1 assert check_query(query, [ 'CREATE TABLE', config.snowflake_table_names['staging_raw']]) def test_delete_from_staging_raw(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.delete_from_staging_raw() query = get_args(mock_executor.fetchall)[0] params = get_args(mock_executor.fetchall, True) assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ 'DELETE FROM', config.snowflake_table_names['staging_raw']]) assert params == dict(date=datetime.datetime.today().strftime('%Y-%m-%d')) def test_select_artists_links(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.select_artists_links() query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ config.snowflake_table_names['soundcloud_artist_to_track'], ]) def test_select_artists_stats(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.select_artists_stats() query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ config.snowflake_table_names['soundcloud_statistics'], ]) def test_select_weekly_change_empty(mock_executor): """Test update_stating_raw_soundcloud_stats method returning nothing.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [()] result = mock_executor.select_weekly_change('cijikin') query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ config.snowflake_table_names['staging_raw'], 'OVER (PARTITION BY ARTIST ORDER BY LAST_PROCESSING_DATE', 'FIRST_VALUE', 'LAST_VALUE']) assert result == { 'followers_count': 0, 'followings_count': 0, 'tracks_count': 0, 'plays_count': 0, 'likes_count': 0, 'reposts_count': 0 } def test_select_weekly_change(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [(45, 64, 4, 300, 54, 5)] result = mock_executor.select_weekly_change('cijikin') query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ config.snowflake_table_names['staging_raw'], 'OVER (PARTITION BY ARTIST ORDER BY LAST_PROCESSING_DATE', 'FIRST_VALUE', 'LAST_VALUE']) assert result == { 'followers_count': 45, 'followings_count': 64, 'tracks_count': 4, 'plays_count': 300, 'likes_count': 54, 'reposts_count': 5 } def test_update_artist_stats(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.update_artist_stats({ 'the_latest_release': datetime.datetime.today(), 'last_processing_date': datetime.datetime.today(), 'last_week_processing_date': datetime.datetime.today(), }, 'cijikin') query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ 'UPDATE', config.snowflake_table_names['soundcloud_statistics'], ]) def test_insert_artist_stats(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.insert_artist_stats('cijikin', { 'the_latest_release': datetime.datetime.today(), 'last_processing_date': datetime.datetime.today(), 'last_week_processing_date': datetime.datetime.today(), }) query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ 'INSERT INTO', config.snowflake_table_names[ 'soundcloud_statistics'], ]) @freezegun.freeze_time('1962-10-01') def test_update_artist_stats_last_processing_date(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.update_artist_stats_last_processing_date( 'cijikin', datetime.datetime.today()) query = get_args(mock_executor.fetchall)[0] params = get_args(mock_executor.fetchall, True) assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ config.snowflake_table_names['soundcloud_statistics'], 'LAST_PROCESSING_DATE=']) assert params == { 'last_processing_date': datetime.datetime.today(), 'artist': 'cijikin'} def test_update_stating_raw_soundcloud_stats(mock_executor): """Test update_stating_raw_soundcloud_stats method.""" mock_executor.update_stating_raw_soundcloud_stats() query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ 'INSERT INTO', config.snowflake_table_names['staging_raw']])