From 81fc1ebeeeae37d4aaf39d2b04c0c7e8f32826b2 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Aug 2022 11:16:54 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8F=96=E5=BE=97=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E4=BB=B6=E6=95=B0=E3=81=8C0=E4=BB=B6=E3=81=AE?= =?UTF-8?q?=E5=A0=B4=E5=90=88=E3=81=ABCSV=E5=87=BA=E5=8A=9B=E3=81=97?= =?UTF-8?q?=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/src/controller.py | 6 + ecs/crm-datafetch/tests/test_controller.py | 130 ++++++++++++++++++--- 2 files changed, 122 insertions(+), 14 deletions(-) diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index dc8f784d..f9c87960 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -139,6 +139,12 @@ def _fetch_crm_data_per_object(object_info: dict, execute_datetime: ExecuteDateT crm_data_response = fetch_crm_data_process(target_object, last_fetch_datetime) + # 取得件数が0件の場合、次のオブジェクトの処理に移行する + if len(crm_data_response) == 0: + logger.info( + f'I-CTRL-22 [{target_object_name}]のレコード件数が0件のため、ファイルアップロードをスキップします') + return + # 7. 出力ファイル名をログ出力する logger.info( f'I-CTRL-10 [{target_object_name}] の出力ファイル名は [{target_object.upload_file_name}] となります') diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 51ff1987..8b9a464a 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -122,7 +122,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(return_value=[{}]) + self.mock_fetch_crm_data_process = MagicMock(return_value=[{'Name': 'Test'}]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -241,7 +241,7 @@ class TestController: assert generate_log_message_tuple(log_message='I-CTRL-21 処理対象のデータが存在しませんでした') in caplog.record_tuples, '処理対象が存在しない旨を示すログメッセージが出力されていること' assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples - def test_do_not_call_upload_csv_process(self, caplog, run_control_process): + def test_do_not_call_upload_csv_process_cause_is_skip_true(self, caplog, run_control_process): """ Cases: オブジェクト情報.is_skipがTrueの場合、CSVアップロード処理が実行されないこと @@ -291,10 +291,10 @@ class TestController: assert generate_log_message_tuple(log_message='I-CTRL-07 [Account]のデータ取得処理をスキップします') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples - def test_do_not_call_upload_csv_process_of_part(self, caplog, run_control_process): + def test_do_not_call_upload_csv_process_cause_is_skip_true_in_loop(self, caplog, run_control_process): """ Cases: - オブジェクト情報.is_skipがTrueのものが含まれる場合、CSVアップロード処理が実行されないこと + オブジェクト情報.is_skipがTrueのものが含まれる場合、対象オブジェクトのCSVアップロード処理が実行されないこと Arranges: - データ取得準備処理で返される取得対象オブジェクト情報のうち、2つ目をis_skipをTrueにする - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する @@ -331,7 +331,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(FetchTargetObjects(mock_check_object_infos), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock() - self.mock_fetch_crm_data_process = MagicMock() + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{"Name": "Test"}], [{"Name": "Test"}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -365,6 +365,108 @@ 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_do_not_call_upload_csv_process_cause_crm_data_empty(self, caplog, run_control_process): + """ + Cases: + CRMデータ取得処理で取得できた件数が0件の場合、CSVアップロード処理が実行されないこと + Arranges: + - CRMデータ取得処理で返されるオブジェクトを空のリストにする + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - CRM電文データバックアップ処理以降のプロセスが実行されないこと + - 処理をスキップする旨を示すログメッセージが出力されていること + """ + mock_check_object_infos = { + 'objects': [ + { + 'object_name': 'Account', + 'columns': [], + 'is_skip': False + } + ] + } + + FetchTargetObjects(mock_check_object_infos) + mock_return_values = [ + TargetObject(mock_check_object_infos['objects'][0], COMMON_EXECUTE_DATETIME) + ] + self.mock_prepare_data_fetch_process = MagicMock(return_value=(FetchTargetObjects(mock_check_object_infos), COMMON_EXECUTE_DATETIME, {})) + self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + self.mock_set_datetime_period_process = MagicMock() + self.mock_fetch_crm_data_process = MagicMock(return_value=[]) + self.mock_backup_crm_data_process = MagicMock() + self.mock_convert_crm_csv_data_process = MagicMock() + self.mock_backup_crm_csv_data_process = MagicMock() + self.mock_copy_crm_csv_data_process = MagicMock() + self.mock_upload_last_fetch_datetime_process = MagicMock() + self.mock_upload_result_data_process = MagicMock() + + run_control_process() + # 実行回数の確認 + assert self.mock_prepare_data_fetch_process.called is True + assert self.mock_prepare_data_fetch_process.call_count == 1 + assert self.mock_check_object_info_process.call_count == 1 + assert self.mock_set_datetime_period_process.call_count == 1 + assert self.mock_fetch_crm_data_process.call_count == 1 + # CRM電文データバックアップ処理以降のプロセスが実行されないこと + assert self.mock_backup_crm_data_process.call_count == 0 + assert self.mock_convert_crm_csv_data_process.call_count == 0 + assert self.mock_backup_crm_csv_data_process.call_count == 0 + assert self.mock_copy_crm_csv_data_process.call_count == 0 + assert self.mock_upload_last_fetch_datetime_process.call_count == 0 + assert self.mock_upload_result_data_process.called is True + assert self.mock_upload_result_data_process.call_count == 1 + + # ログ出力の確認 + assert generate_log_message_tuple( + log_message='I-CTRL-22 [Account]のレコード件数が0件のため、ファイルアップロードをスキップします') in caplog.record_tuples, '処理をスキップする旨を示すログメッセージが出力されていること' + + def test_do_not_call_upload_csv_process_cause_crm_data_empty_in_loop(self, caplog, run_control_process): + """ + Cases: + CRMデータ取得処理で取得できた件数が0件のものが含まれる場合、対象オブジェクトのCSVアップロード処理が実行されないこと + Arranges: + - CRMデータ取得処理で返されるオブジェクトのうち、2つ目を空のリストにする + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - CRMデータ取得処理が2回実行されること + - 処理をスキップする旨を示すログメッセージが出力されていること + - 取得オブジェクトが1件以上取れているものはCSVアップロード処理のログメッセージが出力されていること + """ + self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) + self.mock_check_object_info_process = MagicMock(side_effect=[COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3]) + self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{"Name": "Test"}], [], [{"Name": "Test"}]]) + self.mock_backup_crm_data_process = MagicMock() + self.mock_convert_crm_csv_data_process = MagicMock() + self.mock_backup_crm_csv_data_process = MagicMock() + self.mock_copy_crm_csv_data_process = MagicMock() + self.mock_upload_last_fetch_datetime_process = MagicMock() + self.mock_upload_result_data_process = MagicMock() + + run_control_process() + # 実行回数の確認 + assert self.mock_check_object_info_process.call_count == 3 + assert self.mock_set_datetime_period_process.call_count == 3 + assert self.mock_fetch_crm_data_process.call_count == 3 + # CRM電文データバックアップ処理以降のプロセスは件数があるもののみ実行されること + assert self.mock_backup_crm_data_process.call_count == 2 + assert self.mock_convert_crm_csv_data_process.call_count == 2 + assert self.mock_backup_crm_csv_data_process.call_count == 2 + assert self.mock_copy_crm_csv_data_process.call_count == 2 + assert self.mock_upload_last_fetch_datetime_process.call_count == 2 + assert self.mock_upload_result_data_process.called is True + assert self.mock_upload_result_data_process.call_count == 1 + + # ログ出力の確認 + assert generate_log_message_tuple( + log_message='I-CTRL-14 [Account] CSVデータアップロード処理呼び出し') in caplog.record_tuples, '取得オブジェクトが1件以上取れているものはCSVアップロード処理のログメッセージが出力されていること' + assert generate_log_message_tuple( + log_message='I-CTRL-22 [Contact]のレコード件数が0件のため、ファイルアップロードをスキップします') in caplog.record_tuples, '処理をスキップする旨を示すログメッセージが出力されていること' + assert generate_log_message_tuple( + log_message='I-CTRL-14 [Call2_vod__c] CSVデータアップロード処理呼び出し' + ) in caplog.record_tuples, '取得オブジェクトが1件以上取れているものはCSVアップロード処理のログメッセージが出力されていること' + @pytest.mark.parametrize( 'exception, message', [ @@ -418,7 +520,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(return_value=[{}]) + self.mock_fetch_crm_data_process = MagicMock(return_value=[{'Name': 'Test'}]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -464,7 +566,7 @@ class TestController: self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(side_effect=[exception( 'E-DATE-01', DATE_JP_NAME, '例外発生'), COMMON_LAST_FETCH_DATETIME, COMMON_LAST_FETCH_DATETIME]) - self.mock_fetch_crm_data_process = MagicMock(return_value=[{}]) + self.mock_fetch_crm_data_process = MagicMock(return_value=[{'Name': 'Test'}]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -510,7 +612,7 @@ class TestController: self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) self.mock_fetch_crm_data_process = MagicMock(side_effect=[exception( - 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) + 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -555,7 +657,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock(side_effect=[exception( 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) self.mock_convert_crm_csv_data_process = MagicMock() @@ -601,7 +703,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock(side_effect=[exception( 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) @@ -647,7 +749,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock(side_effect=[exception( @@ -693,7 +795,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -739,7 +841,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock() @@ -784,7 +886,7 @@ class TestController: self.mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) self.mock_check_object_info_process = MagicMock(side_effect=mock_return_values) self.mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - self.mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + self.mock_fetch_crm_data_process = MagicMock(side_effect=[[{'Name': 'Test'}], [{'Name': 'Test'}], [{'Name': 'Test'}]]) self.mock_backup_crm_data_process = MagicMock() self.mock_convert_crm_csv_data_process = MagicMock() self.mock_backup_crm_csv_data_process = MagicMock()