# pylint: disable=unused-argument,protected-access from datetime import date, datetime from unittest.mock import Mock import pytest from db_schema.schemas import apps from data_completeness_updater.services import DelphiApiPgService, Service from tests.conftest import apps_unit_of_work_stub @pytest.mark.parametrize( 'uow_code, expected', [ ('amazonprime-20200114-stream_playlist_track', True), ('apple-20200223-non_royalty_track_date_day', False), ('amazonmusicunlimited-20200113-stream_playlist', True), ('spotify-20200305-streams_playlist_date_day', False), ('tiktokreporting-20210722-trends_daily_isrc_content_type_date_day', False), ] ) def test_check_is_amazon(uow_code, expected): uow = apps_unit_of_work_stub(unit_of_work_code=uow_code) result = Service.is_amazon(uow) assert result == expected def test_prepare_row_tiktokreporting(): mock = Mock() mock.unit_of_work_code = 'tiktokreporting-20210722-trends_daily_isrc_content_type_date_day' mock.report_date = date(2020, 10, 15) mock.completeness_status = apps.CompletenessStatusEnum.COMPLETE mock.last_updated_at = datetime(2020, 10, 15, 12, 35, 0) result = Service._prepare_row([mock]) expected = { 'dsp_id': 'tiktok', 'report_date': date(2020, 10, 15), 'completeness_status': 'COMPLETE', 'last_updated_at': datetime(2020, 10, 15, 12, 35, 0) } assert result == expected def test_prepare_row_apple(): mock = Mock() mock.unit_of_work_code = 'apple-20200223-non_royalty_track_date_day' mock.report_date = date(2020, 10, 15) mock.completeness_status = apps.CompletenessStatusEnum.COMPLETE mock.last_updated_at = datetime(2020, 10, 15, 12, 35, 0) result = Service._prepare_row([mock]) expected = { 'dsp_id': 'apple', 'report_date': date(2020, 10, 15), 'completeness_status': 'COMPLETE', 'last_updated_at': datetime(2020, 10, 15, 12, 35, 0) } assert result == expected @pytest.mark.parametrize( 'last_status, expected_status', [ (apps.CompletenessStatusEnum.COMPLETE, 'COMPLETE'), (apps.CompletenessStatusEnum.ACTIVE, 'MIN_COMPLETE'), ] ) def test_prepare_row_amazon(last_status, expected_status): initial = [] for i, key in enumerate(['amazonprime', 'amazonmusicunlimited', 'amazonadsupported']): mock = Mock() mock.unit_of_work_code = f'{key}-20200223-non_royalty_track_date_day' mock.report_date = date(2020, 10, 15) mock.completeness_status = apps.CompletenessStatusEnum.COMPLETE mock.last_updated_at = datetime(2020, 10, 15, 12 + i, 35, 0) initial.append(mock) initial[2].completeness_status = last_status result = Service._prepare_row(initial) expected = { 'dsp_id': 'amazon', 'report_date': date(2020, 10, 15), 'completeness_status': expected_status, 'last_updated_at': datetime(2020, 10, 15, 14, 35, 0) } assert result == expected def test_prepare_row_youtube(): mock = Mock() mock.unit_of_work_code = 'youtubereporting-20210219-streams_isrc_date_day' mock.report_date = date(2021, 2, 19) mock.completeness_status = apps.CompletenessStatusEnum.COMPLETE mock.last_updated_at = datetime(2020, 10, 15, 12, 35, 0) result = Service._prepare_row([mock]) expected = { 'dsp_id': 'youtube', 'report_date': date(2021, 2, 19), 'completeness_status': 'COMPLETE', 'last_updated_at': datetime(2020, 10, 15, 12, 35, 0) } assert result == expected def test_prepare_rows_apple(): test_data = [ { 'unit_of_work_code': 'apple-202010215-non_royalty_track_date_day', 'report_date': date(2020, 10, 15), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 11, 15, 12, 35, 0) }, { 'unit_of_work_code': 'apple-202010216-non_royalty_track_date_day', 'report_date': date(2020, 10, 16), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 12, 15, 12, 35, 0) }, { 'unit_of_work_code': 'apple-202010217-non_royalty_track_date_day', 'report_date': date(2020, 10, 17), 'completeness_status': apps.CompletenessStatusEnum.ACTIVE, 'last_updated_at': datetime(2020, 10, 15, 12, 35, 0) } ] get_apps_etl_uows = [] for dataset in test_data: mock = Mock() for k, v in dataset.items(): setattr(mock, k, v) get_apps_etl_uows.append(mock) slz_pg_service = Mock() slz_pg_service.get_apps_etl_uows.return_value = get_apps_etl_uows service = Service( logger=Mock(), config=Mock(), slz_pg_service=slz_pg_service, delphi_api_pg_service=Mock(), ) records = service._slz_pg_service.get_apps_etl_uows(Mock()) result = service._prepare_rows(records) expected = [ { 'completeness_status': 'COMPLETE', 'dsp_id': 'apple', 'report_date': date(2020, 10, 15), 'last_updated_at': datetime(2020, 11, 15, 12, 35, 0) }, { 'completeness_status': 'COMPLETE', 'dsp_id': 'apple', 'report_date': date(2020, 10, 16), 'last_updated_at': datetime(2020, 12, 15, 12, 35, 0) }, { 'completeness_status': 'MIN_COMPLETE', 'dsp_id': 'apple', 'report_date': date(2020, 10, 17), 'last_updated_at': datetime(2020, 10, 15, 12, 35, 0) } ] assert result == expected @pytest.mark.parametrize( 'last_status, expected_status', [ (apps.CompletenessStatusEnum.COMPLETE, 'COMPLETE'), (apps.CompletenessStatusEnum.ACTIVE, 'MIN_COMPLETE'), ] ) def test_prepare_rows_amazon(last_status, expected_status): test_data_first_query = [ { 'unit_of_work_code': 'amazonprime-202010215-non_royalty_track_date_day', 'report_date': date(2020, 10, 15), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 12, 16, 12, 35, 0) }, { 'unit_of_work_code': 'amazonmusicunlimited-202010216-non_royalty_track_date_day', 'report_date': date(2020, 10, 16), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 12, 17, 12, 35, 0) }, { 'unit_of_work_code': 'amazonadsupported-202010217-non_royalty_track_date_day', 'report_date': date(2020, 10, 17), 'completeness_status': apps.CompletenessStatusEnum.ACTIVE, 'last_updated_at': datetime(2020, 12, 18, 12, 35, 0) } ] get_apps_etl_uows = [] for dataset in test_data_first_query: mock = Mock() for k, v in dataset.items(): setattr(mock, k, v) get_apps_etl_uows.append(mock) slz_pg_service = Mock() slz_pg_service.get_apps_etl_uows.return_value = get_apps_etl_uows test_data_second_query = [ { 'unit_of_work_code': 'amazonprime-202010215-non_royalty_track_date_day', 'report_date': date(2020, 10, 15), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 12, 16, 12, 35, 0) }, { 'unit_of_work_code': 'amazonmusicunlimited-202010215-non_royalty_track_date_day', 'report_date': date(2020, 10, 15), 'completeness_status': apps.CompletenessStatusEnum.COMPLETE, 'last_updated_at': datetime(2020, 12, 10, 12, 35, 0) }, { 'unit_of_work_code': 'amazonadsupported-202010215-non_royalty_track_date_day', 'report_date': date(2020, 10, 15), 'completeness_status': last_status, 'last_updated_at': datetime(2020, 12, 8, 12, 35, 0) } ] get_apps_etl_amazon_uows = [] for dataset in test_data_second_query: mock = Mock() for k, v in dataset.items(): setattr(mock, k, v) get_apps_etl_amazon_uows.append(mock) slz_pg_service.get_apps_etl_amazon_uows.return_value = get_apps_etl_amazon_uows service = Service( logger=Mock(), config=Mock(), slz_pg_service=slz_pg_service, delphi_api_pg_service=Mock(), ) records = service._slz_pg_service.get_apps_etl_uows(Mock()) result = service._prepare_rows(records) expected = [ { 'completeness_status': expected_status, 'dsp_id': 'amazon', 'report_date': date(2020, 10, 15), 'last_updated_at': datetime(2020, 12, 16, 12, 35, 0) } ] assert result == expected @pytest.mark.parametrize( 'initial, expected', [ ( [datetime(2020, 12, 16, 12, 35, 0), datetime(2020, 12, 13, 12, 35, 0)], datetime(2020, 12, 16, 12, 35, 0) ), ([datetime(2020, 12, 16, 12, 35, 0), None], datetime(2020, 12, 16, 12, 35, 0)), ([None, None], None), ] ) def test_get_latest_insertion_date(initial, expected): pg_conn = Mock() pg_conn.query.return_value.with_entities.return_value.all.return_value = [ initial, ] api_service = DelphiApiPgService(logger=Mock(), session=pg_conn) actual = api_service.get_latest_insertion_date() assert actual == expected