From 9012769e1f54a9e4033232c37f2b3bb0e95e4664 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 13:11:58 +0900 Subject: [PATCH 01/18] =?UTF-8?q?feat:=20=E3=82=B3=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=A9=E3=83=BC=E3=81=AE=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E8=BF=BD=E5=8A=A0=E3=80=82=E3=82=B3=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=A9=E3=83=BC=E3=81=A7exit()=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86=E3=81=A8=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E5=81=B4=E3=81=A7=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E3=81=A8=E3=81=97=E3=81=A6=E6=89=B1=E3=82=8F=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=81=A8=E3=81=84=E3=81=91=E3=81=AA=E3=81=8F=E3=81=AA?= =?UTF-8?q?=E3=82=8B=E3=81=9F=E3=82=81=E3=80=81=E3=82=A8=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AA=E3=83=BC=E3=83=9D=E3=82=A4=E3=83=B3=E3=83=88=E5=81=B4?= =?UTF-8?q?=E3=81=A7=E5=88=B6=E5=BE=A1=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/main.py | 2 +- ecs/crm-datafetch/src/config/objects.py | 4 +- ecs/crm-datafetch/src/controller.py | 9 +- .../src/prepare_data_fetch_process.py | 2 +- ecs/crm-datafetch/tests/test_controller.py | 82 +++++++++++++++++++ 5 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 ecs/crm-datafetch/tests/test_controller.py diff --git a/ecs/crm-datafetch/main.py b/ecs/crm-datafetch/main.py index dcae9825..1d6f0ab9 100644 --- a/ecs/crm-datafetch/main.py +++ b/ecs/crm-datafetch/main.py @@ -2,4 +2,4 @@ from src.controller import controller """CRMデータ取得処理のエントリーポイント""" if __name__ == '__main__': - controller() + exit(controller()) diff --git a/ecs/crm-datafetch/src/config/objects.py b/ecs/crm-datafetch/src/config/objects.py index 41ca753b..23d00f5c 100644 --- a/ecs/crm-datafetch/src/config/objects.py +++ b/ecs/crm-datafetch/src/config/objects.py @@ -22,7 +22,7 @@ class FetchTargetObjects(): def __init__(self, object_info_file_dict) -> None: self.__objects = object_info_file_dict self.__dict_checker = DictChecker(self.__objects) - self.validate() + self.__validate() self.__i = 0 def __iter__(self): @@ -35,7 +35,7 @@ class FetchTargetObjects(): self.__i += 1 return value - def validate(self) -> None: + def __validate(self) -> None: self.__dict_checker.assert_key_exist(OBJECTS_KEY) self.__dict_checker.assert_data_type(OBJECTS_KEY, OBJECTS_TYPE) diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index 3d0537b4..f289c592 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -48,19 +48,16 @@ def controller() -> None: else: logger.info('I-CTRL-19 すべてのデータの取得に成功しました') - # ⑦ CRMデータ取得処理終了ログを出力する - logger.info('I-CTRL-20 CRMデータ取得処理を終了します') - - return exit(0) + return 0 except MeDaCaCRMDataFetchException as e: logger.error(f'E-ERR-01 [{e.func_name}]でエラーが発生したため、処理を終了します') logger.exception(f'{e.error_id} {e}') - return exit(0) + return 0 except Exception as e: logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e) - return exit(0) + return 0 def fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: ExecuteDateTime, process_result: dict): diff --git a/ecs/crm-datafetch/src/prepare_data_fetch_process.py b/ecs/crm-datafetch/src/prepare_data_fetch_process.py index 3488c71f..03427265 100644 --- a/ecs/crm-datafetch/src/prepare_data_fetch_process.py +++ b/ecs/crm-datafetch/src/prepare_data_fetch_process.py @@ -79,4 +79,4 @@ def prepare_data_fetch_process(): logger.info('I-PRE-09 データ取得準備処理を終了します') # ⑧ 次の処理へ移行する - return(fetch_target_objects, execute_datetime, process_result) + return (fetch_target_objects, execute_datetime, process_result) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py new file mode 100644 index 00000000..b75eec23 --- /dev/null +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -0,0 +1,82 @@ +from unittest.mock import MagicMock, patch + +from src import controller +from src.config.objects import (FetchTargetObjects, LastFetchDatetime, + TargetObject) +from src.util.execute_datetime import ExecuteDateTime + + +class TestController: + def test_controller_call_all_processes(self, s3_client, monkeypatch): + """ + Cases: + コントローラー処理からすべてのプロセスが呼ばれること + Arranges: + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - データ取得準備処理が1回のみ実行されること + - オブジェクト情報形式チェック処理が複数回実行されること + - データ取得期間設定処理が複数回実行されること + - CRMデータ取得処理が複数回実行されること + - CRM電文データバックアップ処理が複数回実行されること + - CSV変換処理が複数回実行されること + - CSVバックアップ処理が複数回実行されること + - CSVアップロード処理が複数回実行されること + - 前回取得日次ファイル更新処理が複数回実行されること + - 取得処理実施結果アップロード処理が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() + mock_target_objects = FetchTargetObjects({ + 'objects': [ + { + 'object_name': 'Account' + }, + { + 'object_name': 'Contact' + }, + { + 'object_name': 'Call2_vod__c' + } + ] + }) + mock_target_object = TargetObject({'object_name': 'Account'}, mock_execute_datetime) + 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(return_value=mock_target_object) + 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): + controller.controller() + + mock_prepare_data_fetch_process.assert_called_once() + assert mock_check_object_info_process.call_count == 3 + assert mock_set_datetime_period_process.call_count == 3 + assert mock_fetch_crm_data_process.call_count == 3 + assert mock_backup_crm_data_process.call_count == 3 + assert mock_convert_crm_csv_data_process.call_count == 3 + assert mock_backup_crm_csv_data_process.call_count == 3 + 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() From 0a00e58cb585a828b63afbe4b857c51b70e53038 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 13:11:58 +0900 Subject: [PATCH 02/18] =?UTF-8?q?feat:=20=E5=86=85=E9=83=A8=E9=96=A2?= =?UTF-8?q?=E6=95=B0=E3=81=AE=E9=A0=AD=E3=81=AB=5F=E3=82=92=E4=BB=98?= =?UTF-8?q?=E3=81=91=E3=81=9F(=E3=83=97=E3=83=A9=E3=82=A4=E3=83=99?= =?UTF-8?q?=E3=83=BC=E3=83=88=E5=8C=96)=E3=80=82=E7=B5=82=E4=BA=86?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=81=AFfinally=E3=81=A7=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E3=80=82=E5=87=A6=E7=90=86=E7=B5=90=E6=9E=9C=E3=81=8C0?= =?UTF-8?q?=E4=BB=B6=E3=81=AE=E5=A0=B4=E5=90=88=E3=80=81=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=83=BC=E3=83=89=E3=81=9B=E3=81=9A=E3=81=AB?= =?UTF-8?q?=E7=B5=82=E4=BA=86=E3=81=95=E3=81=9B=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/src/controller.py | 37 ++++++++++++++++----- ecs/crm-datafetch/tests/test_controller.py | 38 +++++++++++++++++++++- 2 files changed, 66 insertions(+), 9 deletions(-) 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 From e00f336e216aef20458f7b94de4add97e5cce888 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 13:11:58 +0900 Subject: [PATCH 03/18] =?UTF-8?q?feat:=20=E5=85=A8=E5=91=BC=E3=81=B3?= =?UTF-8?q?=E5=87=BA=E3=81=97=E3=81=AE=E3=83=AD=E3=82=B0=E6=A4=9C=E6=9F=BB?= =?UTF-8?q?=E3=82=92=E8=A1=8C=E3=81=86=E3=81=9F=E3=82=81=E3=80=81=E3=82=B3?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=83=AD=E3=83=BC=E3=83=AB=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E5=85=B1=E9=80=9A=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 182 +++++++++++++-------- 1 file changed, 114 insertions(+), 68 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index b5cfbcb6..4500a845 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,5 +1,7 @@ +import logging from unittest.mock import MagicMock, patch +import pytest from src import controller from src.config.objects import (FetchTargetObjects, LastFetchDatetime, TargetObject) @@ -7,80 +9,121 @@ from src.util.execute_datetime import ExecuteDateTime class TestController: - def test_controller_call_all_processes(self, s3_client, monkeypatch): + + @pytest.fixture() + def call_all_processes(self, s3_client, monkeypatch, caplog): + """ + コントローラー処理内ですべてのプロセス関数が呼ばれることのテストで使用するフィクスチャ + 各種プロセス関数をモック化し、正常終了させるように動く + + Yields: + dict: プロセス関数呼び出し後のモックの辞書 + """ + def _func(): + 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() + mock_target_objects = FetchTargetObjects({ + 'objects': [ + { + 'object_name': 'Account' + }, + { + 'object_name': 'Contact' + }, + { + 'object_name': 'Call2_vod__c' + } + ] + }) + mock_target_object = TargetObject({'object_name': 'Account'}, mock_execute_datetime) + 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(return_value=mock_target_object) + 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() + should_call_processes = { + 'prepare_data_fetch_process': mock_prepare_data_fetch_process, + 'check_object_info_process': mock_check_object_info_process, + 'set_datetime_period_process': mock_set_datetime_period_process, + 'fetch_crm_data_process': mock_fetch_crm_data_process, + 'backup_crm_data_process': mock_backup_crm_data_process, + 'convert_crm_csv_data_process': mock_convert_crm_csv_data_process, + 'backup_crm_csv_data_process': mock_backup_crm_csv_data_process, + 'copy_crm_csv_data_process': mock_copy_crm_csv_data_process, + 'upload_last_fetch_datetime_process': mock_upload_last_fetch_datetime_process, + 'upload_result_data_process': mock_upload_result_data_process + } + 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() + + return should_call_processes + + yield _func + + def test_controller_call_all_processes(self, call_all_processes): """ Cases: コントローラー処理からすべてのプロセスが呼ばれること Arranges: - - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + - call_all_processesフィクスチャで、コントローラー処理を実行しておく Expects: - - データ取得準備処理が1回のみ実行されること - - オブジェクト情報形式チェック処理が複数回実行されること - - データ取得期間設定処理が複数回実行されること - - CRMデータ取得処理が複数回実行されること - - CRM電文データバックアップ処理が複数回実行されること - - CSV変換処理が複数回実行されること - - CSVバックアップ処理が複数回実行されること - - CSVアップロード処理が複数回実行されること - - 前回取得日次ファイル更新処理が複数回実行されること - - 取得処理実施結果アップロード処理が1回のみ実行されること + - データ取得準備処理が1回のみ実行される + - オブジェクト情報形式チェック処理が複数回実行される + - データ取得期間設定処理が複数回実行される + - CRMデータ取得処理が複数回実行される + - CRM電文データバックアップ処理が複数回実行される + - CSV変換処理が複数回実行される + - CSVバックアップ処理が複数回実行される + - CSVアップロード処理が複数回実行される + - 前回取得日時ファイル更新処理が複数回実行される + - 取得処理実施結果アップロード処理が1回のみ実行される """ - 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() - mock_target_objects = FetchTargetObjects({ - 'objects': [ - { - 'object_name': 'Account' - }, - { - 'object_name': 'Contact' - }, - { - 'object_name': 'Call2_vod__c' - } - ] - }) - mock_target_object = TargetObject({'object_name': 'Account'}, mock_execute_datetime) - 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(return_value=mock_target_object) - 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): - controller.controller() + processes = call_all_processes() + processes['prepare_data_fetch_process'].assert_called_once(), 'データ取得準備処理が1回のみ実行されること' + assert processes['check_object_info_process'].call_count == 3, 'オブジェクト情報形式チェック処理が複数回実行されること' + assert processes['set_datetime_period_process'].call_count == 3, 'データ取得期間設定処理が複数回実行されること' + assert processes['fetch_crm_data_process'].call_count == 3, 'CRMデータ取得処理が複数回実行されること' + assert processes['backup_crm_data_process'].call_count == 3, 'CRM電文データバックアップ処理が複数回実行されること' + assert processes['convert_crm_csv_data_process'].call_count == 3, 'CSV変換処理が複数回実行されること' + assert processes['backup_crm_csv_data_process'].call_count == 3, 'CSVバックアップ処理が複数回実行されること' + assert processes['copy_crm_csv_data_process'].call_count == 3, 'CSVアップロード処理が複数回実行されること' + assert processes['upload_last_fetch_datetime_process'].call_count == 3, '前回取得日次ファイル更新処理が複数回実行されること' + processes['upload_result_data_process'].assert_called_once(), '取得処理実施結果アップロード処理が1回のみ実行されること' - mock_prepare_data_fetch_process.assert_called_once() - assert mock_check_object_info_process.call_count == 3 - assert mock_set_datetime_period_process.call_count == 3 - assert mock_fetch_crm_data_process.call_count == 3 - assert mock_backup_crm_data_process.call_count == 3 - assert mock_convert_crm_csv_data_process.call_count == 3 - assert mock_backup_crm_csv_data_process.call_count == 3 - 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_print_normal_logs(self, call_all_processes, caplog): + """ + Cases: + コントローラー処理の正常系ログがすべての出力されていること + Arranges: + - call_all_processesフィクスチャで、コントローラー処理を実行しておく + Expects: + - コントローラー処理の正常系ログがすべて出力されている + """ + call_all_processes() + # シングルトンなロガーを引き回しているので、rootロガーになる + assert ('root', logging.INFO, 'I-CTRL-01 CRMデータ取得処理を開始します') in caplog.record_tuples - def test_controller_do_not_call_upload_process_result_process(self, s3_client, monkeypatch): + def test_controller_do_not_call_upload_process_result_process(self, s3_client, monkeypatch, caplog): """ Cases: 処理対象オブジェクトが0件の場合、取得処理実施結果アップロード処理が実行されないこと @@ -90,6 +133,7 @@ class TestController: Expects: - データ取得準備処理が1回のみ実行されること - 取得処理実施結果アップロード処理が実行されないこと + - 処理対象が存在しない旨を示すログメッセージが出力されていること """ mock_execute_datetime = ExecuteDateTime() mock_prepare_data_fetch_process = MagicMock(return_value=([], mock_execute_datetime, {})) @@ -114,5 +158,7 @@ class TestController: 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 + mock_prepare_data_fetch_process.assert_called_once(), 'データ取得準備処理が1回のみ実行されること' + mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと' + # シングルトンなロガーを引き回しているので、rootロガーになる + assert ('root', logging.INFO, 'I-CTRL-21 処理対象のデータが存在しませんでした') in caplog.record_tuples, '処理対象が存在しない旨を示すログメッセージが出力されていること' From ceba91e33a4ce1c982fdf08696e1bd59f2246064 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 13:11:58 +0900 Subject: [PATCH 04/18] =?UTF-8?q?style:=20=E3=82=B3=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=A9=E3=83=BC=E2=86=92=E3=82=B3=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=83=AD=E3=83=BC=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 4500a845..6e47ba43 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -13,7 +13,7 @@ class TestController: @pytest.fixture() def call_all_processes(self, s3_client, monkeypatch, caplog): """ - コントローラー処理内ですべてのプロセス関数が呼ばれることのテストで使用するフィクスチャ + コントロール処理内ですべてのプロセス関数が呼ばれることのテストで使用するフィクスチャ 各種プロセス関数をモック化し、正常終了させるように動く Yields: @@ -83,9 +83,9 @@ class TestController: def test_controller_call_all_processes(self, call_all_processes): """ Cases: - コントローラー処理からすべてのプロセスが呼ばれること + コントロール処理からすべてのプロセスが呼ばれること Arranges: - - call_all_processesフィクスチャで、コントローラー処理を実行しておく + - call_all_processesフィクスチャで、コントロール処理を実行しておく Expects: - データ取得準備処理が1回のみ実行される - オブジェクト情報形式チェック処理が複数回実行される @@ -113,11 +113,11 @@ class TestController: def test_controller_print_normal_logs(self, call_all_processes, caplog): """ Cases: - コントローラー処理の正常系ログがすべての出力されていること + コントロール処理の正常系ログがすべての出力されていること Arranges: - - call_all_processesフィクスチャで、コントローラー処理を実行しておく + - call_all_processesフィクスチャで、コントロール処理を実行しておく Expects: - - コントローラー処理の正常系ログがすべて出力されている + - コントロール処理の正常系ログがすべて出力されている """ call_all_processes() # シングルトンなロガーを引き回しているので、rootロガーになる From b8fd8a477e68fcbe04fc2cde9a9c2222250a3edd Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 13:53:58 +0900 Subject: [PATCH 05/18] =?UTF-8?q?feat:=20=E3=83=AD=E3=82=B0=E3=83=A1?= =?UTF-8?q?=E3=83=83=E3=82=BB=E3=83=BC=E3=82=B8=E3=81=AE=E7=A2=BA=E8=AA=8D?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=82=B9=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 72 ++++++++++++++----- .../tests/test_utils/log_message.py | 7 ++ 2 files changed, 61 insertions(+), 18 deletions(-) create mode 100644 ecs/crm-datafetch/tests/test_utils/log_message.py diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 6e47ba43..6b91abb2 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,4 +1,3 @@ -import logging from unittest.mock import MagicMock, patch import pytest @@ -7,6 +6,31 @@ from src.config.objects import (FetchTargetObjects, LastFetchDatetime, TargetObject) from src.util.execute_datetime import ExecuteDateTime +from .test_utils.log_message import generate_log_message_tuple + +TEST_OBJECT_INFO_LIST = { + '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' + } + ] +} + +EXPECT_PROCESS_RESULT = { + 'Account': 'success', + 'Contact': 'success', + 'Call2_vod__c': 'success' +} + class TestController: @@ -24,26 +48,17 @@ class TestController: monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) mock_execute_datetime = ExecuteDateTime() - mock_target_objects = FetchTargetObjects({ - 'objects': [ - { - 'object_name': 'Account' - }, - { - 'object_name': 'Contact' - }, - { - 'object_name': 'Call2_vod__c' - } - ] - }) - mock_target_object = TargetObject({'object_name': 'Account'}, mock_execute_datetime) + mock_target_objects = FetchTargetObjects(TEST_OBJECT_INFO_LIST) + mock_target_object_first = TargetObject(TEST_OBJECT_INFO_LIST['objects'][0], mock_execute_datetime) + mock_target_object_second = TargetObject(TEST_OBJECT_INFO_LIST['objects'][1], mock_execute_datetime) + mock_target_object_third = TargetObject(TEST_OBJECT_INFO_LIST['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(return_value=mock_target_object) + 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() @@ -121,7 +136,27 @@ class TestController: """ call_all_processes() # シングルトンなロガーを引き回しているので、rootロガーになる - assert ('root', logging.INFO, 'I-CTRL-01 CRMデータ取得処理を開始します') in caplog.record_tuples + assert generate_log_message_tuple(log_message='I-CTRL-01 CRMデータ取得処理を開始します') in caplog.record_tuples + assert generate_log_message_tuple(log_message='I-CTRL-02 データ取得準備処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message='I-CTRL-03 取得対象オブジェクトのループ処理開始') in caplog.record_tuples + for obj in TEST_OBJECT_INFO_LIST['objects']: + object_name = obj['object_name'] + upload_file_name = obj['upload_file_name'] + assert generate_log_message_tuple(log_message='I-CTRL-05 オブジェクト情報形式チェック処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-06 [{object_name}]のデータ取得を開始します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-08 [{object_name}]のデータ取得期間設定処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-09 [{object_name}]のデータ取得処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-10 [{object_name}] の出力ファイル名は [{upload_file_name}] となります') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-11 [{object_name}] CRM電文データバックアップ処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-12 [{object_name}] CSV変換処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-13 [{object_name}] CSVデータバックアップ処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-14 [{object_name}] CSVデータアップロード処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-15 [{object_name}] 前回取得日時ファイル更新処理呼び出し') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-16 [{object_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_message=f'I-CTRL-18 CRM_取得処理実施結果ファイルアップロード処理開始') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-19 すべてのデータの取得に成功しました') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples def test_controller_do_not_call_upload_process_result_process(self, s3_client, monkeypatch, caplog): """ @@ -161,4 +196,5 @@ class TestController: mock_prepare_data_fetch_process.assert_called_once(), 'データ取得準備処理が1回のみ実行されること' mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと' # シングルトンなロガーを引き回しているので、rootロガーになる - assert ('root', logging.INFO, 'I-CTRL-21 処理対象のデータが存在しませんでした') in caplog.record_tuples, '処理対象が存在しない旨を示すログメッセージが出力されていること' + 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 diff --git a/ecs/crm-datafetch/tests/test_utils/log_message.py b/ecs/crm-datafetch/tests/test_utils/log_message.py new file mode 100644 index 00000000..25ce6e11 --- /dev/null +++ b/ecs/crm-datafetch/tests/test_utils/log_message.py @@ -0,0 +1,7 @@ +"""ログメッセージに関連するテストヘルパー""" + +import logging + + +def generate_log_message_tuple(logger_name='root', log_level=logging.INFO, log_message=''): + return (logger_name, log_level, log_message) From 6ad684e38bbf722d723fbc15e9c9332c1f91177f Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 14:51:04 +0900 Subject: [PATCH 06/18] =?UTF-8?q?feat:=E5=87=A6=E7=90=86=E3=82=B9=E3=82=AD?= =?UTF-8?q?=E3=83=83=E3=83=97=E6=99=82=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 135 ++++++++++++++++++++- 1 file changed, 129 insertions(+), 6 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 6b91abb2..c1435a7d 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,3 +1,4 @@ +import copy from unittest.mock import MagicMock, patch import pytest @@ -33,7 +34,6 @@ EXPECT_PROCESS_RESULT = { class TestController: - @pytest.fixture() def call_all_processes(self, s3_client, monkeypatch, caplog): """ @@ -95,7 +95,7 @@ class TestController: yield _func - def test_controller_call_all_processes(self, call_all_processes): + def test_call_all_processes(self, call_all_processes): """ Cases: コントロール処理からすべてのプロセスが呼ばれること @@ -125,7 +125,7 @@ class TestController: assert processes['upload_last_fetch_datetime_process'].call_count == 3, '前回取得日次ファイル更新処理が複数回実行されること' processes['upload_result_data_process'].assert_called_once(), '取得処理実施結果アップロード処理が1回のみ実行されること' - def test_controller_print_normal_logs(self, call_all_processes, caplog): + def test_print_normal_logs(self, call_all_processes, caplog): """ Cases: コントロール処理の正常系ログがすべての出力されていること @@ -135,7 +135,7 @@ class TestController: - コントロール処理の正常系ログがすべて出力されている """ call_all_processes() - # シングルトンなロガーを引き回しているので、rootロガーになる + assert generate_log_message_tuple(log_message='I-CTRL-01 CRMデータ取得処理を開始します') in caplog.record_tuples assert generate_log_message_tuple(log_message='I-CTRL-02 データ取得準備処理呼び出し') in caplog.record_tuples assert generate_log_message_tuple(log_message='I-CTRL-03 取得対象オブジェクトのループ処理開始') in caplog.record_tuples @@ -158,7 +158,7 @@ class TestController: assert generate_log_message_tuple(log_message=f'I-CTRL-19 すべてのデータの取得に成功しました') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples - def test_controller_do_not_call_upload_process_result_process(self, s3_client, monkeypatch, caplog): + def test_do_not_call_upload_process_result_process(self, s3_client, monkeypatch, caplog): """ Cases: 処理対象オブジェクトが0件の場合、取得処理実施結果アップロード処理が実行されないこと @@ -193,8 +193,131 @@ class TestController: patch('src.controller.upload_result_data_process', mock_upload_result_data_process): controller.controller() + # 実行回数の確認 mock_prepare_data_fetch_process.assert_called_once(), 'データ取得準備処理が1回のみ実行されること' mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと' - # シングルトンなロガーを引き回しているので、rootロガーになる + + # ログ出力の確認 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, s3_client, monkeypatch, caplog): + """ + Cases: + オブジェクト情報.is_skipがTrueの場合、CSVアップロード処理が実行されないこと + Arranges: + - データ取得準備処理で返される取得対象オブジェクト情報のis_skipをTrueにする + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - オブジェクト情報形式チェック処理以降のプロセスが実行されないこと + - 処理をスキップする旨を示すログメッセージが出力されていること + """ + mock_check_object_info = copy.deepcopy(TEST_OBJECT_INFO_LIST)['objects'][0] + mock_check_object_info['is_skip'] = True + monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) + mock_execute_datetime = ExecuteDateTime() + mock_return_values = [TargetObject(mock_check_object_info, mock_execute_datetime)] + mock_prepare_data_fetch_process = MagicMock(return_value=([mock_check_object_info], mock_execute_datetime, {})) + mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + 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_check_object_info_process.assert_called_once() + # オブジェクト情報形式チェック処理以降のプロセスが実行されないこと + mock_set_datetime_period_process.call_count == 0 + mock_fetch_crm_data_process.call_count == 0 + mock_backup_crm_data_process.call_count == 0 + mock_convert_crm_csv_data_process.call_count == 0 + mock_backup_crm_csv_data_process.call_count == 0 + mock_copy_crm_csv_data_process.call_count == 0 + mock_upload_last_fetch_datetime_process.call_count == 0 + mock_upload_result_data_process.call_count == 0 + + # ログ出力の確認 + 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, s3_client, monkeypatch, caplog): + """ + Cases: + オブジェクト情報.is_skipがTrueのものが含まれる場合、CSVアップロード処理が実行されないこと + Arranges: + - データ取得準備処理で返される取得対象オブジェクト情報のうち、2つ目をis_skipをTrueにする + - 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する + Expects: + - オブジェクト情報形式チェック処理が2回実行されること + - 処理をスキップする旨を示すログメッセージが出力されていること + - オブジェクト情報.is_skipがFalseのものはCSVアップロード処理のログメッセージが出力されていること + """ + mock_check_object_infos = copy.deepcopy(TEST_OBJECT_INFO_LIST) + mock_check_object_infos['objects'][1]['is_skip'] = True + monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) + monkeypatch.setattr(TargetObject, '_TargetObject__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), + ] + mock_prepare_data_fetch_process = MagicMock(return_value=(FetchTargetObjects(mock_check_object_infos), mock_execute_datetime, {})) + mock_check_object_info_process = MagicMock(side_effect=mock_return_values) + 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_check_object_info_process.call_count == 3 + # オブジェクト情報形式チェック処理以降のプロセスが実行されないこと + mock_set_datetime_period_process.call_count == 2 + mock_fetch_crm_data_process.call_count == 2 + mock_backup_crm_data_process.call_count == 2 + mock_convert_crm_csv_data_process.call_count == 2 + mock_backup_crm_csv_data_process.call_count == 2 + mock_copy_crm_csv_data_process.call_count == 2 + mock_upload_last_fetch_datetime_process.call_count == 2 + mock_upload_result_data_process.call_count == 2 + + # ログ出力の確認 + assert generate_log_message_tuple( + log_message='I-CTRL-14 [Account] CSVデータアップロード処理呼び出し') in caplog.record_tuples, 'オブジェクト情報.is_skipがFalseのものはCSVアップロード処理のログメッセージが出力されていること' + assert generate_log_message_tuple( + log_message='I-CTRL-07 [Contact]のデータ取得処理をスキップします') in caplog.record_tuples, '処理をスキップする旨を示すログメッセージが出力されていること' + assert generate_log_message_tuple( + log_message='I-CTRL-14 [Call2_vod__c] CSVデータアップロード処理呼び出し' + ) in caplog.record_tuples, 'オブジェクト情報.is_skipがFalseのものはCSVアップロード処理のログメッセージが出力されていること' + assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples From 9b941c1cb328f4e440ea5902e5d75ae3a3919f0e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 15:58:45 +0900 Subject: [PATCH 07/18] =?UTF-8?q?feat:=20=E4=BE=8B=E5=A4=96=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E8=BF=BD=E5=8A=A0=E3=80=82=E4=BE=8B=E5=A4=96?= =?UTF-8?q?=E3=82=92=E9=80=81=E5=87=BA=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=82=B3=E3=83=B3=E3=83=88=E3=83=AD=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E5=87=A6=E7=90=86=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/main.py | 5 +- ecs/crm-datafetch/src/controller.py | 4 +- ecs/crm-datafetch/tests/test_controller.py | 56 ++++++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/ecs/crm-datafetch/main.py b/ecs/crm-datafetch/main.py index 1d6f0ab9..525e2367 100644 --- a/ecs/crm-datafetch/main.py +++ b/ecs/crm-datafetch/main.py @@ -2,4 +2,7 @@ from src.controller import controller """CRMデータ取得処理のエントリーポイント""" if __name__ == '__main__': - exit(controller()) + try: + exit(controller()) + except Exception: + exit(0) diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index 5309fa83..165c8b7e 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -55,11 +55,11 @@ def controller() -> None: except MeDaCaCRMDataFetchException as e: logger.error(f'E-ERR-01 [{e.func_name}]でエラーが発生したため、処理を終了します') logger.exception(f'{e.error_id} {e}') - return 0 + raise e except Exception as e: logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e) - return 0 + raise e finally: # ⑦ CRMデータ取得処理終了ログを出力する diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index c1435a7d..2861a4d0 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,10 +1,13 @@ import copy +import logging from unittest.mock import MagicMock, patch import pytest 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.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple @@ -33,6 +36,10 @@ EXPECT_PROCESS_RESULT = { } +class ForTestControllerException(MeDaCaCRMDataFetchException): + pass + + class TestController: @pytest.fixture() def call_all_processes(self, s3_client, monkeypatch, caplog): @@ -321,3 +328,52 @@ class TestController: log_message='I-CTRL-14 [Call2_vod__c] CSVデータアップロード処理呼び出し' ) 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): + """ + Cases: + データ取得準備処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - データ取得準備処理でシステム例外が発生するようにする + Expects: + - データ取得準備処理で例外が発生すること + - データ取得準備処理で発生した例外のログメッセージが出力されていること + """ + # mock_check_object_infos = copy.deepcopy(TEST_OBJECT_INFO_LIST) + # mock_check_object_infos['objects'][1]['is_skip'] = True + # monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) + # monkeypatch.setattr(TargetObject, '_TargetObject__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() + # 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.called is False + assert generate_log_message_tuple( + log_level=logging.ERROR, + log_message=f'E-ERR-01 [{PRE_JP_NAME}]でエラーが発生したため、処理を終了します'), 'データ取得準備処理で発生した例外のログメッセージが出力されていること' From d56a6c079d222b995bf05c4911c3946bb1e990d7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 16:47:06 +0900 Subject: [PATCH 08/18] =?UTF-8?q?refactor:=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E3=81=A8=E6=9C=9F=E5=BE=85=E5=80=A4?= =?UTF-8?q?=E3=81=AF=E3=81=AA=E3=82=8B=E3=81=B9=E3=81=8F=E3=83=99=E3=82=BF?= =?UTF-8?q?=E6=9B=B8=E3=81=8D=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 81 ++++++++++++++-------- 1 file changed, 51 insertions(+), 30 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 2861a4d0..f6da35e3 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,4 +1,3 @@ -import copy import logging from unittest.mock import MagicMock, patch @@ -12,23 +11,6 @@ from src.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple -TEST_OBJECT_INFO_LIST = { - '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' - } - ] -} - EXPECT_PROCESS_RESULT = { 'Account': 'success', 'Contact': 'success', @@ -55,10 +37,26 @@ class TestController: monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) mock_execute_datetime = ExecuteDateTime() - mock_target_objects = FetchTargetObjects(TEST_OBJECT_INFO_LIST) - mock_target_object_first = TargetObject(TEST_OBJECT_INFO_LIST['objects'][0], mock_execute_datetime) - mock_target_object_second = TargetObject(TEST_OBJECT_INFO_LIST['objects'][1], mock_execute_datetime) - mock_target_object_third = TargetObject(TEST_OBJECT_INFO_LIST['objects'][2], mock_execute_datetime) + 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', @@ -146,9 +144,9 @@ class TestController: assert generate_log_message_tuple(log_message='I-CTRL-01 CRMデータ取得処理を開始します') in caplog.record_tuples assert generate_log_message_tuple(log_message='I-CTRL-02 データ取得準備処理呼び出し') in caplog.record_tuples assert generate_log_message_tuple(log_message='I-CTRL-03 取得対象オブジェクトのループ処理開始') in caplog.record_tuples - for obj in TEST_OBJECT_INFO_LIST['objects']: - object_name = obj['object_name'] - upload_file_name = obj['upload_file_name'] + for name in ['Account', 'Contact', 'Call2_vod__c']: + object_name = name + upload_file_name = f'{name}_YYYYMMDDHHMMSS' assert generate_log_message_tuple(log_message='I-CTRL-05 オブジェクト情報形式チェック処理呼び出し') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-06 [{object_name}]のデータ取得を開始します') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-08 [{object_name}]のデータ取得期間設定処理呼び出し') in caplog.record_tuples @@ -160,7 +158,13 @@ class TestController: assert generate_log_message_tuple(log_message=f'I-CTRL-14 [{object_name}] CSVデータアップロード処理呼び出し') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-15 [{object_name}] 前回取得日時ファイル更新処理呼び出し') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-16 [{object_name}] 処理正常終了') in caplog.record_tuples - assert generate_log_message_tuple(log_message=f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{EXPECT_PROCESS_RESULT}]') in caplog.record_tuples + + expect_process_result = { + 'Account': 'success', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-CTRL-17 すべてのオブジェクトの処理が終了しました 実行結果:[{expect_process_result}]') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-18 CRM_取得処理実施結果ファイルアップロード処理開始') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-19 すべてのデータの取得に成功しました') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-CTRL-20 CRMデータ取得処理を終了します') in caplog.record_tuples @@ -219,8 +223,11 @@ class TestController: - オブジェクト情報形式チェック処理以降のプロセスが実行されないこと - 処理をスキップする旨を示すログメッセージが出力されていること """ - mock_check_object_info = copy.deepcopy(TEST_OBJECT_INFO_LIST)['objects'][0] - mock_check_object_info['is_skip'] = True + mock_check_object_info = { + 'object_name': 'Account', + 'is_skip': True + } + monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) mock_execute_datetime = ExecuteDateTime() mock_return_values = [TargetObject(mock_check_object_info, mock_execute_datetime)] @@ -274,8 +281,22 @@ class TestController: - 処理をスキップする旨を示すログメッセージが出力されていること - オブジェクト情報.is_skipがFalseのものはCSVアップロード処理のログメッセージが出力されていること """ - mock_check_object_infos = copy.deepcopy(TEST_OBJECT_INFO_LIST) - mock_check_object_infos['objects'][1]['is_skip'] = True + mock_check_object_infos = { + 'objects': [ + { + 'object_name': 'Account', + 'is_skip': False + }, + { + 'object_name': 'Contact', + 'is_skip': True + }, + { + 'object_name': 'Call2_vod__c', + 'is_skip': False + } + ] + } monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) mock_execute_datetime = ExecuteDateTime() From 255297036312c42f75cebc00d06c7a5456505d45 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 18:38:34 +0900 Subject: [PATCH 09/18] =?UTF-8?q?feat:=20=E3=83=AB=E3=83=BC=E3=83=97?= =?UTF-8?q?=E4=B8=AD=E3=81=AB=E7=99=BA=E7=94=9F=E3=81=99=E3=82=8B=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=EF=BC=88=E3=83=81=E3=82=A7=E3=83=83=E3=82=AF=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=83=BB=E6=9C=9F=E9=96=93=E8=A8=AD=E5=AE=9A=E5=87=A6?= =?UTF-8?q?=E7=90=86=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 204 +++++++++++++++++++-- 1 file changed, 189 insertions(+), 15 deletions(-) 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 From f18aeb8d258392c10989afc10cb1b258db601d29 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 19:41:42 +0900 Subject: [PATCH 10/18] =?UTF-8?q?feat:=E3=83=AB=E3=83=BC=E3=83=97=E5=87=A6?= =?UTF-8?q?=E7=90=86=E4=B8=AD=E3=81=AE=E4=BE=8B=E5=A4=96=E3=83=86=E3=82=B9?= =?UTF-8?q?=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 513 ++++++++++++++++++--- 1 file changed, 461 insertions(+), 52 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index b0938eee..43dfed94 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -6,7 +6,9 @@ from src import controller from src.config.objects import (FetchTargetObjects, LastFetchDatetime, TargetObject) from src.error.exceptions import MeDaCaCRMDataFetchException -from src.system_var.constants import CHK_JP_NAME, DATE_JP_NAME, PRE_JP_NAME +from src.system_var.constants import (CHK_JP_NAME, CONV_JP_NAME, CSVBK_JP_NAME, + DATE_JP_NAME, FETCH_JP_NAME, PRE_JP_NAME, + RESBK_JP_NAME, UPD_JP_NAME, UPLD_JP_NAME) from src.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple @@ -360,60 +362,11 @@ class TestController: - データ取得準備処理で例外が発生すること - データ取得準備処理で発生した例外のログメッセージが出力されていること """ - # 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() - # 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),\ - # 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.called is False @@ -486,6 +439,7 @@ class TestController: # with pytest.raises(MeDaCaCRMDataFetchException): controller.controller() assert mock_check_object_info_process.call_count == 3 + assert mock_set_datetime_period_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -496,7 +450,7 @@ class TestController: 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): + def test_raise_set_datetime_period_process(self, s3_client, monkeypatch, caplog): """ Cases: データ取得期間設定処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -538,7 +492,6 @@ class TestController: }, 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=[{}]) @@ -563,6 +516,7 @@ class TestController: # with pytest.raises(MeDaCaCRMDataFetchException): controller.controller() assert mock_set_datetime_period_process.call_count == 3 + assert mock_fetch_crm_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -572,3 +526,458 @@ class TestController: 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_fetch_crm_data_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + CRMデータ取得処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - CRMデータ取得処理でシステム例外が発生するようにする + Expects: + - CRMデータ取得処理で例外が発生すること + - CRMデータ取得処理で発生した例外のログメッセージが出力されていること + """ + 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_fetch_crm_data_process = MagicMock(side_effect=[ForTestControllerException( + 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) + 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_fetch_crm_data_process.call_count == 3 + assert mock_backup_crm_data_process.call_count == 2 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{FETCH_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_backup_crm_data_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + CRM電文データバックアップ処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - CRM電文データバックアップ処理でシステム例外が発生するようにする + Expects: + - CRM電文データバックアップ処理で例外が発生すること + - CRM電文データバックアップ処理で発生した例外のログメッセージが出力されていること + """ + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + mock_backup_crm_data_process = MagicMock(side_effect=[ForTestControllerException( + 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) + 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_backup_crm_data_process.call_count == 3 + assert mock_convert_crm_csv_data_process.call_count == 2 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{RESBK_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_convert_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + CSV変換処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - CSV変換処理でシステム例外が発生するようにする + Expects: + - CSV変換処理で例外が発生すること + - CSV変換処理で発生した例外のログメッセージが出力されていること + """ + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + mock_backup_crm_data_process = MagicMock() + mock_convert_crm_csv_data_process = MagicMock(side_effect=[ForTestControllerException( + 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) + 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_convert_crm_csv_data_process.call_count == 3 + assert mock_backup_crm_csv_data_process.call_count == 2 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{CONV_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_backup_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + CSVバックアップ処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - CSVバックアップ処理でシステム例外が発生するようにする + Expects: + - CSVバックアップ処理で例外が発生すること + - CSVバックアップ処理で発生した例外のログメッセージが出力されていること + """ + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + mock_backup_crm_data_process = MagicMock() + mock_convert_crm_csv_data_process = MagicMock() + mock_backup_crm_csv_data_process = MagicMock(side_effect=[ForTestControllerException( + 'E-CSVBK-01', CSVBK_JP_NAME, '例外発生'), None, None]) + 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_backup_crm_csv_data_process.call_count == 3 + assert mock_copy_crm_csv_data_process.call_count == 2 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{CSVBK_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_copy_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + CSVアップロード処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - CSVアップロード処理でシステム例外が発生するようにする + Expects: + - CSVアップロード処理で例外が発生すること + - CSVアップロード処理で発生した例外のログメッセージが出力されていること + """ + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + 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(side_effect=[ForTestControllerException( + 'E-UPLD-01', UPLD_JP_NAME, '例外発生'), None, None]) + 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_copy_crm_csv_data_process.call_count == 3 + assert mock_upload_last_fetch_datetime_process.call_count == 2 + expect_process_result = { + 'Account': 'fail', + 'Contact': 'success', + 'Call2_vod__c': 'success' + } + assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{UPLD_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_upload_last_fetch_datetime_process(self, s3_client, monkeypatch, caplog): + """ + Cases: + 前回取得日時ファイル更新処理でシステム例外が発生した場合、エラーで終了すること + Arranges: + - 前回取得日時ファイル更新処理でシステム例外が発生するようにする + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + 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(side_effect=[ForTestControllerException( + 'E-UPD-01', UPD_JP_NAME, '例外発生'), None, None]) + 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_upload_last_fetch_datetime_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] の[{UPD_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 From a9d8a54fe96e41f7347421ceb657bf7ce2c6dd28 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 23:40:26 +0900 Subject: [PATCH 11/18] =?UTF-8?q?feat:=20=E6=BA=96=E5=82=99=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=A7=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E4=BB=A5=E5=A4=96=E3=81=AE=E4=BE=8B=E5=A4=96=E3=81=8C?= =?UTF-8?q?=E7=99=BA=E7=94=9F=E3=81=97=E3=81=9F=E5=A0=B4=E5=90=88=E3=81=AE?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0(parametr?= =?UTF-8?q?ize=E3=83=86=E3=82=B9=E3=83=88)=E3=80=82=E3=83=AD=E3=82=B0?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E6=99=82=E3=81=AB=E3=83=90=E3=82=B0=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92=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 | 2 +- ecs/crm-datafetch/tests/test_controller.py | 44 ++++++++++++++-------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index 165c8b7e..a7a6fe00 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -58,7 +58,7 @@ def controller() -> None: raise e except Exception as e: - logger.exception('E-ERR-02 予期せぬエラーが発生したため、処理を終了します', e) + logger.exception(f'E-ERR-02 予期せぬエラーが発生したため、処理を終了します エラー内容: [{e}]') raise e finally: diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 43dfed94..d9d21112 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -20,8 +20,15 @@ EXPECT_PROCESS_RESULT = { } -class ForTestControllerException(MeDaCaCRMDataFetchException): - pass +class ForTestMeDaCaCRMDataFetchException(MeDaCaCRMDataFetchException): + def __init__(self, error_id: str, func_name: str, message: str) -> None: + super().__init__(error_id, func_name, message) + + +class ForTestException(Exception): + # カスタム例外とインタフェースを合わせるための引数 + def __init__(self, error_id: str, func_name: str, message: str) -> None: + super().__init__(message) class TestController: @@ -352,27 +359,34 @@ 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_prepare_data_fetch_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'E-ERR-01 [{PRE_JP_NAME}]でエラーが発生したため、処理を終了します'), + (ForTestException, 'E-ERR-02 予期せぬエラーが発生したため、処理を終了します エラー内容: [例外発生]') + ]) + def test_raise_prepare_data_fetch_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - データ取得準備処理でシステム例外が発生した場合、エラーで終了すること + 1. データ取得準備処理でシステム例外が発生した場合、エラーで終了すること + 2. データ取得準備処理で想定外の例外が発生した場合、エラーで終了すること Arranges: - データ取得準備処理でシステム例外が発生するようにする Expects: - データ取得準備処理で例外が発生すること - データ取得準備処理で発生した例外のログメッセージが出力されていること """ - expect_exception = ForTestControllerException('E-PRE-01', PRE_JP_NAME, '例外発生') + expect_exception = exception('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): - with pytest.raises(MeDaCaCRMDataFetchException): + with pytest.raises(exception): controller.controller() assert mock_check_object_info_process.called is False assert generate_log_message_tuple( log_level=logging.ERROR, - log_message=f'E-ERR-01 [{PRE_JP_NAME}]でエラーが発生したため、処理を終了します'), 'データ取得準備処理で発生した例外のログメッセージが出力されていること' + log_message=message.format()) in caplog.record_tuples, 'データ取得準備処理で発生した例外のログメッセージが出力されていること' def test_raise_check_object_info_process(self, s3_client, monkeypatch, caplog): """ @@ -406,7 +420,7 @@ class TestController: ] } mock_target_objects = FetchTargetObjects(objects) - mock_target_object_first = ForTestControllerException('E-PRE-01', CHK_JP_NAME, '例外発生') + mock_target_object_first = ForTestMeDaCaCRMDataFetchException('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] @@ -492,7 +506,7 @@ class TestController: }, 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(side_effect=[ForTestControllerException( + mock_set_datetime_period_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( '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() @@ -569,7 +583,7 @@ class TestController: 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(side_effect=[ForTestControllerException( + mock_fetch_crm_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -646,7 +660,7 @@ class TestController: 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(side_effect=[{}, {}, {}]) - mock_backup_crm_data_process = MagicMock(side_effect=[ForTestControllerException( + mock_backup_crm_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) mock_convert_crm_csv_data_process = MagicMock() mock_backup_crm_csv_data_process = MagicMock() @@ -723,7 +737,7 @@ class TestController: mock_set_datetime_period_process = MagicMock(return_value=mock_last_fetch_datetime) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() - mock_convert_crm_csv_data_process = MagicMock(side_effect=[ForTestControllerException( + mock_convert_crm_csv_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) mock_backup_crm_csv_data_process = MagicMock() mock_copy_crm_csv_data_process = MagicMock() @@ -800,7 +814,7 @@ class TestController: mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() - mock_backup_crm_csv_data_process = MagicMock(side_effect=[ForTestControllerException( + mock_backup_crm_csv_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-CSVBK-01', CSVBK_JP_NAME, '例外発生'), None, None]) mock_copy_crm_csv_data_process = MagicMock() mock_upload_last_fetch_datetime_process = MagicMock() @@ -877,7 +891,7 @@ class TestController: 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(side_effect=[ForTestControllerException( + mock_copy_crm_csv_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-UPLD-01', UPLD_JP_NAME, '例外発生'), None, None]) mock_upload_last_fetch_datetime_process = MagicMock() mock_upload_result_data_process = MagicMock() @@ -954,7 +968,7 @@ class TestController: 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(side_effect=[ForTestControllerException( + mock_upload_last_fetch_datetime_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( 'E-UPD-01', UPD_JP_NAME, '例外発生'), None, None]) mock_upload_result_data_process = MagicMock() From 7bd1e72ffdc579c71ba9e4c632b24391c97feb28 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 3 Aug 2022 23:59:20 +0900 Subject: [PATCH 12/18] =?UTF-8?q?feat:=20=E3=83=AB=E3=83=BC=E3=83=97?= =?UTF-8?q?=E4=B8=AD=E3=81=AE=E6=83=B3=E5=AE=9A=E5=A4=96=E3=81=AE=E4=BE=8B?= =?UTF-8?q?=E5=A4=96=E5=87=A6=E7=90=86=E3=82=82=E8=BF=BD=E5=8A=A0=E3=80=82?= =?UTF-8?q?=E3=83=AD=E3=82=B0=E5=87=BA=E5=8A=9B=E6=99=82=E3=81=AB=E3=83=90?= =?UTF-8?q?=E3=82=B0=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/src/controller.py | 2 +- ecs/crm-datafetch/tests/test_controller.py | 149 +++++++++++++++------ 2 files changed, 108 insertions(+), 43 deletions(-) diff --git a/ecs/crm-datafetch/src/controller.py b/ecs/crm-datafetch/src/controller.py index a7a6fe00..dc8f784d 100644 --- a/ecs/crm-datafetch/src/controller.py +++ b/ecs/crm-datafetch/src/controller.py @@ -94,7 +94,7 @@ def _fetch_crm_data(fetch_target_objects: FetchTargetObjects, execute_datetime: except Exception as e: logger.info( - f'I-ERR-04 [{object_info.get(OBJECT_NAME_KEY)}] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します', e, exc_info=True) + f'I-ERR-04 [{object_info.get(OBJECT_NAME_KEY)}] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [{e}]', exc_info=True) continue return process_result diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index d9d21112..c7cf4ebd 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -371,7 +371,8 @@ class TestController: 1. データ取得準備処理でシステム例外が発生した場合、エラーで終了すること 2. データ取得準備処理で想定外の例外が発生した場合、エラーで終了すること Arranges: - - データ取得準備処理でシステム例外が発生するようにする + - パラメータ1:データ取得準備処理でシステム例外が発生するようにする + - パラメータ2:データ取得準備処理で想定外の例外が発生するようにする Expects: - データ取得準備処理で例外が発生すること - データ取得準備処理で発生した例外のログメッセージが出力されていること @@ -386,14 +387,22 @@ class TestController: assert mock_check_object_info_process.called is False assert generate_log_message_tuple( log_level=logging.ERROR, - log_message=message.format()) in caplog.record_tuples, 'データ取得準備処理で発生した例外のログメッセージが出力されていること' + log_message=message) in caplog.record_tuples, 'データ取得準備処理で発生した例外のログメッセージが出力されていること' - def test_raise_check_object_info_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CHK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_check_object_info_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - オブジェクト情報形式チェック処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 1. オブジェクト情報形式チェック処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. オブジェクト情報形式チェック処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - オブジェクト情報形式チェック処理の1回のみでシステム例外が発生するようにする + - パラメータ1:オブジェクト情報形式チェック処理でシステム例外が発生するようにする + - パラメータ2:オブジェクト情報形式チェック処理で想定外の例外が発生するようにする Expects: - オブジェクト情報形式チェック処理で例外が発生する - オブジェクト情報形式チェック処理で発生した例外のログメッセージが出力されている @@ -420,7 +429,7 @@ class TestController: ] } mock_target_objects = FetchTargetObjects(objects) - mock_target_object_first = ForTestMeDaCaCRMDataFetchException('E-PRE-01', CHK_JP_NAME, '例外発生') + mock_target_object_first = exception('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] @@ -459,17 +468,25 @@ class TestController: '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=message) 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_datetime_period_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{DATE_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_set_datetime_period_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - データ取得期間設定処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 1. データ取得期間設定処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. データ取得期間設定処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - データ取得期間設定チェック処理の1回のみでシステム例外が発生するようにする + - パラメータ1:データ取得期間設定処理でシステム例外が発生するようにする + - パラメータ2:データ取得期間設定処理で想定外の例外が発生するようにする Expects: - データ取得期間設定チェック処理で例外が発生する - データ取得期間設定チェック処理で発生した例外のログメッセージが出力されている @@ -506,7 +523,7 @@ class TestController: }, 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(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_set_datetime_period_process = MagicMock(side_effect=[exception( '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() @@ -536,17 +553,25 @@ class TestController: '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=message) 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_fetch_crm_data_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{FETCH_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_fetch_crm_data_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - CRMデータ取得処理でシステム例外が発生した場合、エラーで終了すること + 1. CRMデータ取得処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. CRMデータ取得処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - CRMデータ取得処理でシステム例外が発生するようにする + - パラメータ1:CRMデータ取得処理でシステム例外が発生するようにする + - パラメータ2:CRMデータ取得処理で想定外の例外が発生するようにする Expects: - CRMデータ取得処理で例外が発生すること - CRMデータ取得処理で発生した例外のログメッセージが出力されていること @@ -583,7 +608,7 @@ class TestController: 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(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_fetch_crm_data_process = MagicMock(side_effect=[exception( 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -612,17 +637,25 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{FETCH_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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_backup_crm_data_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{RESBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_backup_crm_data_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - CRM電文データバックアップ処理でシステム例外が発生した場合、エラーで終了すること + 1. CRM電文データバックアップ処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. CRM電文データバックアップ処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - CRM電文データバックアップ処理でシステム例外が発生するようにする + - パラメータ1:CRM電文データバックアップ処理でシステム例外が発生するようにする + - パラメータ2:CRM電文データバックアップ処理で想定外の例外が発生するようにする Expects: - CRM電文データバックアップ処理で例外が発生すること - CRM電文データバックアップ処理で発生した例外のログメッセージが出力されていること @@ -660,7 +693,7 @@ class TestController: 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(side_effect=[{}, {}, {}]) - mock_backup_crm_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_backup_crm_data_process = MagicMock(side_effect=[exception( 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) mock_convert_crm_csv_data_process = MagicMock() mock_backup_crm_csv_data_process = MagicMock() @@ -688,17 +721,25 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{RESBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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_convert_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CONV_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_convert_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - CSV変換処理でシステム例外が発生した場合、エラーで終了すること + 1. CSV変換処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. CSV変換処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - CSV変換処理でシステム例外が発生するようにする + - パラメータ1:CSV変換処理でシステム例外が発生するようにする + - パラメータ2:CSV変換処理で想定外の例外が発生するようにする Expects: - CSV変換処理で例外が発生すること - CSV変換処理で発生した例外のログメッセージが出力されていること @@ -737,7 +778,7 @@ class TestController: mock_set_datetime_period_process = MagicMock(return_value=mock_last_fetch_datetime) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() - mock_convert_crm_csv_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_convert_crm_csv_data_process = MagicMock(side_effect=[exception( 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) mock_backup_crm_csv_data_process = MagicMock() mock_copy_crm_csv_data_process = MagicMock() @@ -764,17 +805,25 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{CONV_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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_backup_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CSVBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_backup_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - CSVバックアップ処理でシステム例外が発生した場合、エラーで終了すること + 1. CSVバックアップ処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. CSVバックアップ処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - CSVバックアップ処理でシステム例外が発生するようにする + - パラメータ1:CSVバックアップ処理でシステム例外が発生するようにする + - パラメータ2:CSVバックアップ処理で想定外の例外が発生するようにする Expects: - CSVバックアップ処理で例外が発生すること - CSVバックアップ処理で発生した例外のログメッセージが出力されていること @@ -814,7 +863,7 @@ class TestController: mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() - mock_backup_crm_csv_data_process = MagicMock(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_backup_crm_csv_data_process = MagicMock(side_effect=[exception( 'E-CSVBK-01', CSVBK_JP_NAME, '例外発生'), None, None]) mock_copy_crm_csv_data_process = MagicMock() mock_upload_last_fetch_datetime_process = MagicMock() @@ -840,17 +889,25 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{CSVBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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_copy_crm_csv_data_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{UPLD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_copy_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - CSVアップロード処理でシステム例外が発生した場合、エラーで終了すること + 1. CSVアップロード処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. CSVアップロード処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - CSVアップロード処理でシステム例外が発生するようにする + - パラメータ1:CSVアップロード処理でシステム例外が発生するようにする + - パラメータ2:CSVアップロード処理で想定外の例外が発生するようにする Expects: - CSVアップロード処理で例外が発生すること - CSVアップロード処理で発生した例外のログメッセージが出力されていること @@ -891,7 +948,7 @@ class TestController: 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(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_copy_crm_csv_data_process = MagicMock(side_effect=[exception( 'E-UPLD-01', UPLD_JP_NAME, '例外発生'), None, None]) mock_upload_last_fetch_datetime_process = MagicMock() mock_upload_result_data_process = MagicMock() @@ -916,17 +973,25 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{UPLD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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_upload_last_fetch_datetime_process(self, s3_client, monkeypatch, caplog): + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{UPD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), + (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') + ]) + def test_raise_upload_last_fetch_datetime_process(self, s3_client, monkeypatch, caplog, exception, message): """ Cases: - 前回取得日時ファイル更新処理でシステム例外が発生した場合、エラーで終了すること + 1. 前回取得日時ファイル更新処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること + 2. 前回取得日時ファイル更新処理で想定外の例外が発生した場合、エラーログが送出され、後続の終了に移行すること Arranges: - - 前回取得日時ファイル更新処理でシステム例外が発生するようにする + - パラメータ1:前回取得日時ファイル更新処理でシステム例外が発生するようにする + - パラメータ2:前回取得日時ファイル更新処理で想定外の例外が発生するようにする Expects: - 前回取得日時ファイル更新処理で例外が発生すること - 前回取得日時ファイル更新処理で発生した例外のログメッセージが出力されていること @@ -968,7 +1033,7 @@ class TestController: 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(side_effect=[ForTestMeDaCaCRMDataFetchException( + mock_upload_last_fetch_datetime_process = MagicMock(side_effect=[exception( 'E-UPD-01', UPD_JP_NAME, '例外発生'), None, None]) mock_upload_result_data_process = MagicMock() @@ -991,7 +1056,7 @@ class TestController: 'Contact': 'success', 'Call2_vod__c': 'success' } - assert generate_log_message_tuple(log_message=f'I-ERR-03 [Account] の[{UPD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=message) 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 From f3a1def88a3f03170f41c68027230a6fc0d7c325 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Aug 2022 00:08:39 +0900 Subject: [PATCH 13/18] =?UTF-8?q?feat:=20=E7=B5=90=E6=9E=9C=E3=83=95?= =?UTF-8?q?=E3=82=A1=E3=82=A4=E3=83=AB=E3=82=A2=E3=83=83=E3=83=97=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=89=E5=87=A6=E7=90=86=E3=81=AE=E4=BE=8B=E5=A4=96?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 80 +++++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index c7cf4ebd..4dcad4a3 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -7,8 +7,9 @@ from src.config.objects import (FetchTargetObjects, LastFetchDatetime, TargetObject) from src.error.exceptions import MeDaCaCRMDataFetchException from src.system_var.constants import (CHK_JP_NAME, CONV_JP_NAME, CSVBK_JP_NAME, - DATE_JP_NAME, FETCH_JP_NAME, PRE_JP_NAME, - RESBK_JP_NAME, UPD_JP_NAME, UPLD_JP_NAME) + DATE_JP_NAME, END_JP_NAME, FETCH_JP_NAME, + PRE_JP_NAME, RESBK_JP_NAME, UPD_JP_NAME, + UPLD_JP_NAME) from src.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple @@ -1060,3 +1061,78 @@ class TestController: 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 + + @pytest.mark.parametrize( + 'exception, message', + [ + (ForTestMeDaCaCRMDataFetchException, f'E-ERR-01 [{END_JP_NAME}]でエラーが発生したため、処理を終了します'), + (ForTestException, 'E-ERR-02 予期せぬエラーが発生したため、処理を終了します エラー内容: [例外発生]') + ]) + def test_raise_upload_result_data_process(self, s3_client, monkeypatch, caplog, exception, message): + """ + Cases: + 1. 取得処理実施結果アップロード処理でシステム例外が発生した場合、エラーで終了すること + 2. 取得処理実施結果アップロード処理で想定外の例外が発生した場合、エラーで終了すること + Arranges: + - パラメータ1:取得処理実施結果アップロード処理でシステム例外が発生するようにする + - パラメータ2:取得処理実施結果アップロード処理で想定外の例外が発生するようにする + 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_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) + 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(side_effect=[exception( + 'E-END-01', END_JP_NAME, '例外発生'), None, None]) + + 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(exception): + controller.controller() + assert generate_log_message_tuple( + log_level=logging.ERROR, + log_message=message) in caplog.record_tuples, '取得処理実施結果アップロード処理で発生した例外のログメッセージが出力されていること' From 548a4ad9c6c16ac7f9c3a136936fea906a20b323 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Aug 2022 00:36:12 +0900 Subject: [PATCH 14/18] =?UTF-8?q?refactor:=20=E6=B5=81=E7=9F=B3=E3=81=AB?= =?UTF-8?q?=E8=A1=8C=E6=95=B0=E5=A4=A7=E6=9D=89=E3=81=AA=E3=81=AE=E3=81=A7?= =?UTF-8?q?=E3=80=81=E5=85=B1=E9=80=9A=E7=9A=84=E3=81=AB=E4=BD=BF=E3=81=88?= =?UTF-8?q?=E3=82=8B=E3=82=82=E3=81=AE=E3=81=AF=E5=AE=9A=E6=95=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 377 ++++----------------- 1 file changed, 63 insertions(+), 314 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index 4dcad4a3..a8ed1c63 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -1,4 +1,5 @@ import logging +from copy import deepcopy from unittest.mock import MagicMock, patch import pytest @@ -14,12 +15,39 @@ from src.util.execute_datetime import ExecuteDateTime from .test_utils.log_message import generate_log_message_tuple -EXPECT_PROCESS_RESULT = { - 'Account': 'success', - 'Contact': 'success', - 'Call2_vod__c': 'success' +COMMON_OBJECT_INFOS = { + 'objects': [ + { + 'object_name': 'Account', + 'columns': [], + 'upload_file_name': 'Account_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Contact', + 'columns': [], + 'upload_file_name': 'Contact_YYYYMMDDHHMMSS' + }, + { + 'object_name': 'Call2_vod__c', + 'columns': [], + 'upload_file_name': 'Call2_vod__c_YYYYMMDDHHMMSS' + } + ] } +COMMON_EXECUTE_DATETIME = ExecuteDateTime() + +COMMON_FETCH_TARGET_OBJECTS = FetchTargetObjects(COMMON_OBJECT_INFOS) + +COMMON_TARGET_OBJECTS_1 = TargetObject(COMMON_OBJECT_INFOS['objects'][0], COMMON_EXECUTE_DATETIME) +COMMON_TARGET_OBJECTS_2 = TargetObject(COMMON_OBJECT_INFOS['objects'][1], COMMON_EXECUTE_DATETIME) +COMMON_TARGET_OBJECTS_3 = TargetObject(COMMON_OBJECT_INFOS['objects'][2], COMMON_EXECUTE_DATETIME) + +COMMON_LAST_FETCH_DATETIME = LastFetchDatetime({ + 'last_fetch_datetime_from': '1900-01-01T00:00:00.000Z', + 'last_fetch_datetime_to': '' +}, COMMON_EXECUTE_DATETIME) + class ForTestMeDaCaCRMDataFetchException(MeDaCaCRMDataFetchException): def __init__(self, error_id: str, func_name: str, message: str) -> None: @@ -43,38 +71,10 @@ class TestController: dict: プロセス関数呼び出し後のモックの辞書 """ def _func(): - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(return_value=[{}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -409,38 +409,11 @@ class TestController: - オブジェクト情報形式チェック処理で発生した例外のログメッセージが出力されている - 例外が発生したオブジェクト以外は正常に終了する """ - 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 = exception('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, {})) + raise_object = exception('E-PRE-01', CHK_JP_NAME, '例外発生') + mock_return_values = [raise_object, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_2] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(return_value=[{}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -493,39 +466,11 @@ class TestController: - データ取得期間設定チェック処理で発生した例外のログメッセージが出力されている - 例外が発生したオブジェクト以外は正常に終了する """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) mock_check_object_info_process = MagicMock(side_effect=mock_return_values) mock_set_datetime_period_process = MagicMock(side_effect=[exception( - 'E-DATE-01', DATE_JP_NAME, '例外発生'), mock_last_fetch_datetime, mock_last_fetch_datetime]) + 'E-DATE-01', DATE_JP_NAME, '例外発生'), COMMON_LAST_FETCH_DATETIME, COMMON_LAST_FETCH_DATETIME]) mock_fetch_crm_data_process = MagicMock(return_value=[{}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -577,38 +522,10 @@ class TestController: - CRMデータ取得処理で例外が発生すること - CRMデータ取得処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[exception( 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) mock_backup_crm_data_process = MagicMock() @@ -661,38 +578,10 @@ class TestController: - CRM電文データバックアップ処理で例外が発生すること - CRM電文データバックアップ処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock(side_effect=[exception( 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) @@ -745,38 +634,10 @@ class TestController: - CSV変換処理で例外が発生すること - CSV変換処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock(side_effect=[exception( @@ -829,38 +690,10 @@ class TestController: - CSVバックアップ処理で例外が発生すること - CSVバックアップ処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -913,38 +746,10 @@ class TestController: - CSVアップロード処理で例外が発生すること - CSVアップロード処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -997,38 +802,10 @@ class TestController: - 前回取得日時ファイル更新処理で例外が発生すること - 前回取得日時ファイル更新処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() @@ -1080,38 +857,10 @@ class TestController: - 取得処理実施結果アップロード処理で例外が発生すること - 取得処理実施結果アップロード処理で発生した例外のログメッセージが出力されていること """ - 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_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] + mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_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(return_value=COMMON_LAST_FETCH_DATETIME) mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) mock_backup_crm_data_process = MagicMock() mock_convert_crm_csv_data_process = MagicMock() From 02086d26b3495ac61b49f9ebe91ea9233d6ca240 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Aug 2022 01:34:20 +0900 Subject: [PATCH 15/18] =?UTF-8?q?refactor:=20=E5=A4=A7=E6=94=B9=E9=80=A0?= =?UTF-8?q?=E3=80=82=E8=A1=8C=E6=95=B0800=E8=BF=91=E3=81=8F=E3=81=BE?= =?UTF-8?q?=E3=81=A7=E6=B8=9B=E3=82=89=E3=81=9B=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_controller.py | 690 +++++++++------------ 1 file changed, 303 insertions(+), 387 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_controller.py b/ecs/crm-datafetch/tests/test_controller.py index a8ed1c63..51ff1987 100644 --- a/ecs/crm-datafetch/tests/test_controller.py +++ b/ecs/crm-datafetch/tests/test_controller.py @@ -61,8 +61,55 @@ class ForTestException(Exception): class TestController: + + @pytest.fixture(autouse=True) + def setup_teardown(self): + # setup + self.mock_prepare_data_fetch_process = MagicMock() + self.mock_check_object_info_process = MagicMock() + self.mock_set_datetime_period_process = MagicMock() + self.mock_fetch_crm_data_process = MagicMock() + 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 test + yield + + # teardown + self.mock_prepare_data_fetch_process.reset_mock() + self.mock_check_object_info_process.reset_mock() + self.mock_set_datetime_period_process.reset_mock() + self.mock_fetch_crm_data_process.reset_mock() + self.mock_backup_crm_data_process.reset_mock() + self.mock_convert_crm_csv_data_process.reset_mock() + self.mock_backup_crm_csv_data_process.reset_mock() + self.mock_copy_crm_csv_data_process.reset_mock() + self.mock_upload_last_fetch_datetime_process.reset_mock() + self.mock_upload_result_data_process.reset_mock() + @pytest.fixture() - def call_all_processes(self, s3_client, monkeypatch, caplog): + def run_control_process(self): + + def _func(): + with patch('src.controller.prepare_data_fetch_process', self.mock_prepare_data_fetch_process),\ + patch('src.controller.check_object_info_process', self.mock_check_object_info_process),\ + patch('src.controller.set_datetime_period_process', self.mock_set_datetime_period_process),\ + patch('src.controller.fetch_crm_data_process', self.mock_fetch_crm_data_process),\ + patch('src.controller.backup_crm_data_process', self.mock_backup_crm_data_process),\ + patch('src.controller.convert_crm_csv_data_process', self.mock_convert_crm_csv_data_process),\ + patch('src.controller.backup_crm_csv_data_process', self.mock_backup_crm_csv_data_process),\ + patch('src.controller.copy_crm_csv_data_process', self.mock_copy_crm_csv_data_process),\ + patch('src.controller.upload_last_fetch_datetime_process', self.mock_upload_last_fetch_datetime_process),\ + patch('src.controller.upload_result_data_process', self.mock_upload_result_data_process): + controller.controller() + yield _func + + @pytest.fixture() + def call_all_processes(self, caplog, run_control_process): """ コントロール処理内ですべてのプロセス関数が呼ばれることのテストで使用するフィクスチャ 各種プロセス関数をモック化し、正常終了させるように動く @@ -72,41 +119,18 @@ class TestController: """ def _func(): mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_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() - should_call_processes = { - 'prepare_data_fetch_process': mock_prepare_data_fetch_process, - 'check_object_info_process': mock_check_object_info_process, - 'set_datetime_period_process': mock_set_datetime_period_process, - 'fetch_crm_data_process': mock_fetch_crm_data_process, - 'backup_crm_data_process': mock_backup_crm_data_process, - 'convert_crm_csv_data_process': mock_convert_crm_csv_data_process, - 'backup_crm_csv_data_process': mock_backup_crm_csv_data_process, - 'copy_crm_csv_data_process': mock_copy_crm_csv_data_process, - 'upload_last_fetch_datetime_process': mock_upload_last_fetch_datetime_process, - 'upload_result_data_process': mock_upload_result_data_process - } - 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() + 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_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() - return should_call_processes + run_control_process() yield _func @@ -128,17 +152,19 @@ class TestController: - 前回取得日時ファイル更新処理が複数回実行される - 取得処理実施結果アップロード処理が1回のみ実行される """ - processes = call_all_processes() - processes['prepare_data_fetch_process'].assert_called_once(), 'データ取得準備処理が1回のみ実行されること' - assert processes['check_object_info_process'].call_count == 3, 'オブジェクト情報形式チェック処理が複数回実行されること' - assert processes['set_datetime_period_process'].call_count == 3, 'データ取得期間設定処理が複数回実行されること' - assert processes['fetch_crm_data_process'].call_count == 3, 'CRMデータ取得処理が複数回実行されること' - assert processes['backup_crm_data_process'].call_count == 3, 'CRM電文データバックアップ処理が複数回実行されること' - assert processes['convert_crm_csv_data_process'].call_count == 3, 'CSV変換処理が複数回実行されること' - assert processes['backup_crm_csv_data_process'].call_count == 3, 'CSVバックアップ処理が複数回実行されること' - assert processes['copy_crm_csv_data_process'].call_count == 3, 'CSVアップロード処理が複数回実行されること' - assert processes['upload_last_fetch_datetime_process'].call_count == 3, '前回取得日次ファイル更新処理が複数回実行されること' - processes['upload_result_data_process'].assert_called_once(), '取得処理実施結果アップロード処理が1回のみ実行されること' + call_all_processes() + assert self.mock_prepare_data_fetch_process.called is True, 'データ取得準備処理が1回のみ実行されること' + assert self.mock_prepare_data_fetch_process.call_count == 1, 'データ取得準備処理が1回のみ実行されること' + 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 == 3, 'CRM電文データバックアップ処理が複数回実行されること' + assert self.mock_convert_crm_csv_data_process.call_count == 3, 'CSV変換処理が複数回実行されること' + assert self.mock_backup_crm_csv_data_process.call_count == 3, 'CSVバックアップ処理が複数回実行されること' + assert self.mock_copy_crm_csv_data_process.call_count == 3, 'CSVアップロード処理が複数回実行されること' + assert self.mock_upload_last_fetch_datetime_process.call_count == 3, '前回取得日次ファイル更新処理が複数回実行されること' + assert self.mock_upload_result_data_process.called is True, '取得処理実施結果アップロード処理が1回のみ実行されること' + assert self.mock_upload_result_data_process.call_count == 1, '取得処理実施結果アップロード処理が1回のみ実行されること' def test_print_normal_logs(self, call_all_processes, caplog): """ @@ -179,7 +205,7 @@ class TestController: assert generate_log_message_tuple(log_message=f'I-CTRL-19 すべてのデータの取得に成功しました') 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_process_result_process(self, s3_client, monkeypatch, caplog): + def test_do_not_call_upload_process_result_process(self, caplog, run_control_process): """ Cases: 処理対象オブジェクトが0件の場合、取得処理実施結果アップロード処理が実行されないこと @@ -191,38 +217,31 @@ class TestController: - 取得処理実施結果アップロード処理が実行されないこと - 処理対象が存在しない旨を示すログメッセージが出力されていること """ - 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() + + self.mock_prepare_data_fetch_process = MagicMock(return_value=([], COMMON_EXECUTE_DATETIME, {})) + self.mock_check_object_info_process = MagicMock() + self.mock_set_datetime_period_process = MagicMock() + self.mock_fetch_crm_data_process = MagicMock() + 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() # 実行回数の確認 - mock_prepare_data_fetch_process.assert_called_once(), 'データ取得準備処理が1回のみ実行されること' - mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと' + assert self.mock_prepare_data_fetch_process.called, 'データ取得準備処理が1回のみ実行されること' + assert self.mock_prepare_data_fetch_process.call_count == 1, 'データ取得準備処理が1回のみ実行されること' + assert self.mock_upload_result_data_process.called is False, '取得処理実施結果アップロード処理が実行されないこと' + assert self.mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと' # ログ出力の確認 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, s3_client, monkeypatch, caplog): + def test_do_not_call_upload_csv_process(self, caplog, run_control_process): """ Cases: オブジェクト情報.is_skipがTrueの場合、CSVアップロード処理が実行されないこと @@ -235,51 +254,44 @@ class TestController: """ mock_check_object_info = { 'object_name': 'Account', + 'columns': [], 'is_skip': True } + mock_return_values = [TargetObject(mock_check_object_info, COMMON_EXECUTE_DATETIME)] + self.mock_prepare_data_fetch_process = MagicMock(return_value=([mock_check_object_info], 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_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() - monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) - mock_execute_datetime = ExecuteDateTime() - mock_return_values = [TargetObject(mock_check_object_info, mock_execute_datetime)] - mock_prepare_data_fetch_process = MagicMock(return_value=([mock_check_object_info], mock_execute_datetime, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - 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() + run_control_process() # 実行回数の確認 - mock_check_object_info_process.assert_called_once() + + assert self.mock_check_object_info_process.called is True + assert self.mock_check_object_info_process.call_count == 1 # オブジェクト情報形式チェック処理以降のプロセスが実行されないこと - mock_set_datetime_period_process.call_count == 0 - mock_fetch_crm_data_process.call_count == 0 - mock_backup_crm_data_process.call_count == 0 - mock_convert_crm_csv_data_process.call_count == 0 - mock_backup_crm_csv_data_process.call_count == 0 - mock_copy_crm_csv_data_process.call_count == 0 - mock_upload_last_fetch_datetime_process.call_count == 0 - mock_upload_result_data_process.call_count == 0 + assert self.mock_set_datetime_period_process.call_count == 0 + assert self.mock_fetch_crm_data_process.call_count == 0 + 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-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, s3_client, monkeypatch, caplog): + def test_do_not_call_upload_csv_process_of_part(self, caplog, run_control_process): """ Cases: オブジェクト情報.is_skipがTrueのものが含まれる場合、CSVアップロード処理が実行されないこと @@ -295,60 +307,53 @@ class TestController: 'objects': [ { 'object_name': 'Account', + 'columns': [], 'is_skip': False }, { 'object_name': 'Contact', + 'columns': [], 'is_skip': True }, { 'object_name': 'Call2_vod__c', + 'columns': [], 'is_skip': False } ] } - monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) - monkeypatch.setattr(TargetObject, '_TargetObject__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), + TargetObject(mock_check_object_infos['objects'][0], COMMON_EXECUTE_DATETIME), + TargetObject(mock_check_object_infos['objects'][1], COMMON_EXECUTE_DATETIME), + TargetObject(mock_check_object_infos['objects'][2], COMMON_EXECUTE_DATETIME), ] - mock_prepare_data_fetch_process = MagicMock(return_value=(FetchTargetObjects(mock_check_object_infos), mock_execute_datetime, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - 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() + 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_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() # 実行回数の確認 - mock_check_object_info_process.call_count == 3 + 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 == 3 # オブジェクト情報形式チェック処理以降のプロセスが実行されないこと - mock_set_datetime_period_process.call_count == 2 - mock_fetch_crm_data_process.call_count == 2 - mock_backup_crm_data_process.call_count == 2 - mock_convert_crm_csv_data_process.call_count == 2 - mock_backup_crm_csv_data_process.call_count == 2 - mock_copy_crm_csv_data_process.call_count == 2 - mock_upload_last_fetch_datetime_process.call_count == 2 - mock_upload_result_data_process.call_count == 2 + assert self.mock_set_datetime_period_process.call_count == 2 + assert self.mock_fetch_crm_data_process.call_count == 2 + 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( @@ -366,7 +371,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'E-ERR-01 [{PRE_JP_NAME}]でエラーが発生したため、処理を終了します'), (ForTestException, 'E-ERR-02 予期せぬエラーが発生したため、処理を終了します エラー内容: [例外発生]') ]) - def test_raise_prepare_data_fetch_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_prepare_data_fetch_process(self, caplog, exception, message, run_control_process): """ Cases: 1. データ取得準備処理でシステム例外が発生した場合、エラーで終了すること @@ -379,13 +384,11 @@ class TestController: - データ取得準備処理で発生した例外のログメッセージが出力されていること """ expect_exception = exception('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): - with pytest.raises(exception): - controller.controller() - assert mock_check_object_info_process.called is False + self.mock_prepare_data_fetch_process = MagicMock(side_effect=expect_exception) + self.mock_check_object_info_process = MagicMock() + with pytest.raises(exception): + run_control_process() + assert self.mock_check_object_info_process.called is False assert generate_log_message_tuple( log_level=logging.ERROR, log_message=message) in caplog.record_tuples, 'データ取得準備処理で発生した例外のログメッセージが出力されていること' @@ -396,7 +399,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CHK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_check_object_info_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_check_object_info_process(self, caplog, exception, message, run_control_process): """ Cases: 1. オブジェクト情報形式チェック処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -411,32 +414,21 @@ class TestController: """ raise_object = exception('E-PRE-01', CHK_JP_NAME, '例外発生') mock_return_values = [raise_object, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_2] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_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 - assert mock_set_datetime_period_process.call_count == 2 + 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_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 == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -453,7 +445,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{DATE_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_set_datetime_period_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_set_datetime_period_process(self, caplog, exception, message, run_control_process): """ Cases: 1. データ取得期間設定処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -467,33 +459,23 @@ class TestController: - 例外が発生したオブジェクト以外は正常に終了する """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(side_effect=[exception( - 'E-DATE-01', DATE_JP_NAME, '例外発生'), COMMON_LAST_FETCH_DATETIME, COMMON_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 - assert mock_fetch_crm_data_process.call_count == 2 + 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(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_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_set_datetime_period_process.call_count == 3 + assert self.mock_fetch_crm_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -510,7 +492,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{FETCH_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_fetch_crm_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_fetch_crm_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. CRMデータ取得処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -523,33 +505,23 @@ class TestController: - CRMデータ取得処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[exception( - 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) - 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_fetch_crm_data_process.call_count == 3 - assert mock_backup_crm_data_process.call_count == 2 + 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=[exception( + 'E-FETCH-01', FETCH_JP_NAME, '例外発生'), {}, {}]) + 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_fetch_crm_data_process.call_count == 3 + assert self.mock_backup_crm_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -566,7 +538,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{RESBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_backup_crm_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_backup_crm_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. CRM電文データバックアップ処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -579,33 +551,23 @@ class TestController: - CRM電文データバックアップ処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - mock_backup_crm_data_process = MagicMock(side_effect=[exception( - 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) - 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_backup_crm_data_process.call_count == 3 - assert mock_convert_crm_csv_data_process.call_count == 2 + 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_backup_crm_data_process = MagicMock(side_effect=[exception( + 'E-RESBK-01', RESBK_JP_NAME, '例外発生'), None, None]) + 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_backup_crm_data_process.call_count == 3 + assert self.mock_convert_crm_csv_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -622,7 +584,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CONV_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_convert_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_convert_crm_csv_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. CSV変換処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -635,33 +597,23 @@ class TestController: - CSV変換処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - mock_backup_crm_data_process = MagicMock() - mock_convert_crm_csv_data_process = MagicMock(side_effect=[exception( - 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) - 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_convert_crm_csv_data_process.call_count == 3 - assert mock_backup_crm_csv_data_process.call_count == 2 + 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_backup_crm_data_process = MagicMock() + self.mock_convert_crm_csv_data_process = MagicMock(side_effect=[exception( + 'E-CONV-01', CONV_JP_NAME, '例外発生'), None, None]) + 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_convert_crm_csv_data_process.call_count == 3 + assert self.mock_backup_crm_csv_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -678,7 +630,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{CSVBK_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_backup_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_backup_crm_csv_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. CSVバックアップ処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -691,33 +643,23 @@ class TestController: - CSVバックアップ処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - mock_backup_crm_data_process = MagicMock() - mock_convert_crm_csv_data_process = MagicMock() - mock_backup_crm_csv_data_process = MagicMock(side_effect=[exception( - 'E-CSVBK-01', CSVBK_JP_NAME, '例外発生'), None, None]) - 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_backup_crm_csv_data_process.call_count == 3 - assert mock_copy_crm_csv_data_process.call_count == 2 + 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_backup_crm_data_process = MagicMock() + self.mock_convert_crm_csv_data_process = MagicMock() + self.mock_backup_crm_csv_data_process = MagicMock(side_effect=[exception( + 'E-CSVBK-01', CSVBK_JP_NAME, '例外発生'), None, None]) + 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_backup_crm_csv_data_process.call_count == 3 + assert self.mock_copy_crm_csv_data_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -734,7 +676,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{UPLD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_copy_crm_csv_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_copy_crm_csv_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. CSVアップロード処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -747,33 +689,23 @@ class TestController: - CSVアップロード処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - 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(side_effect=[exception( - 'E-UPLD-01', UPLD_JP_NAME, '例外発生'), None, None]) - 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_copy_crm_csv_data_process.call_count == 3 - assert mock_upload_last_fetch_datetime_process.call_count == 2 + 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_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(side_effect=[exception( + 'E-UPLD-01', UPLD_JP_NAME, '例外発生'), None, None]) + self.mock_upload_last_fetch_datetime_process = MagicMock() + self.mock_upload_result_data_process = MagicMock() + + run_control_process() + + assert self.mock_copy_crm_csv_data_process.call_count == 3 + assert self.mock_upload_last_fetch_datetime_process.call_count == 2 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -790,7 +722,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'I-ERR-03 [Account] の[{UPD_JP_NAME}]でエラーが発生しました 次のオブジェクトの処理に移行します'), (ForTestException, 'I-ERR-04 [Account] の処理中に予期せぬエラーが発生しました 次のオブジェクトの処理に移行します エラー内容: [例外発生]') ]) - def test_raise_upload_last_fetch_datetime_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_upload_last_fetch_datetime_process(self, caplog, exception, message, run_control_process): """ Cases: 1. 前回取得日時ファイル更新処理でシステム例外が発生した場合、エラーログが送出され、後続の終了に移行すること @@ -803,32 +735,22 @@ class TestController: - 前回取得日時ファイル更新処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - 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(side_effect=[exception( - 'E-UPD-01', UPD_JP_NAME, '例外発生'), None, None]) - 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_upload_last_fetch_datetime_process.call_count == 3 + 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_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(side_effect=[exception( + 'E-UPD-01', UPD_JP_NAME, '例外発生'), None, None]) + self.mock_upload_result_data_process = MagicMock() + + run_control_process() + + assert self.mock_upload_last_fetch_datetime_process.call_count == 3 expect_process_result = { 'Account': 'fail', 'Contact': 'success', @@ -845,7 +767,7 @@ class TestController: (ForTestMeDaCaCRMDataFetchException, f'E-ERR-01 [{END_JP_NAME}]でエラーが発生したため、処理を終了します'), (ForTestException, 'E-ERR-02 予期せぬエラーが発生したため、処理を終了します エラー内容: [例外発生]') ]) - def test_raise_upload_result_data_process(self, s3_client, monkeypatch, caplog, exception, message): + def test_raise_upload_result_data_process(self, caplog, exception, message, run_control_process): """ Cases: 1. 取得処理実施結果アップロード処理でシステム例外が発生した場合、エラーで終了すること @@ -858,30 +780,24 @@ class TestController: - 取得処理実施結果アップロード処理で発生した例外のログメッセージが出力されていること """ mock_return_values = [COMMON_TARGET_OBJECTS_1, COMMON_TARGET_OBJECTS_2, COMMON_TARGET_OBJECTS_3] - mock_prepare_data_fetch_process = MagicMock(return_value=(deepcopy(COMMON_FETCH_TARGET_OBJECTS), COMMON_EXECUTE_DATETIME, {})) - mock_check_object_info_process = MagicMock(side_effect=mock_return_values) - mock_set_datetime_period_process = MagicMock(return_value=COMMON_LAST_FETCH_DATETIME) - mock_fetch_crm_data_process = MagicMock(side_effect=[{}, {}, {}]) - 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(side_effect=[exception( + + 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_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(side_effect=[exception( 'E-END-01', END_JP_NAME, '例外発生'), None, None]) - 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(exception): - controller.controller() + with pytest.raises(exception): + run_control_process() + + 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_level=logging.ERROR, log_message=message) in caplog.record_tuples, '取得処理実施結果アップロード処理で発生した例外のログメッセージが出力されていること' From ed80499ce57e25f9901f68a5e0caa4a76765bb8c Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 4 Aug 2022 09:06:57 +0900 Subject: [PATCH 16/18] =?UTF-8?q?docs:=20README=E3=81=AE=E3=83=95=E3=82=A9?= =?UTF-8?q?=E3=83=AB=E3=83=80=E6=A7=8B=E6=88=90=E3=81=AB=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ecs/crm-datafetch/README.md b/ecs/crm-datafetch/README.md index 034cf2d4..dc992c81 100644 --- a/ecs/crm-datafetch/README.md +++ b/ecs/crm-datafetch/README.md @@ -105,7 +105,8 @@ │ └── logger.py -- ログ管理クラス │ └── tests/ -- テストコード置き場 - ├── aws -- AWS操作モジュールのテスト + ├── test_utils/ -- テストコードで共通的に使用できる関数群 + ├── aws/ -- AWS操作モジュールのテスト ├── ... -- src配下のモジュール構成と同じ階層にテストコードを追加していく ├── conftest.py -- pytestのフィクスチャやフックを管理するファイル └── docstring_parser.py -- pytest-htmlのレポート出力用のヘルパー 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 17/18] =?UTF-8?q?feat:=20=E5=8F=96=E5=BE=97=E3=83=87?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E4=BB=B6=E6=95=B0=E3=81=8C0=E4=BB=B6?= =?UTF-8?q?=E3=81=AE=E5=A0=B4=E5=90=88=E3=81=ABCSV=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E3=81=97=E3=81=AA=E3=81=84=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=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() From 69e06e1b42908c6bfaa752900c08b2c8629e1251 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 16 Aug 2022 07:14:54 +0900 Subject: [PATCH 18/18] =?UTF-8?q?docs:=20README=E3=81=AEtypo=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ecs/crm-datafetch/README.md b/ecs/crm-datafetch/README.md index 7f5e6216..f2928706 100644 --- a/ecs/crm-datafetch/README.md +++ b/ecs/crm-datafetch/README.md @@ -74,7 +74,7 @@ ```text . -├── Dockerfile -- Dokcerイメージを作成するためのファイル +├── Dockerfile -- Dockerイメージを作成するためのファイル ├── Pipfile -- Pipenv(Pythonの仮想環境管理モジュール)で、依存関係を管理するためのファイル ├── Pipfile.lock -- Pipenvでインストールされた依存関係のバージョン固定ファイル ├── README.md -- README