diff --git a/ecs/crm-datafetch/src/upload_result_data_process.py b/ecs/crm-datafetch/src/upload_result_data_process.py index 8248fb78..e0c00a79 100644 --- a/ecs/crm-datafetch/src/upload_result_data_process.py +++ b/ecs/crm-datafetch/src/upload_result_data_process.py @@ -11,7 +11,7 @@ def upload_result_data_process(process_result: dict, execute_datetime: ExecuteDa Args: process_result (dict): 取得処理実行結果辞書オブジェクト - execute_datetime (ExecuteDateTime): データ取得期間設定インスタンス + execute_datetime (ExecuteDateTime): 実行日時取得インスタンス Raises: FileUploadException: S3のファイルアップロード失敗 diff --git a/ecs/crm-datafetch/tests/test_upload_result_data_process.py b/ecs/crm-datafetch/tests/test_upload_result_data_process.py new file mode 100644 index 00000000..abf7fb8d --- /dev/null +++ b/ecs/crm-datafetch/tests/test_upload_result_data_process.py @@ -0,0 +1,124 @@ +from unittest.mock import MagicMock, patch + +import pytest +from src.error.exceptions import FileUploadException +from src.system_var.constants import END_JP_NAME +from src.upload_result_data_process import upload_result_data_process +from src.util.execute_datetime import ExecuteDateTime + +from .test_utils.log_message import generate_log_message_tuple + + +class TestUploadResultDataProcess: + + @pytest.fixture + def bucket_name(self): + return 'test-config-bucket' + + @pytest.fixture + def prepare_bucket(self, s3_client, bucket_name): + s3_client.create_bucket(Bucket=bucket_name) + yield + + def test_run_process_success(self, s3_client, prepare_bucket, bucket_name, monkeypatch, caplog): + """ + Cases: + 取得処理実施結果アップロード処理が正常終了し、期待通りの結果が返ること + Arranges: + - prepare_bucketフィクスチャで、取得処理実施結果ファイルを置くためのモックバケットを作る + - モックバケットを指すように環境変数を設定する + - 取得処理実施結果を準備する + - 実行日時取得インスタンスを生成する + Expects: + - PUTした取得処理実施結果ファイルが存在し内容が想定と一致する + - 取得処理実施結果アップロード処理の仕様に沿った正常系ログが出力されること(デバッグログは除く) + """ + + # Arranges + + # 環境変数を編集 + monkeypatch.setattr('src.aws.s3.CRM_BACKUP_BUCKET', bucket_name) + monkeypatch.setattr('src.aws.s3.PROCESS_RESULT_FOLDER', 'data_import') + + process_result = { + "Account": "success", + "Contact": "fail" + } + + execute_datetime = ExecuteDateTime() + + # Act + upload_result_data_process(process_result, execute_datetime) + + # Assert + # ファイル確認 + actual = s3_client.get_object(Bucket=bucket_name, Key=f'data_import/{execute_datetime.to_path()}/process_result.json') + assert actual['Body'].read().decode('utf-8') == '{"Account": "success", "Contact": "fail"}' + + # ログの確認 + assert generate_log_message_tuple(log_message='I-END-01 取得処理実施結果アップロード処理を開始します') in caplog.record_tuples + assert generate_log_message_tuple(log_message=f'I-END-03 取得処理実施結果アップロード処理を終了します') in caplog.record_tuples + + def test_call_depended_modules(self): + """ + Cases: + 取得処理実施結果アップロード処理内で依存しているモジュールが正しく呼ばれていること + Arranges: + - 取得処理実施結果アップロード処理の依存モジュールをモック化する + - 取得処理実施結果を準備する + - 実行日時取得インスタンスを生成する + Expects: + - 依存しているモジュールが正しく呼ばれている + """ + + # Arrange + mock_backup_bucket = MagicMock(return_value=None) + + process_result = { + "Account": "success", + "Contact": "fail" + } + + execute_datetime = ExecuteDateTime() + + # Act + with patch('src.aws.s3.BackupBucket.put_result_json', mock_backup_bucket): + upload_result_data_process(process_result, execute_datetime) + + # Assert + assert mock_backup_bucket.called is True + + def test_raise_put_result_json(self, monkeypatch): + """ + Cases: + 取得処理実施結果をアップロードできない場合、エラーが発生すること + Arranges: + - 取得処理実施結果アップロード処理で例外を発生させるモックを生成する + - 取得処理実施結果を準備する + - 実行日時取得インスタンスを生成する + Expects: + - 例外が発生する + - ファイルがアップロードできないエラーが返却される + """ + + # Arrange + mock_backup_bucket = MagicMock(side_effect=Exception('ファイルアップロードエラー')) + + process_result = { + "Account": "success", + "Contact": "fail" + } + + execute_datetime = ExecuteDateTime() + + # Act + with patch('src.aws.s3.BackupBucket.put_result_json', mock_backup_bucket): + with pytest.raises(FileUploadException) as e: + upload_result_data_process(process_result, execute_datetime) + + # Assert + + assert mock_backup_bucket.called is True + assert e.value.error_id == 'E-END-01' + assert e.value.func_name == END_JP_NAME + assert e.value.args[0] == f'取得処理実施結果のアップロードに失敗しました ファイル名:[process_result.json] エラー内容:[ファイルアップロードエラー]'