import io import json from unittest.mock import Mock import boto3 import pytest from moto import mock_s3, mock_secretsmanager from slz_downloader.dsp.tiktokreporting import Client, TrendsDailyClient from slz_downloader.entities import Job @pytest.fixture(scope='session') def secrets_manager_client(): with mock_secretsmanager(): client = boto3.client('secretsmanager', region_name='us-west-1') environment = 'test_env' key = f'delphi/{environment}/slz/IST_S3' msg = json.dumps( { 'AWS_DEFAULT_REGION': 'us-west-1', 'ACCESS_KEY_ID': 'access', 'SECRET_ACCESS_KEY': 'secret access', 'REGION': 'us-west-1', 'BUCKET': 'IST', } ) client.create_secret(Name=key, SecretString=msg) yield client client.delete_secret(SecretId=key) @pytest.fixture(scope='function') def s3_client(): with mock_s3(): client = boto3.client('s3') client.create_bucket(Bucket='IST') yield client @pytest.fixture(scope='function') def IST_bucket(s3_client): files = [ 'tiktok/in/2020/07/04/TikTok_Trends_TopHashtag_20200705.txt', 'tiktok/in/2020/07/05/TikTok_Trends_TopHashtag_20200705.txt', 'tiktok/in/theorchard/daily_trends/PLY3_D_ROW_20210727.txt', 'tiktok/in/theorchard/daily_trends/PLY3_D_ROW_20210727_v2.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210727.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210727_v2.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210727_v3.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210921_v3.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210720.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210920_v3.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20211020.txt', 'tiktok/in/sme/daily_trends/PLY3_D_CN_20211020.txt', 'tiktok/in/sme/daily_trends/PLY3_D_CN_20211021.txt', 'tiktok/in/sme/daily_trends/PLY3_D_CN_20211021_v2.txt', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20211021.txt', ] for file_ in files: dummy = io.BytesIO(file_.encode('utf-8')) s3_client.upload_fileobj(dummy, 'IST', file_) yield for file_ in files: s3_client.delete_object(Bucket='IST', Key=file_) @pytest.mark.parametrize( 'report_date, expected_path', [ ('2020-07-05', 'tiktok/in/2020/07/05/TikTok_Trends_TopHashtag_20200705.txt'), ('2021-07-27', 'tiktok/in/sme/weekly_toplists/TikTok_Trends_TopHashtag_20210727.txt'), ] ) def test_top_songs_hashtag_client(report_date, expected_path): uow = { 'uow_id': f'tiktokreporting-{report_date.replace("-", "")}-sme-trends_top_hashtag-v1', 'dsp': 'tiktokreporting', 'report_type': 'trends_top_hashtag', 'version': 'v1', 'report_date': report_date, 'licensor': 'sme', 'extension': 'txt', 'context': 'Trends_TopHashtag', } job = Job.from_dict(uow) logger = Mock() client = Client(logger) actual_path = client._get_report_path(job) assert actual_path == expected_path @pytest.mark.parametrize( 'report_date, context, expected_path', [ ('2020-07-05', 'ROW', 'tiktok/in/daily_trends/PLY3_D_ROW_20200705.txt'), ('2021-07-27', 'ROW', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210727_v3.txt'), ('2021-09-21', 'ROW', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210921_v3.txt'), ('2021-09-20', 'ROW', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20210920_v3.txt'), ('2021-10-20', 'ROW', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20211020.txt'), ('2021-10-20', 'CN', 'tiktok/in/sme/daily_trends/PLY3_D_CN_20211020.txt'), ('2021-10-21', 'ROW', 'tiktok/in/sme/daily_trends/PLY3_D_ROW_20211021.txt'), ('2021-10-21', 'CN', 'tiktok/in/sme/daily_trends/PLY3_D_CN_20211021_v2.txt'), ] ) def test_daily_trends_client( report_date, context, expected_path, secrets_manager_client, s3_client, IST_bucket, params ): uow = { 'uow_id': f'tiktokreporting-{report_date.replace("-", "")}-sme-trends_daily-v1', 'dsp': 'tiktokreporting', 'report_type': 'trends_daily', 'version': 'v1', 'report_date': report_date, 'licensor': 'sme', 'extension': 'txt', 'context': context, } job = Job.from_dict(uow) logger = Mock() client = TrendsDailyClient(logger) client.configure(params) actual_path = client._get_report_path(job) assert actual_path == expected_path