"""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 freezegun 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_youtube_statistics(mock_executor): """Test create_youtube_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_youtube_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['youtube_statistics']]) def test_create_staging_raw_youtube_statistics(mock_executor): """Test create_youtube_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_staging_raw_youtube_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_youtube_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_youtube_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['youtube_artist_to_track'], ]) def test_select_artists_stats(mock_executor): """Test update_stating_raw_youtube_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['youtube_statistics'], ]) def test_select_weekly_change_empty(mock_executor): """Test update_stating_raw_youtube_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 == {'subscribers': 0, 'likes': 0, 'dislikes': 0, 'views': 0, 'comments': 0} def test_select_weekly_change(mock_executor): """Test update_stating_raw_youtube_stats method.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [(45, 0, 6, 4, 66)] 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 == {'subscribers': 45, 'likes': 0, 'dislikes': 6, 'views': 4, 'comments': 66} def test_update_artist_stats(mock_executor): """Test update_stating_raw_youtube_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(), }) query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, [ 'UPDATE', config.snowflake_table_names['youtube_statistics'], ]) def test_insert_artist_stats(mock_executor): """Test update_stating_raw_youtube_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['youtube_statistics'], ]) @freezegun.freeze_time('1962-10-01') def test_update_artist_stats_last_processing_date(mock_executor): """Test update_stating_raw_youtube_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['youtube_statistics'], 'LAST_PROCESSING_DATE=']) assert params == { 'last_processing_date': datetime.datetime.today(), 'artist': 'cijikin'} def test_update_stating_raw_youtube_stats(mock_executor): """Test update_stating_raw_youtube_stats method.""" mock_executor.update_stating_raw_youtube_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']])