diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index f6da35e3..b0938eee 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -6,7 +6,7 @@ from src import controller from src.config.objects import (FetchTargetObjects, LastFetchDatetime, TargetObject) from src.error.exceptions import MeDaCaCRMDataFetchException -from src.system_var.constants import PRE_JP_NAME +from src.system_var.constants import CHK_JP_NAME, DATE_JP_NAME, PRE_JP_NAME from src.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple @@ -350,7 +350,7 @@ class TestController: ) in caplog.record_tuples, 'オブジェクト情報.is_skipがFalseのものはCSVアップロード処理のログメッセージが出力されていること' assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples - def test_raise_mock_prepare_data_fetch_process(self, s3_client, monkeypatch, caplog): + def test_raise_prepare_data_fetch_process(self, s3_client, monkeypatch, caplog): """ Cases: データ取得準備処理でシステム例外が発生した場合、エラーで終了すること @@ -360,28 +360,50 @@ class TestController: - データ取得準備処理で例外が発生すること - データ取得準備処理で発生した例外のログメッセージが出力されていること """ - # mock_check_object_infos = copy.deepcopy(TEST_OBJECT_INFO_LIST) - # mock_check_object_infos['objects'][1]['is_skip'] = True + # TODO: ケースのコピー用にコメントを残してある # monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) # monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) + # monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) # mock_execute_datetime = ExecuteDateTime() - # FetchTargetObjects(mock_check_object_infos) - # mock_return_values = [ - # TargetObject(mock_check_object_infos['objects'][0], mock_execute_datetime), - # TargetObject(mock_check_object_infos['objects'][1], mock_execute_datetime), - # TargetObject(mock_check_object_infos['objects'][2], mock_execute_datetime), - # ] - expect_exception = ForTestControllerException('E-CHK-01', PRE_JP_NAME, '例外発生') - mock_prepare_data_fetch_process = MagicMock(side_effect=expect_exception) - mock_check_object_info_process = MagicMock() - # mock_set_datetime_period_process = MagicMock() - # mock_fetch_crm_data_process = MagicMock() + # objects = { + # 'objects': [ + # { + # 'object_name': 'Account', + # 'upload_file_name': 'Account_YYYYMMDDHHMMSS' + # }, + # { + # 'object_name': 'Contact', + # 'upload_file_name': 'Contact_YYYYMMDDHHMMSS' + # }, + # { + # 'object_name': 'Call2_vod__c', + # 'upload_file_name': 'Call2_vod__c_YYYYMMDDHHMMSS' + # } + # ] + # } + # mock_target_objects = FetchTargetObjects(objects) + # mock_target_object_first = TargetObject(objects['objects'][0], mock_execute_datetime) + # mock_target_object_second = TargetObject(objects['objects'][1], mock_execute_datetime) + # mock_target_object_third = TargetObject(objects['objects'][2], mock_execute_datetime) + # mock_return_values = [mock_target_object_first, mock_target_object_second, mock_target_object_third] + # mock_last_fetch_datetime = LastFetchDatetime({ + # 'last_fetch_datetime_from': '1900-01-01T00:00:00.000Z', + # 'last_fetch_datetime_to': '9999-12-31T59:59:59.000Z' + # }, mock_execute_datetime) + # mock_prepare_data_fetch_process = MagicMock(return_value=(mock_target_objects, mock_execute_datetime, {})) + # mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + # mock_set_datetime_period_process = MagicMock(return_value=mock_last_fetch_datetime) + # mock_fetch_crm_data_process = MagicMock(return_value=[{}]) # mock_backup_crm_data_process = MagicMock() # mock_convert_crm_csv_data_process = MagicMock() # mock_backup_crm_csv_data_process = MagicMock() # mock_copy_crm_csv_data_process = MagicMock() # mock_upload_last_fetch_datetime_process = MagicMock() # mock_upload_result_data_process = MagicMock() + + expect_exception = ForTestControllerException('E-PRE-01', PRE_JP_NAME, '例外発生') + mock_prepare_data_fetch_process = MagicMock(side_effect=expect_exception) + mock_check_object_info_process = MagicMock() with patch('src.controller.prepare_data_fetch_process', mock_prepare_data_fetch_process),\ patch('src.controller.check_object_info_process', mock_check_object_info_process): # patch('src.controller.set_datetime_period_process', mock_set_datetime_period_process),\ @@ -398,3 +420,155 @@ class TestController: assert generate_log_message_tuple( log_level=logging.ERROR, log_message=f'E-ERR-01 [{PRE_JP_NAME}]でエラーが発生したため、処理を終了します'), 'データ取得準備処理で発生した例外のログメッセージが出力されていること' + + def test_raise_check_object_info_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + オブジェクト情報形式チェック処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + Arranges: + - オブジェクト情報形式チェック処理の1回のみでシステム例外が発生するようにする + Expects: + - オブジェクト情報形式チェック処理で例外が発生する + - オブジェクト情報形式チェック処理で発生した例外のログメッセージが出力されている + - 例外が発生したオブジェクト以外は正常に終了する + """ + monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) + monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) + monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) + mock_execute_datetime = ExecuteDateTime() + objects = { + 'objects': [ + { + 'object_name': 'Account', + 'upload_file_name': 'Account_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Contact', + 'upload_file_name': 'Contact_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Call2_vod__c', + 'upload_file_name': 'Call2_vod__c_YYYYMMDDHHMMSS' + } + ] + } + mock_target_objects = FetchTargetObjects(objects) + mock_target_object_first = ForTestControllerException('E-PRE-01', CHK_JP_NAME, '例外発生') + mock_target_object_second = TargetObject(objects['objects'][1], mock_execute_datetime) + mock_target_object_third = TargetObject(objects['objects'][2], mock_execute_datetime) + mock_return_values = [mock_target_object_first, mock_target_object_second, mock_target_object_third] + mock_last_fetch_datetime = LastFetchDatetime({ + 'last_fetch_datetime_from': '1900-01-01T00:00:00.000Z', + 'last_fetch_datetime_to': '9999-12-31T59:59:59.000Z' + }, mock_execute_datetime) + mock_prepare_data_fetch_process = MagicMock(return_value=(mock_target_objects, mock_execute_datetime, {})) + mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + mock_set_datetime_period_process = MagicMock(return_value=mock_last_fetch_datetime) + mock_fetch_crm_data_process = MagicMock(return_value=[{}]) + mock_backup_crm_data_process = MagicMock() + mock_convert_crm_csv_data_process = MagicMock() + mock_backup_crm_csv_data_process = MagicMock() + mock_copy_crm_csv_data_process = MagicMock() + mock_upload_last_fetch_datetime_process = MagicMock() + mock_upload_result_data_process = MagicMock() + + with patch('src.controller.prepare_data_fetch_process', mock_prepare_data_fetch_process),\ + patch('src.controller.check_object_info_process', mock_check_object_info_process),\ + patch('src.controller.set_datetime_period_process', mock_set_datetime_period_process),\ + patch('src.controller.fetch_crm_data_process', mock_fetch_crm_data_process),\ + patch('src.controller.backup_crm_data_process', mock_backup_crm_data_process),\ + patch('src.controller.convert_crm_csv_data_process', mock_convert_crm_csv_data_process),\ + patch('src.controller.backup_crm_csv_data_process', mock_backup_crm_csv_data_process),\ + patch('src.controller.copy_crm_csv_data_process', mock_copy_crm_csv_data_process),\ + patch('src.controller.upload_last_fetch_datetime_process', mock_upload_last_fetch_datetime_process),\ + patch('src.controller.upload_result_data_process', mock_upload_result_data_process): + # ループ中の例外処理なので、例外は潰される + # with pytest.raises(MeDaCaCRMDataFetchException): + controller.controller() + assert mock_check_object_info_process.call_count == 3 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{CHK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{expect_process_result}]') in caplog.record_tuples + assert generate_log_message_tuple( + log_level=logging.ERROR, log_message=f'E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください') in caplog.record_tuples + + def test_raise_set_fetch_date_period_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + データ取得期間設定処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + Arranges: + - データ取得期間設定チェック処理の1回のみでシステム例外が発生するようにする + Expects: + - データ取得期間設定チェック処理で例外が発生する + - データ取得期間設定チェック処理で発生した例外のログメッセージが出力されている + - 例外が発生したオブジェクト以外は正常に終了する + """ + monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) + monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) + monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) + mock_execute_datetime = ExecuteDateTime() + objects = { + 'objects': [ + { + 'object_name': 'Account', + 'upload_file_name': 'Account_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Contact', + 'upload_file_name': 'Contact_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Call2_vod__c', + 'upload_file_name': 'Call2_vod__c_YYYYMMDDHHMMSS' + } + ] + } + mock_target_objects = FetchTargetObjects(objects) + mock_target_object_first = TargetObject(objects['objects'][0], mock_execute_datetime) + mock_target_object_second = TargetObject(objects['objects'][1], mock_execute_datetime) + mock_target_object_third = TargetObject(objects['objects'][2], mock_execute_datetime) + mock_return_values = [mock_target_object_first, mock_target_object_second, mock_target_object_third] + mock_last_fetch_datetime = LastFetchDatetime({ + 'last_fetch_datetime_from': '1900-01-01T00:00:00.000Z', + 'last_fetch_datetime_to': '9999-12-31T59:59:59.000Z' + }, mock_execute_datetime) + mock_prepare_data_fetch_process = MagicMock(return_value=(mock_target_objects, mock_execute_datetime, {})) + mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + # mock_set_datetime_period_process = MagicMock(return_value=mock_last_fetch_datetime) + mock_set_datetime_period_process = MagicMock(side_effect=[ForTestControllerException( + 'E-DATE-01', DATE_JP_NAME, '例外発生'), mock_last_fetch_datetime, mock_last_fetch_datetime]) + mock_fetch_crm_data_process = MagicMock(return_value=[{}]) + mock_backup_crm_data_process = MagicMock() + mock_convert_crm_csv_data_process = MagicMock() + mock_backup_crm_csv_data_process = MagicMock() + mock_copy_crm_csv_data_process = MagicMock() + mock_upload_last_fetch_datetime_process = MagicMock() + mock_upload_result_data_process = MagicMock() + + with patch('src.controller.prepare_data_fetch_process', mock_prepare_data_fetch_process),\ + patch('src.controller.check_object_info_process', mock_check_object_info_process),\ + patch('src.controller.set_datetime_period_process', mock_set_datetime_period_process),\ + patch('src.controller.fetch_crm_data_process', mock_fetch_crm_data_process),\ + patch('src.controller.backup_crm_data_process', mock_backup_crm_data_process),\ + patch('src.controller.convert_crm_csv_data_process', mock_convert_crm_csv_data_process),\ + patch('src.controller.backup_crm_csv_data_process', mock_backup_crm_csv_data_process),\ + patch('src.controller.copy_crm_csv_data_process', mock_copy_crm_csv_data_process),\ + patch('src.controller.upload_last_fetch_datetime_process', mock_upload_last_fetch_datetime_process),\ + patch('src.controller.upload_result_data_process', mock_upload_result_data_process): + # ループ中の例外処理なので、例外は潰される + # with pytest.raises(MeDaCaCRMDataFetchException): + controller.controller() + assert mock_set_datetime_period_process.call_count == 3 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{DATE_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{expect_process_result}]') in caplog.record_tuples + assert generate_log_message_tuple( + log_level=logging.ERROR, log_message=f'E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください') in caplog.record_tuples