"""InReview Report.""" from unittest import TestCase from unittest.mock import patch import pytest from feed_ingestion.flows.music_analytics_reports.\ music_analytics_report import InReviewReport _date = '2022-12-07' class TestMusicAnalyticsReport(TestCase): """Music Analytics report class tests.""" @pytest.fixture(autouse=True) def set_raw_report_data(self): """Set valid raw data.""" self.raw = \ 'song_id\tartist_name\tcontent_name\tstorefront\t' \ 'subscription_type\tsubscription_mode\tchannel_partner\t' \ 'device_type\tdevice_os\tsource_of_stream\t' \ 'container_sub_type\tcontainer_id\tcontainer_name\t' \ 'end_reason_type\taudio_format\tgender\tage_bucket\t' \ 'streams\trptg_date\n'\ '2435166644\tTest Song\tArtist of Test Song\tGB\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tSKIP\t' \ f'COMPRESSED_AUDIO\tMALE\tAGE_35_TO_44\t1\t{_date}\n'\ '2435166644\tTest Song\tArtist of Test Song\tJP\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tCOMPLETE\t' \ f'COMPRESSED_AUDIO\tMALE\tAGE_45_TO_54\t1\t{_date}\n' \ '2435166644\tTest Song\tArtist of Test Song\tMX\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tCOMPLETE\t' \ f'LOSSLESS\tMALE\tAGE_45_TO_54\t2\t{_date}\n' @pytest.fixture(autouse=True) def set_invalid_raw_report_data(self): """Invalid raw data.""" self.invalid_raw = \ 'song_id\tartist_name\tcontent_name\tstorefront\t' \ 'subscription_type\tsubscription_mode\tchannel_partner\t' \ 'device_type\tdevice_os\tsource_of_stream\t' \ 'container_sub_type\tcontainer_id\tcontainer_name\t' \ 'end_reason_type\taudio_format\tgender\tage_bucket\t' \ 'streams\trptg_date\n'\ '24351666434\tTest Song Artist of Test Song\tGB\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tSKIP\t' \ f'COMPRESSED_AUDIO\tMALE\tAGE_35_TO_44\t1\t{_date}\n' \ 'sfodgjnajdsn\tTest Song Artist of Test Song\tGB\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tSKIP\t' \ f'COMPRESSED_AUDIO\tMALE\tAGE_35_TO_44\t1\t{_date}\n' \ '24351666434\tTest Song\tArtist of Test Song\tGB\t' \ 'INDIVIDUAL_MONTHLY\tPAID\tNone\tMOBILE\tANDROID\t' \ 'LIBRARY\tALBUM\t2435166518\tNone\tSKIP\t' \ f'COMPRESSED_AUDIO\tMALE\tAGE_35_TO_44\t1\t{_date}\n' def test_valid_report_init(self): """Test valid data initialisation.""" report = InReviewReport(self.raw) self.assertEqual(report.date, _date) self.assertEqual(report.file_name_pattern, 'AMAnalytics_InReviewReport_{date}.') self.assertEqual(report.header, self.raw.split('\n')[0]) @patch('builtins.open', read_data='data') def test_open_errors_file(self, mock_open): """Open errors file. If doesn't exist, create it.""" report = InReviewReport(self.invalid_raw) report.open_errors_file() self.assertEqual(mock_open.call_count, 1) def test_validate_header(self): """Test __validate_string method with header.""" report = InReviewReport(self.raw) row = report._MusicAnalyticsReport__validate_string( self.raw.split('\n')[0]) self.assertEqual(row, None) self.assertEqual(self.raw.split('\n')[0]. replace('\n', ''), report.header) @patch('builtins.open', read_data='data') def test_validate_valid_raw(self, mock_open): """Test __validate_string method with a valid raw.""" report = InReviewReport(self.invalid_raw) row = report._MusicAnalyticsReport__validate_string( self.invalid_raw.split('\n')[1]) self.assertEqual(row, None) def test_validate_report_data(self): """Test validate_report_data method.""" report = InReviewReport(self.raw) data = report.validate_report_data() self.assertEqual(len(data), 3) self.assertEqual(data[1][3], 'JP') self.assertEqual(data[1][0], 2435166644) @patch('builtins.open', read_data='data') def test_get_invalid_report_data(self, mock_open): """Test validate_report_data method with invalid data.""" report = InReviewReport(self.invalid_raw) data = report.validate_report_data() self.assertEqual(len(data), 1) self.assertEqual(data[0][3], 'GB') self.assertEqual(data[0][1], 'Test Song') @patch('builtins.open', read_data='data') def test_write_to_report_file(self, mock_open): """Test write_to_report_file methods.""" report = InReviewReport(self.raw) data = report.validate_report_data() report.write_to_report_file(data) self.assertEqual(mock_open.call_count, 1) self.assertEqual( mock_open.call_args[0], ('AMAnalytics_InReviewReport_2022-12-07.csv', 'w+')) @patch('builtins.open', read_data='data',) def test_write_invalid_report_to_file(self, mock_open): """Test write_to_report_file methods.""" mock_open().name = 'AMAnalytics_InReviewReport_2022-12-07.csv' report = InReviewReport(self.invalid_raw) data = report.validate_report_data() file = report.write_to_report_file(data) self.assertEqual(mock_open.call_count, 4) self.assertEqual(list(mock_open.call_args).count( ('AMAnalytics_InReviewReport_2022-12-07.csv', 'w+')), 1) # 1 for report self.assertEqual(list(mock_open.call_args_list).count([ ('AMAnalytics_InReviewReportErrors_2022-12-07.csv', 'r+'), {}]), 2) # 2, 3 for errors self.assertEqual(file, 'AMAnalytics_InReviewReport_2022-12-07.csv') @patch('builtins.open', read_data='data') def test_write_report_data_to_file(self, mock_open): """Test write_report_data_to_file method.""" mock_open().name = 'AMAnalytics_InReviewReport_2022-12-07.csv' report = InReviewReport(self.invalid_raw) file = report.write_report_data_to_file() self.assertEqual(mock_open.call_count, 4) self.assertEqual(mock_open.call_args[0], ('AMAnalytics_InReviewReport' 'Errors_2022-12-07.csv', 'r+')) self.assertEqual(file, { 'report': 'AMAnalytics_InReviewReport_2022-12-07.csv', 'errors': 'AMAnalytics_InReviewReportErrors_2022-12-07.csv' })