import json import logging from datetime import datetime import pytest from src.config.objects import FetchTargetObjects from src.error.exceptions import MeDaCaCRMDataFetchException from src.prepare_data_fetch_process import prepare_data_fetch_process from src.system_var.constants import YYYYMMDDTHHMMSSTZ from .test_utils.log_message import generate_log_message_tuple 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 TestPrepareDataFetchProcess: @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フィクスチャで、CRM取得オブジェクト情報ファイルを置くためのモックバケットを作る - 作成したモックバケットを指すように環境変数を設定する - CRM取得オブジェクト情報ファイルを置く Expects: - CRM取得オブジェクトクラスのインスタンスが返却される - CRM取得オブジェクトクラスのインスタンスが期待値と一致 - 実行日時クラスのインスタンスが返却される - 実行日時クラスが、テスト実行後の日時よりも小さい - 処理結果出力用の空のdictが返却される - データ取得準備処理の仕様に沿った正常系ログが出力されること(デバッグログは除く) """ # Arrange target_objects_dict = { 'objects': [ { 'object_name': 'Account', 'columns': [ 'Id', 'Name' ] }, { 'object_name': 'Contact', 'columns': [ 'Id', 'Name' ] } ] } s3_client.put_object(Bucket=bucket_name, Key='crm/object_info/crm_object_list_diff.json', Body=json.dumps(target_objects_dict)) # 環境変数を編集 monkeypatch.setattr('src.aws.s3.CRM_CONFIG_BUCKET', bucket_name) monkeypatch.setattr('src.aws.s3.OBJECT_INFO_FOLDER', 'crm/object_info') monkeypatch.setattr('src.aws.s3.OBJECT_INFO_FILENAME', 'crm_object_list_diff.json') # Act actual_fetch_target_objects, actual_execute_datetime, actual_process_result = \ prepare_data_fetch_process() # Assert # 返り値の期待値チェック expect_fetch_target_objects = FetchTargetObjects(target_objects_dict) assert isinstance(actual_fetch_target_objects, FetchTargetObjects), 'CRM取得オブジェクトクラスのインスタンスが返却される' assert all([a == e for a, e in zip(actual_fetch_target_objects, expect_fetch_target_objects)]), 'CRM取得オブジェクトクラスのインスタンスが期待値と一致' assert datetime.strptime(str(actual_execute_datetime), YYYYMMDDTHHMMSSTZ) < datetime.now(), '実行日時がアサーション時点の日時よりも小さいこと' assert actual_process_result == {}, '処理結果出力用の空のdictが返却される' # ログの確認 assert generate_log_message_tuple(log_message='I-PRE-01 データ取得準備処理を開始します') in caplog.record_tuples assert generate_log_message_tuple(log_message=f'I-PRE-02 データ取得処理開始日時:{str(actual_execute_datetime)}') in caplog.record_tuples assert generate_log_message_tuple(log_message='I-PRE-09 データ取得準備処理を終了します') in caplog.record_tuples