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