"""Global test configuration and set of fixtures.""" import gzip from unittest.mock import MagicMock from unittest.mock import Mock from unittest.mock import patch import pytest import requests from tests.flows.fixtures import ows_territories @pytest.fixture(scope='session', autouse=True) def mock_config(): """Mock config options.""" patch_config_options = { 'S3_BUCKET': 'bucket', 'S3_FOLDER_TEMPLATE': 'folder/{date}', 'CSV_FILE_TEMPLATE': 'file_{status}.csv', 'JSON_FILE_TEMPLATE': 'file_{status}.json', 'CONFLICT_STATUSES': ('new',), 'SF_INSERT_BATCH_SIZE': 1 } with patch.multiple( 'yt_conflict_elasticsearch.flows.elasticsearch_export.config', **patch_config_options): yield @pytest.fixture() def flow_mock(): """Flow object fixture.""" flow = Mock( flow_domain='flow_domain', flow_name='flow_name', flow_version='flow_version') flow.workflow_id_mock = 'test_workflow_id' flow.workflow_id.return_value = flow.workflow_id_mock return flow @pytest.fixture 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': 'facts', 'schema': 'test_schema', 'ar_db': 'orchard_app_reporting', 'ar_schema': 'art_relations', 'ows_conflict_db': 'ows_conflict_manager', 'ows_conflict_schema': 'test_schema', 'temp_conflict_es_id_table': 'temp_conflict_to_es_id' } @pytest.fixture def save_gzipped_file_with_csv_conflicts(): """Fixture that saves the json-formatted conflicts.""" file_content = \ '"CONFLICT_ID","ISRC","TUID","VENDOR_ID","SUBACCOUNT_ID",' \ '"SUBACCOUNT_NAME","TERRITORY","TERRITORY_STANDARD",' \ '"CONFLICTING_OWNER","CONFLICT_DATE","RESOLVED_DATETIME",' \ '"DAILY_AVERAGE_VIEWS","TRACK_NAME","VERSION","ARTIST_NAMES",' \ '"PRODUCT_ID","PRODUCT_NAME","DISPLAY_UPC","STATUS","ES_ID",'\ '"PRODUCT_DELIVERED_VERSION","VIEWS_IN_CONFLICT"\n' \ '4971125,"USA370330320",8449,2,\\\\N,\\N,"EC",' \ '"ISO_3166_1_2016","adrevuppm","2013-09-04",\\N,' \ '0,"Day By Day","","Dave Bush & Food",12112,' \ '"The Big One","669910333228","NEW","dDzkgWcB9u7hUka8A72K",NULL,2 \n' \ '5033762,"USA370330320",8449,2,\\\\N,\\N,"AR",' \ '"ISO_3166_1_2016","adrevuppm","2013-09-04",\\N,' \ '0,"Day By Day","","Dave Bush & Food",12112,' \ '"The Big One","669910333228","NEW","dDzkgWcB9u7hUka8A72K",NULL,2 \n' \ '31487132,"USA370376686",111911,36,15,' \ '"Hot Potato Productions","BQ","ISO_3166_1_2016",' \ '"rumblefish_cdbaby","2017-04-26",\\N,0,"Amazing Grace",' \ '"remix","Just Plain Darin|||Mama Mia",24434,' \ '"Back To The Basics","669910788622","NEW",' \ 'NULL,"Live",2' with gzip.open( 'tests/test_files/yt_conflict_new.csv.gz', 'wt') as gzip_file: gzip_file.write(file_content) @pytest.fixture def save_gzipped_file_with_json_conflicts(): """Fixture that saves the json-formatted conflicts.""" file_content = \ '{"territory_standard": "ISO_3166_1_2016", ' \ '"conflict_date": "2013-09-04",' \ '"resolved_datetime": null, "tuid": 8449, ' \ '"isrc": "USA370330320", "product_id": 12112, ' \ '"conflicting_owner": "adrevuppm", "track_name": ' \ '"Day By Day", "vendor_id": 2, ' \ '"track_artists": ["Dave Bush & Food"], ' \ '"display_upc": "669910333228", ' \ '"territories": [{"conflict_id": 4971125, "code": ' \ '"EC", "continent_name": "South America", ' \ '"name": "Ecuador"}, {"conflict_id": 5033762, ' \ '"code": "AR", "continent_name": "South America", ' \ '"name": "Argentina"}], "product_name": "The Big One", ' \ '"subaccount_name": "", "subaccount_id": null, ' \ '"daily_average_views": 0, "status": "NEW", "views_in_conflict": 5, ' \ '"es_id": "EWAvpWcBLzAzl7XpJ9Dv"}\n' \ '{"territory_standard": "ISO_3166_1_2016", ' \ '"conflict_date": "2017-04-26", ' \ '"resolved_datetime": null, "tuid": 111911, ' \ '"isrc": "USA370376686", "product_id": 24434, ' \ '"conflicting_owner": "rumblefish_cdbaby", "track_name": ' \ '"Amazing Grace (remix)", "vendor_id": 36, ' \ '"track_artists": ["Just Plain Darin", "Mama Mia"], ' \ '"display_upc": "669910788622", ' \ '"territories": [{"conflict_id": 31487132, ' \ '"code": "BQ", "continent_name": "North America", ' \ '"name": "Bonaire"}], "product_name": "Back To The Basics", ' \ '"subaccount_name": "Hot Potato Productions", ' \ '"subaccount_id": 15, ' \ '"daily_average_views": 0, "status": "NEW", "views_in_conflict": 2, ' \ '"es_id": ""}' with gzip.open( 'tests/test_files/conflicts.json.gz', 'wt') as gzip_file: gzip_file.write(file_content) @pytest.fixture def mock_sf_executor_context(): """Yield executor context.""" sf_executor_class_path = ( 'yt_conflict_elasticsearch.flows.elasticsearch_export.tasks.' 'YouTubeConflictSFExecutor') 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 territories_success_response(): """Mock successful response from ows-territories.""" return MagicMock( spec=requests.models.Response, status_code=200, json=lambda: {'items': ows_territories.TEST_TERRITORIES}) @pytest.fixture def ows_not_found_response(): """Mock not found response from a microservice.""" return MagicMock(spec=requests.models.Response, status_code=404) @pytest.fixture def ows_error_response(): """Mock error response from a microservice.""" return MagicMock(spec=requests.models.Response, status_code=500)