import unittest.mock from unittest.mock import MagicMock import pytest import slz_downloader.dsp.youtubereporting import slz_downloader.entities @pytest.fixture(scope='function') def ytr_secrets(): return { "credentials": { 'client_id': 'client-id', 'client_secret': 'client-secret', 'refresh_token': 'refresh-id', 'scopes': [ 'https://www.googleapis.com/auth/yt-analytics-monetary.readonly', 'https://www.googleapis.com/auth/yt-analytics.readonly' ], 'grant_type': 'refresh_token' } } @unittest.mock.patch('slz_downloader.dsp.youtubereporting.StreamToS3CopierDecompressed') @unittest.mock.patch('requests.get') @unittest.mock.patch('requests.post') def test_downloading(requests_post, requests_get, copier, params, ytr_secrets): ACCESS_TOKEN = 'id' uow_dict = { 'uow_id': 'youtubereporting-20191230-sme-playlist_combined-v1', 'dsp': 'youtubereporting', 'report_type': 'playlist_combined', 'version': 'v1', 'report_date': '2019-12-30', 'licensor': 'sme', 'extension': 'csv', 'context': 'job_id::job_type', } # Mock youtubereporting secrets # Client initialization logger = unittest.mock.Mock() client = slz_downloader.dsp.youtubereporting.Client(logger=logger) # Mock secrets client._get_secret = MagicMock(return_value=ytr_secrets) secret = client._get_secret() # Mock googleapis service build client._get_ytr_service = MagicMock(return_value=None) # Mock response from googleapis auth service requests_post.return_value.json.return_value = { 'access_token': ACCESS_TOKEN, } client.configure(params) job = slz_downloader.entities.Job.from_dict(uow_dict) # Mock report url client._get_report_url_or_404 = MagicMock( return_value='https://youtubereporting.googleapis.com/404' ) report_url = client._get_report_url_or_404(job) # Mock response from youtubereporting stream requests_get.return_value.ok = True client.download(job) # Auth service called with correct params requests_post.assert_called_with( url='https://www.googleapis.com/oauth2/v4/token', data=client._secret['credentials'] ) # youtubereporting API called with correct request requests_get.assert_called_with( url=report_url, headers={ 'Authorization': 'Bearer ' + ACCESS_TOKEN, 'Accept-Encoding': 'gzip' }, stream=True, timeout=20, ) assert copier.called @pytest.mark.parametrize( 'job_params,expected_header', [ ( { 'uow_id': 'youtubereporting-20210110-sme-active_claims-v1', 'report_date': '2021-01-10', }, { 'Accept-Encoding': 'gzip' } ), ( { 'uow_id': 'youtubereporting-20210131-sme-active_claims-v1', 'report_date': '2021-01-31', }, { 'Accept-Encoding': 'identity' } ), ] ) def test_active_claims_correct_header(job_params, expected_header, params, ytr_secrets): ACCESS_TOKEN = 'id' uow_dict = { **job_params, 'dsp': 'youtubereporting', 'report_type': 'active_claims', 'version': 'v1', 'licensor': 'sme', 'extension': 'csv', 'context': 'job_id::job_type', } # Client initialization logger = unittest.mock.Mock() client = slz_downloader.dsp.youtubereporting.ActiveClaimsClient(logger=logger) # Mock secrets client._get_secret = MagicMock(return_value=ytr_secrets) # Mock googleapis service build client._get_ytr_service = MagicMock(return_value=None) with unittest.mock.patch('requests.post') as requests_post: requests_post.return_value.json.return_value = { 'access_token': ACCESS_TOKEN, } client.configure(params) job = slz_downloader.entities.Job.from_dict(uow_dict) headers = client._get_request_headers(job) expected = {'Authorization': 'Bearer ' + ACCESS_TOKEN, **expected_header} assert headers == expected