import json import typing as t from os.path import join as p_join from unittest import mock import pytest from slz_apple_music_charts_data_processor.entities import RationalizedSchema from slz_apple_music_charts_data_processor.repository import S3Repository from slz_apple_music_charts_data_processor.service import ApplicationService from . import FIXTURES_PATH def read_file(file_path: str) -> str: with open(p_join(FIXTURES_PATH, file_path), 'r', encoding='utf-8') as fin: return fin.read() def load_json(file_path: str) -> t.Dict[str, t.Any]: return json.loads(read_file(file_path)) @pytest.fixture def s3_repository(): yield mock.create_autospec(S3Repository) @pytest.mark.parametrize( 'bucket,expected', [ ( 'test-dev-bucket', 's3://test-dev-bucket/apple_music/daily_charts/v1/report_date=2021-11-03/report_licensor=sme' # pylint: disable=line-too-long ), ] ) def test_create_source_path(payload: pytest.FixtureRequest, bucket: str, expected: str): source_path = ApplicationService.create_source_path(bucket, payload) assert source_path == expected @pytest.mark.parametrize( 'bucket,expected', [ ( 'test-dev-bucket', 's3://test-dev-bucket/apple_music/daily_charts/v1/report_date=2021-11-03/apple-20211003-sme-charts_daily_regional-v1_30081_20211003T15.44.50', # pylint: disable=line-too-long ), ] ) def test_create_target_path(payload: pytest.FixtureRequest, bucket: str, expected: str): path = ApplicationService.create_target_path(bucket, payload) assert path == expected @pytest.mark.parametrize( 'raw,expected', [ ( load_json( 'succeed/apple-20211003-sme-charts_daily_regional-v1_30081_20211003T15.44.50.json' ), RationalizedSchema( dim_apple_music_artist=load_json('succeed/dim_apple_music_artist.json'), dim_apple_music_track=load_json('succeed/dim_apple_music_track.json'), dim_apple_music_track_preview=load_json( 'succeed/dim_apple_music_track_preview.json' ), fact_apple_music_chart_track=load_json('succeed/fact_apple_music_chart_track.json'), link_apple_music_track_artist=load_json( 'succeed/link_apple_music_track_artist.json' ), ), ), ( load_json( 'gaps/apple-20211003-sme-charts_daily_regional-v1_30081_20211003T15.44.50.json' ), RationalizedSchema( dim_apple_music_artist=load_json('gaps/dim_apple_music_artist.json'), dim_apple_music_track=load_json('gaps/dim_apple_music_track.json'), dim_apple_music_track_preview=load_json('gaps/dim_apple_music_track_preview.json'), fact_apple_music_chart_track=load_json('gaps/fact_apple_music_chart_track.json'), link_apple_music_track_artist=load_json('gaps/link_apple_music_track_artist.json'), ), ), ( load_json( 'gaps_with_null/apple-20211003-sme-charts_daily_regional-v1_30081_20211003T15.44.50.json' # pylint: disable=line-too-long ), RationalizedSchema( dim_apple_music_artist=load_json('gaps_with_null/dim_apple_music_artist.json'), dim_apple_music_track=load_json('gaps_with_null/dim_apple_music_track.json'), dim_apple_music_track_preview=load_json( 'gaps_with_null/dim_apple_music_track_preview.json' ), fact_apple_music_chart_track=load_json( 'gaps_with_null/fact_apple_music_chart_track.json' ), link_apple_music_track_artist=load_json( 'gaps_with_null/link_apple_music_track_artist.json' ), ), ), ] ) def test_rationalize_raw_data( payload: pytest.FixtureRequest, raw: str, expected: RationalizedSchema ): rationalized_data = ApplicationService.rationalize_raw_data(payload, raw) assert rationalized_data == expected