import os.path import unittest import unittest.mock from slz_config.entities import CompleteCriteriaConfig from slz_downloader import config from slz_downloader.dsp.entities import S3 from slz_downloader.dsp.gras import Client from slz_downloader.entities import Job @unittest.mock.patch.object(Client, 'get_secrets') def test_gras_get_query_path(get_secrets_mock, ): logger = unittest.mock.Mock() get_secrets_mock.return_value = { 'user': 'user', 'password': 'password', 'host': 'host', 'db_name': 'db-name', 'port': '9060', } params = config.App.empty() params.s3 = S3( source=None, source_key=None, archive='bucket-archive', archive_quarantine='bucket-archive-quarantine', decompressed='bucket-decompressed', decompressed_quarantine='bucket-decompressed-quarantine', corrupted='bucket-corrupted', ) params.aws = config.AWS(region='aws_region', endpoint='') uow = { 'context': 'uk', 'config_bucket': 'dev-delphi-configs', } job = Job.from_dict(uow) job.context_params = CompleteCriteriaConfig( required=True, context='uk', query='path-to-query.sql', ) client = Client(logger) client.configure(params) actual_path = client.get_query_path(job) expected_path = 's3://dev-delphi-configs/path-to-query.sql' assert actual_path == expected_path @unittest.mock.patch.object(Client, 'get_gras_client') @unittest.mock.patch.object(Client, 'get_query_path') @unittest.mock.patch.object(Client, 'get_secrets') def test_download(get_secrets_mock, get_query_path_mock, get_gras_client_mock, fixture_path): logger = unittest.mock.Mock() get_secrets_mock.return_value = { 'user': 'user', 'password': 'password', 'host': 'host', 'db_name': 'db-name', 'port': '9060', } get_gras_client_mock.return_value = gras_client = unittest.mock.MagicMock() gras_client.connection.return_value.__enter__.return_value = connection = unittest.mock.MagicMock( ) connection.cursor.return_value.__enter__.return_value = cursor = unittest.mock.MagicMock() get_query_path_mock.return_value = os.path.join(fixture_path, 'gras/test-query.sql') params = config.App.empty() params.s3 = S3( source=None, source_key=None, archive='bucket-archive', archive_quarantine='bucket-archive-quarantine', decompressed='bucket-decompressed', decompressed_quarantine='bucket-decompressed-quarantine', corrupted='bucket-corrupted', ) params.aws = config.AWS(region='aws_region', endpoint='') uow = { 'uow_id': 'spotify-20191117-sme-users-v1', 'dsp': 'spotify', 'report_type': 'users', 'version': 'v1', 'report_date': '2019-11-17', 'licensor': 'sme', 'extension': 'gz', 'context': 'en', } job = Job.from_dict(uow) client = Client(logger) client.configure(params) with unittest.mock.patch('slz_downloader.dsp.gras.universal.copy', return_value=999) as copy: report_meta = client.download(job, chunk_size=1024) assert 999 == report_meta.actual_size copy.assert_called_once() cursor.execute.assert_called_once_with("select 1 as 'id', 'John' as 'name'") @unittest.mock.patch.object(Client, 'get_gras_client') @unittest.mock.patch.object(Client, 'get_secrets') def test_check_source_is_available(get_secrets_mock, get_gras_client_mock): logger = unittest.mock.Mock() params = config.App.empty() params.s3 = S3( source=None, source_key=None, archive='bucket-archive', archive_quarantine='bucket-archive-quarantine', decompressed='bucket-decompressed', decompressed_quarantine='bucket-decompressed-quarantine', corrupted='bucket-corrupted', ) uow = { 'context': 'uk', 'config_bucket': 'dev-delphi-configs', } job = Job.from_dict(uow) job.context_params = CompleteCriteriaConfig( required=True, context='uk', query='path-to-query.sql', ) params.aws = config.AWS(region='aws_region', endpoint='') client = Client(logger) client.configure(params) res = client._check_source_is_available(job) assert ('uk', 0) == res