feat: 全呼び出しのログ検査を行うため、コントロール処理を共通化

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2022-08-03 13:11:58 +09:00
parent 0a00e58cb5
commit e00f336e21

View File

@ -1,5 +1,7 @@
import logging
from unittest.mock import MagicMock, patch from unittest.mock import MagicMock, patch
import pytest
from src import controller from src import controller
from src.config.objects import (FetchTargetObjects, LastFetchDatetime, from src.config.objects import (FetchTargetObjects, LastFetchDatetime,
TargetObject) TargetObject)
@ -7,80 +9,121 @@ from src.util.execute_datetime import ExecuteDateTime
class TestController: 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: Cases:
コントローラー処理からすべてのプロセスが呼ばれること コントローラー処理からすべてのプロセスが呼ばれること
Arranges: Arranges:
- 各種プロセスメソッドと内部で使用している値オブジェクトをモック化する - call_all_processesフィクスチャでコントローラー処理を実行しておく
Expects: Expects:
- データ取得準備処理が1回のみ実行されること - データ取得準備処理が1回のみ実行される
- オブジェクト情報形式チェック処理が複数回実行されること - オブジェクト情報形式チェック処理が複数回実行される
- データ取得期間設定処理が複数回実行されること - データ取得期間設定処理が複数回実行される
- CRMデータ取得処理が複数回実行されること - CRMデータ取得処理が複数回実行される
- CRM電文データバックアップ処理が複数回実行されること - CRM電文データバックアップ処理が複数回実行される
- CSV変換処理が複数回実行されること - CSV変換処理が複数回実行される
- CSVバックアップ処理が複数回実行されること - CSVバックアップ処理が複数回実行される
- CSVアップロード処理が複数回実行されること - CSVアップロード処理が複数回実行される
- 前回取得日次ファイル更新処理が複数回実行されること - 前回取得日ファイル更新処理が複数回実行される
- 取得処理実施結果アップロード処理が1回のみ実行されること - 取得処理実施結果アップロード処理が1回のみ実行される
""" """
monkeypatch.setattr(FetchTargetObjects, '_FetchTargetObjects__validate', lambda x: None) processes = call_all_processes()
monkeypatch.setattr(TargetObject, '_TargetObject__validate', lambda x: None) processes['prepare_data_fetch_process'].assert_called_once(), 'データ取得準備処理が1回のみ実行されること'
monkeypatch.setattr(LastFetchDatetime, '_LastFetchDatetime__validate', lambda x: None) assert processes['check_object_info_process'].call_count == 3, 'オブジェクト情報形式チェック処理が複数回実行されること'
mock_execute_datetime = ExecuteDateTime() assert processes['set_datetime_period_process'].call_count == 3, 'データ取得期間設定処理が複数回実行されること'
mock_target_objects = FetchTargetObjects({ assert processes['fetch_crm_data_process'].call_count == 3, 'CRMデータ取得処理が複数回実行されること'
'objects': [ assert processes['backup_crm_data_process'].call_count == 3, 'CRM電文データバックアップ処理が複数回実行されること'
{ assert processes['convert_crm_csv_data_process'].call_count == 3, 'CSV変換処理が複数回実行されること'
'object_name': 'Account' 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, '前回取得日次ファイル更新処理が複数回実行されること'
'object_name': 'Contact' processes['upload_result_data_process'].assert_called_once(), '取得処理実施結果アップロード処理が1回のみ実行されること'
},
{
'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() def test_controller_print_normal_logs(self, call_all_processes, caplog):
assert mock_check_object_info_process.call_count == 3 """
assert mock_set_datetime_period_process.call_count == 3 Cases:
assert mock_fetch_crm_data_process.call_count == 3 コントローラー処理の正常系ログがすべての出力されていること
assert mock_backup_crm_data_process.call_count == 3 Arranges:
assert mock_convert_crm_csv_data_process.call_count == 3 - call_all_processesフィクスチャでコントローラー処理を実行しておく
assert mock_backup_crm_csv_data_process.call_count == 3 Expects:
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() 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: Cases:
処理対象オブジェクトが0件の場合取得処理実施結果アップロード処理が実行されないこと 処理対象オブジェクトが0件の場合取得処理実施結果アップロード処理が実行されないこと
@ -90,6 +133,7 @@ class TestController:
Expects: Expects:
- データ取得準備処理が1回のみ実行されること - データ取得準備処理が1回のみ実行されること
- 取得処理実施結果アップロード処理が実行されないこと - 取得処理実施結果アップロード処理が実行されないこと
- 処理対象が存在しない旨を示すログメッセージが出力されていること
""" """
mock_execute_datetime = ExecuteDateTime() mock_execute_datetime = ExecuteDateTime()
mock_prepare_data_fetch_process = MagicMock(return_value=([], mock_execute_datetime, {})) 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): patch('src.controller.upload_result_data_process', mock_upload_result_data_process):
controller.controller() controller.controller()
mock_prepare_data_fetch_process.assert_called_once() mock_prepare_data_fetch_process.assert_called_once(), 'データ取得準備処理が1回のみ実行されること'
mock_upload_result_data_process.call_count == 0 mock_upload_result_data_process.call_count == 0, '取得処理実施結果アップロード処理が実行されないこと'
# シングルトンなロガーを引き回しているので、rootロガーになる
assert ('root', logging.INFO, 'I-CTRL-21 処理対象のデータが存在しませんでした') in caplog.record_tuples, '処理対象が存在しない旨を示すログメッセージが出力されていること'