"""Conftest file being observed by tests.""" import asyncio import datetime from unittest.mock import MagicMock, patch, AsyncMock from freezegun import freeze_time import pytest from snowflake import connector from snowflake_executor import ShazamStatsSFExecutor def get_args(f, params=False): if params: return f.call_args[1]['params'] return f.call_args[0] def check_query(query: str, contains: list, check=True): for substring in contains: check = check and (substring in query) return check @freeze_time('1946-09-27') def artist_statistics_from_table(monkeypatch) -> list: """Return processed dataset example.""" stats = [['cijikin', 207950953, 2423, 2140, 243, 0, 0.5, 4, 36, 36, 0, 0, 67, datetime.datetime.today(), datetime.datetime.today()], ] return stats @freeze_time('1946-09-27') def track_statistics_from_table(monkeypatch) -> list: """Return processed dataset example.""" stats = [[2945879250, 'Track Title', 'cijikin', 8952783, 0, 0, 0, 0, datetime.datetime.today(), datetime.datetime.today()], ] return stats @freeze_time('1946-09-27') def artist_last_stats(last_week_processing_date=datetime.date.today() - datetime.timedelta(days=4)): """Return artist's last run statistics.""" return {'cijikin': {'shazam_id': 207950953, 'current_shazams': 2423, 'last_week_shazams': 2140, 'weekly_change_in_shazams': 243, 'percentage_change_in_shazams': 0, 'acceleration_shazams': 0.5, 'average_shazams': 4, 'current_tracks_count': 36, 'last_week_tracks_count': 36, 'weekly_change_in_tracks_count': 0, 'percentage_change_in_tracks_count': 0, 'shazams_per_track': 67, 'last_processing_date': datetime.datetime.today(), 'last_week_processing_date': last_week_processing_date}} @freeze_time('1946-09-27') def tracks_last_stats(last_week_processing_date=datetime.date.today() - datetime.timedelta(days=4)): """Return artist's last run statistics.""" return {2945879250: {'track_title': 'Track Title', 'artist': 'cijikin', 'shazam_id': 8952783, 'current_shazams': 0, 'last_week_shazams': 0, 'weekly_change_in_shazams': 0, 'percentage_change_in_shazams': 0, 'last_processing_date': datetime.datetime.today(), 'last_week_processing_date': last_week_processing_date}} def processed_links() -> dict: """Return processed dataset example.""" links = {'artist': 'cijikin', 'instagram': 'https://www.instagram.com/cijikin/', 'spotify': 'https://open.spotify.com/artist/060CEbkq3Bubu0AvJu4NKf', 'youtube': 'https://www.youtube.com/channel/UC5kuP-o0jopVpHCD8KSrPpg', 'soundcloud': 'https://soundcloud.com/cijikin', 'shazam': 'https://www.shazam.com/gb/artist/207950953/cijikin', 'tiktok': 'To check corresponding links', 'id': None, 'date': None} return links def select_artists_ids(monkeypatch): """Return processed dataset example.""" return [('cijikin', 'https://www.shazam.com/gb/artist/207950953/cijikin')] def select_tracks_ids(monkeypatch): """Return processed dataset example.""" return [('Track Name', 3553207950953)] def sf_config_mock(): """Fixture returning the dict with Snowflake connection params.""" return { 'account': 'test_acc', 'role': 'test_role', 'host': 'test_host', 'warehouse': 'test_wh', 'port': 10, 'user': 'test_user', 'password': 'test_pass', 'db': 'test_db', 'schema': 'test_schema' } def get_artists_links(): """Fixture returning the list of artists' links.""" return [[ 'cijikin', 'https://www.instagram.com/cijikin/', 'test_id', 'https://open.spotify.com/artist/060CEbkq3Bubu0AvJu4NKf', 'https://www.youtube.com/channel/UC5kuP-o0jopVpHCD8KSrPpg', 'https://soundcloud.com/cijikin', None, None]] @pytest.fixture def mock_executor(monkeypatch): """Yield executor.""" connect_mock = MagicMock() monkeypatch.setattr(connector, 'connect', connect_mock) executor = ShazamStatsSFExecutor(sf_config_mock()) with patch.object(executor, 'execute', wraps=executor.execute) as \ executor.ex_mock: executor.fetchall = MagicMock() yield executor @pytest.fixture def mock_executor_context(): """Yield executor context.""" sf_executor_class_path = 'snowflake_executor.ShazamStatsSFExecutor' with patch(sf_executor_class_path) as sf_executor: mock_executor_context = sf_executor.return_value.__enter__.return_value yield mock_executor_context @pytest.fixture def mock_create_shazam_statistics(): """Yield CREATE shazam_statistics table SQL query result.""" create_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.create_shazam_statistics') with patch(create_path) as create: yield create @pytest.fixture def mock_create_shazam_tracks_statistics(): """Yield CREATE shazam_tracks_statistics table SQL query result.""" create_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.create_shazam_tracks_statistics') with patch(create_path) as create: yield create @pytest.fixture def mock_create_staging_raw_shazam_tracks_statistics(): """Yield CREATE staging_raw_shazam_tracks_statistics table SQL query result.""" create_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.create_staging_raw_shazam_tracks_statistics') with patch(create_path) as create: yield create @pytest.fixture def mock_create_staging_raw_shazam_statistics(): """Yield CREATE staging_raw_shazam_statistics table SQL query result.""" create_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.create_staging_raw_shazam_statistics') with patch(create_path) as create: yield create @pytest.fixture def mock_delete_from_staging_raw(): """Yield DELETE from staging_raw_shazam_statistics table SQL query result.""" delete_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.delete_from_staging_raw') with patch(delete_path) as delete: yield delete @pytest.fixture def mock_insert_tracks_stats(): """Yield DELETE from staging_raw_shazam_statistics table SQL query result.""" insert_path = ( 'shazam_with_shazamio.ShazamStatsSFExecutor.insert_tracks_stats') with patch(insert_path) as insert: yield insert @pytest.fixture def mock_compare_current_and_last_week_stats(): """Yield mock_compare_current_and_last_week_stats method.""" calc_path = ( 'shazam_with_shazamio.ShazamTracker.compare_current_and_last_week_stats') with patch(calc_path) as calc: yield calc @pytest.fixture def mock_create_tables(): """Yield create_tables method from tracker class.""" create_path = ( 'shazam_with_shazamio.ShazamTracker.create_tables') with patch(create_path) as create: yield create @pytest.fixture def mock_get_all_stats_and_update(): """Yield get_all_stats_and_update method from tracker class.""" get_path = ( 'shazam_with_shazamio.ShazamTracker.get_all_stats_and_update') with patch(get_path) as get: yield get