"""Unit tests for TikTok Snowflake SQL executor.""" import datetime from unittest.mock import patch, MagicMock import freezegun import pytest 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_tiktok_statistics(mock_executor): """Test create_tiktok_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_tiktok_statistics() query = get_args(mock_executor.fetchone)[0] assert mock_executor.fetchone.call_count == 1 assert check_query(query, ['CREATE TABLE', 'tiktok_statistics']) def test_create_staging_raw_tiktok_statistics(mock_executor): """Test create_tiktok_statistics method.""" mock_executor.fetchone = MagicMock() mock_executor.create_staging_raw_tiktok_statistics() query = get_args(mock_executor.fetchone)[0] assert mock_executor.fetchone.call_count == 1 assert check_query(query, ['CREATE TABLE', 'staging_raw_tiktok_statistics']) def test_delete_from_staging_raw(mock_executor): """Test update_stating_raw_tiktok_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', 'staging_raw_tiktok_statistics']) assert params == dict(date=datetime.datetime.today().strftime("%Y-%m-%d")) def test_select_artists_links(mock_executor): """Test update_stating_raw_tiktok_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, ['artist_to_track', ]) def test_select_artists_stats(mock_executor): """Test update_stating_raw_tiktok_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, ['tiktok_statistics', ]) def test_select_weekly_change_empty(mock_executor): """Test update_stating_raw_tiktok_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, ['staging_raw_tiktok_statistics', 'OVER (PARTITION BY ARTIST ORDER BY LAST_PROCESSING_DATE', 'FIRST_VALUE', 'LAST_VALUE']) assert result == { 'followers': 0, 'followings': 0, 'likes': 0} def test_select_weekly_change(mock_executor): """Test update_stating_raw_tiktok_stats method.""" mock_executor.fetchall = MagicMock() mock_executor.fetchall.return_value = [(45, 64, 54)] 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, ['staging_raw_tiktok_statistics', 'OVER (PARTITION BY ARTIST ORDER BY LAST_PROCESSING_DATE', 'FIRST_VALUE', 'LAST_VALUE']) assert result == { 'followers': 45, 'followings': 64, 'likes': 54} def test_update_artist_stats(mock_executor): """Test update_stating_raw_tiktok_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', 'tiktok_statistics', ]) def test_insert_artist_stats(mock_executor): """Test update_stating_raw_tiktok_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', 'tiktok_statistics', ]) @freezegun.freeze_time('1962-10-01') def test_update_artist_stats_last_processing_date(mock_executor): """Test update_stating_raw_tiktok_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, ['tiktok_statistics', 'LAST_PROCESSING_DATE=']) assert params == { 'last_processing_date': '01-10-1962', 'artist': 'cijikin'} def test_update_stating_raw_tiktok_stats(mock_executor): """Test update_stating_raw_tiktok_stats method.""" mock_executor.update_stating_raw_tiktok_stats() query = get_args(mock_executor.fetchall)[0] assert mock_executor.fetchall.call_count == 1 assert check_query(query, ['INSERT INTO', 'staging_raw_tiktok_statistics'])