"""Unit tests for Spotify Snowflake SQL executor.""" import datetime from unittest.mock import MagicMock, patch import config from conftest import check_query, get_args import pytest @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['artist_to_track']]) def test_create_instagram_statistics(mock_executor): """Test create_instagram_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_instagram_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['instagram_statistics']]) def test_create_staging_raw_instagram_statistics(mock_executor): """Test create_instagram_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_staging_raw_instagram_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_update_artist_link_table(mock_executor): """Test create_instagram_statistics method.""" mock_executor.execute = MagicMock() mock_executor.update_artist_link_table( [dict(zip(['artist', 'instagram', 'id', 'spotify', 'youtube', 'soundcloud', 'shazam', 'tiktok'], [None] * 8))]) query = get_args(mock_executor.execute)[0] assert mock_executor.execute.call_count == 1 assert check_query(query, [ 'UPDATE', config.snowflake_table_names['artist_to_track'], 'INSTAGRAM_ID']) def test_insert_artist_link_table(mock_executor): """Test create_instagram_statistics method.""" mock_executor.execute = MagicMock() mock_executor.insert_artist_link_table( [dict(zip(['artist', 'instagram', 'id', 'spotify', 'youtube', 'soundcloud', 'shazam', 'tiktok', 'date'], [None] * 9))]) query = get_args(mock_executor.execute)[0] assert mock_executor.execute.call_count == 1 assert check_query(query, [ 'INSERT INTO', config.snowflake_table_names['artist_to_track'], 'VALUES', '%(instagram_link)s', "TRY_TO_DATE(%(date_added)s, 'DD-MM-YYYY')"]) def test_delete_artist_link_table(mock_executor): """Test create_instagram_statistics method.""" mock_executor.execute = MagicMock() mock_executor.delete_artist_link_table('cijikin') query = get_args(mock_executor.execute)[0] assert mock_executor.execute.call_count == 1 assert check_query(query, [ 'DELETE FROM', config.snowflake_table_names['artist_to_track'], 'WHERE ARTIST = ']) def test_delete_from_staging_raw(mock_executor): """Test update_stating_raw_instagram_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_instagram_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['artist_to_track'], ]) def test_select_artists_stats(mock_executor): """Test update_stating_raw_instagram_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['instagram_statistics'], ]) def test_select_weekly_change_empty(mock_executor): """Test update_stating_raw_instagram_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': 0, 'likes': 0, 'comments': 0, 'posts': 0, 'engagement': 0} def test_select_weekly_change(mock_executor): """Test update_stating_raw_instagram_stats method.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [(45, 64, 4, 2, 5.6)] 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': 45, 'likes': 64, 'comments': 4, 'posts': 2, 'engagement': 5.6} def test_update_artist_stats(mock_executor): """Test update_stating_raw_instagram_stats method.""" mock_executor.update_artist_stats('cijikin', { '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, [ 'UPDATE', config.snowflake_table_names['instagram_statistics'], ]) def test_insert_artist_stats(mock_executor): """Test update_stating_raw_instagram_stats method.""" mock_executor.insert_artist_stats('cijikin', { '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['instagram_statistics'], ]) def test_update_artist_stats_last_processing_date(mock_executor): """Test update_stating_raw_instagram_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['instagram_statistics'], 'LAST_PROCESSING_DATE=TRY_TO_DATE']) assert params == { 'last_processing_date': datetime.datetime.today().strftime('%d-%m-%Y'), 'artist': 'cijikin'} def test_update_stating_raw_instagram_stats(mock_executor): """Test update_stating_raw_instagram_stats method.""" mock_executor.update_stating_raw_instagram_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']])