"""Unit tests for Spotify Snowflake SQL executor.""" import datetime from unittest.mock import patch, MagicMock import freezegun import pytest import config from conftest import get_args, check_query @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_shazam_statistics(mock_executor): """Test create_shazam_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_shazam_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['shazam_statistics']]) def test_create_staging_raw_shazam_statistics(mock_executor): """Test create_shazam_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_staging_raw_shazam_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_shazam_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_stats(mock_executor): """Test update_stating_raw_shazam_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['shazam_statistics'], ]) def test_select_weekly_change_empty(mock_executor): """Test update_stating_raw_shazam_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 == {'shazams': 0, 'tracks_count': 0} def test_select_weekly_change(mock_executor): """Test update_stating_raw_shazam_stats method.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [(45, 64)] 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 == {'shazams': 45, 'tracks_count': 64} def test_update_artist_stats(mock_executor): """Test update_stating_raw_shazam_stats method.""" mock_executor.update_artist_stats({ '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['shazam_statistics'], ]) def test_insert_artist_stats(mock_executor): """Test update_stating_raw_shazam_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['shazam_statistics'], ]) @freezegun.freeze_time('2022-08-02') def test_update_artist_stats_last_processing_date(mock_executor): """Test update_stating_raw_shazam_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['shazam_statistics'], 'LAST_PROCESSING_DATE=']) assert params == { 'last_processing_date': datetime.datetime.today(), 'artist': 'cijikin'} def test_update_stating_raw_shazam_stats(mock_executor): """Test update_stating_raw_shazam_stats method.""" mock_executor.update_stating_raw_shazam_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']])