diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index f289c592..5309fa83 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -33,20 +33,22 @@ def controller() -> None: # ③ object_infoのobjectsキーの値の件数分ループする logger.info('I-CTRL-03 取得対象オブジェクトのループ処理開始') - process_result = fetch_crm_data(fetch_target_objects, execute_datetime, process_result) + process_result = _fetch_crm_data(fetch_target_objects, execute_datetime, process_result) # ④ すべてのオブジェクトの処理が完了したことと、オブジェクト毎の処理結果をログに出力する logger.info(f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{process_result}]') + # 最終結果が0件(1件も処理されていない)の場合、ログ出力して処理を終了する + if len(process_result.keys()) == 0: + logger.info('I-CTRL-21 処理対象のデータが存在しませんでした') + return 0 + # ⑤ 取得処理実施結果アップロード処理を呼び出す logger.info('I-CTRL-18 CRM_取得処理実施結果ファイルアップロード処理開始') upload_result_data_process(process_result, execute_datetime) # ⑥ 最終結果をチェックし、チェック結果をログに出力 - if not all([v == 'success' for v in process_result.values()]): - logger.error('E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください') - else: - logger.info('I-CTRL-19 すべてのデータの取得に成功しました') + _check_process_result(process_result) return 0 @@ -59,8 +61,12 @@ def controller() -> None: logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e) return 0 + finally: + # ⑦ CRMデータ取得処理終了ログを出力する + logger.info('I-CTRL-20 CRMデータ取得処理を終了します') -def fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: ExecuteDateTime, process_result: dict): + +def _fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: ExecuteDateTime, process_result: dict): """取得対象オブジェクト情報をループし、1オブジェクトごとのデータを取得する Args: @@ -76,7 +82,7 @@ def fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: E try: process_result[object_info.get(OBJECT_NAME_KEY)] = 'fail' - fetch_crm_data_per_object(object_info, execute_datetime) + _fetch_crm_data_per_object(object_info, execute_datetime) process_result[object_info.get(OBJECT_NAME_KEY)] = 'success' @@ -94,7 +100,7 @@ def fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: E return process_result -def fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateTime) -> None: +def _fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateTime) -> None: """オブジェクトごとにCRMのデータを取得し、取込フォルダにアップロードする Args: @@ -171,3 +177,18 @@ def fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateTi logger.info(f'I-CTRL-16 [{target_object_name}] 処理正常終了') return + + +def _check_process_result(process_result: dict) -> None: + """取得処理結果がすべて成功か、一部失敗しているかを判定し、ログ出力する + + Args: + process_result (dict): 取得処理結果辞書オブジェクト + """ + if not all([v == 'success' for v in process_result.values()]): + logger.error('E-CTRL-01 一部のデータ取得に失敗しています 詳細はログをご確認ください') + return + + logger.info('I-CTRL-19 すべてのデータの取得に成功しました') + + return diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index b75eec23..b5cfbcb6 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -26,7 +26,6 @@ class TestController: - 取得処理実施結果アップロード処理が1回のみ実行されること """ monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) - # monkeypatch.setattr(ExecuteDateTime, '__str__', lambda x: 'YYYY-MM-DDTHH:MM:SS.000Z') monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) mock_execute_datetime = ExecuteDateTime() @@ -80,3 +79,40 @@ class TestController: assert mock_copy_crm_csv_data_process.call_count == 3 assert mock_upload_last_fetch_datetime_process.call_count == 3 mock_upload_result_data_process.assert_called_once() + + def test_controller_do_not_call_upload_process_result_process(self, s3_client, monkeypatch): + """ + Cases: + 処理対象オブジェクトが0件の場合、取得処理実施結果アップロード処理が実行されないこと + Arranges: + - データ取得準備処理で返される取得対象オブジェクト情報を0件にする + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - データ取得準備処理が1回のみ実行されること + - 取得処理実施結果アップロード処理が実行されないこと + """ + mock_execute_datetime = ExecuteDateTime() + mock_prepare_data_fetch_process = MagicMock(return_value=([], mock_execute_datetime, {})) + mock_check_object_info_process = MagicMock() + mock_set_datetime_period_process = MagicMock() + mock_fetch_crm_data_process = MagicMock() + 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): + controller.controller() + + mock_prepare_data_fetch_process.assert_called_once() + mock_upload_result_data_process.call_count == 0