feat: コントローラーのテスト追加。コントローラーでexit()してしまうとテストコード側で例外として扱わないといけなくなるため、エントリーポイント側で制御するように修正した

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2022-08-03 13:11:58 +09:00
parent ca9dc2863f
commit 9012769e1f
5 changed files with 89 additions and 10 deletions

View File

@ -2,4 +2,4 @@ from src.controller import controller
"""CRMデータ取得処理のエントリーポイント"""
if __name__ == '__main__':
controller()
exit(controller())

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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()