210 lines
10 KiB
Python
210 lines
10 KiB
Python
import json
|
|
from datetime import datetime
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
import pytest
|
|
from src.config.objects import FetchTargetObjects
|
|
from src.error.exceptions import FileNotFoundException, InvalidConfigException
|
|
from src.prepare_data_fetch_process import prepare_data_fetch_process
|
|
from src.system_var.constants import PRE_JP_NAME, YYYYMMDDTHHMMSSTZ
|
|
from src.system_var.environments import (CRM_CONFIG_BUCKET,
|
|
OBJECT_INFO_FILENAME,
|
|
OBJECT_INFO_FOLDER)
|
|
|
|
from .test_utils.log_message import generate_log_message_tuple
|
|
|
|
|
|
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=f'I-PRE-03 CRM_取得オブジェクト情報ファイルの取得開始します ファイルパス:[s3://{CRM_CONFIG_BUCKET}/{OBJECT_INFO_FOLDER}/{OBJECT_INFO_FILENAME}]') in caplog.record_tuples
|
|
assert generate_log_message_tuple(log_message='I-PRE-09 データ取得準備処理を終了します') in caplog.record_tuples
|
|
|
|
def test_call_depended_modules(self):
|
|
"""
|
|
Cases:
|
|
データ取得準備処理内で依存しているモジュールが正しく呼ばれていること
|
|
Arranges:
|
|
- データ取得準備処理の依存モジュールをモック化する
|
|
Expects:
|
|
- 依存しているモジュールが正しく呼ばれている
|
|
"""
|
|
|
|
# Arrange
|
|
mock_config_bucket = MagicMock(return_value='')
|
|
mock_json_parser = MagicMock(return_value={})
|
|
mock_fetch_target_objects = MagicMock(return_value=None)
|
|
# Act
|
|
with patch('src.aws.s3.ConfigBucket.get_object_info_file', mock_config_bucket), \
|
|
patch('src.parser.json_parser.JsonParser.parse', mock_json_parser), \
|
|
patch('src.config.objects.FetchTargetObjects.__init__', mock_fetch_target_objects):
|
|
prepare_data_fetch_process()
|
|
|
|
# Assert
|
|
|
|
assert mock_config_bucket.called is True
|
|
assert mock_json_parser.called is True
|
|
assert mock_fetch_target_objects.called is True
|
|
|
|
def test_raise_get_object_info(self, bucket_name, monkeypatch, caplog):
|
|
"""
|
|
Cases:
|
|
CRM_取得オブジェクト情報ファイルを取得できない場合、エラーが発生すること
|
|
Arranges:
|
|
- オブジェクト情報ファイル取得処理で例外が発生するようにする
|
|
Expects:
|
|
- 例外が発生する
|
|
- ファイルが読み込めないエラーが返却される
|
|
"""
|
|
|
|
# Arrange
|
|
monkeypatch.setattr('src.prepare_data_fetch_process.OBJECT_INFO_FILENAME', 'crm_object_list_diff.json')
|
|
mock_config_bucket = MagicMock(side_effect=Exception('ファイル取得エラー'))
|
|
mock_json_parser = MagicMock(return_value={})
|
|
mock_fetch_target_objects = MagicMock(return_value=None)
|
|
# Act
|
|
with patch('src.aws.s3.ConfigBucket.get_object_info_file', mock_config_bucket), \
|
|
patch('src.parser.json_parser.JsonParser.parse', mock_json_parser), \
|
|
patch('src.config.objects.FetchTargetObjects.__init__', mock_fetch_target_objects):
|
|
with pytest.raises(FileNotFoundException) as e:
|
|
prepare_data_fetch_process()
|
|
|
|
# Assert
|
|
|
|
assert mock_config_bucket.called is True
|
|
assert mock_json_parser.called is False
|
|
assert mock_fetch_target_objects.called is False
|
|
assert e.value.error_id == 'E-PRE-01'
|
|
assert e.value.func_name == PRE_JP_NAME
|
|
assert e.value.args[0] == f'CRM_取得オブジェクト情報ファイルが存在しません ファイル名:[crm_object_list_diff.json] エラー内容:[ファイル取得エラー]'
|
|
|
|
def test_raise_parse_json_str(self, bucket_name, monkeypatch, caplog):
|
|
"""
|
|
Cases:
|
|
CRM_取得オブジェクト情報ファイルをパースできない場合、エラーが発生すること
|
|
Arranges:
|
|
- オブジェクト情報ファイルパース処理で例外が発生するようにする
|
|
Expects:
|
|
- 例外が発生する
|
|
- パースが失敗した旨、エラーメッセージが表示される
|
|
"""
|
|
|
|
# Arrange
|
|
mock_config_bucket = MagicMock(return_value='')
|
|
mock_json_parser = MagicMock(side_effect=Exception('JSONパースエラー'))
|
|
mock_fetch_target_objects = MagicMock(return_value=None)
|
|
# Act
|
|
with patch('src.aws.s3.ConfigBucket.get_object_info_file', mock_config_bucket), \
|
|
patch('src.parser.json_parser.JsonParser.parse', mock_json_parser), \
|
|
patch('src.config.objects.FetchTargetObjects.__init__', mock_fetch_target_objects):
|
|
with pytest.raises(InvalidConfigException) as e:
|
|
prepare_data_fetch_process()
|
|
|
|
# Assert
|
|
|
|
assert mock_config_bucket.called is True
|
|
assert mock_json_parser.called is True
|
|
assert mock_fetch_target_objects.called is False
|
|
assert e.value.error_id == 'E-PRE-02'
|
|
assert e.value.func_name == PRE_JP_NAME
|
|
assert e.value.args[0] == f'CRM_取得オブジェクト情報ファイルのパースに失敗しました エラー内容:[JSONパースエラー]'
|
|
|
|
def test_raise_check_objects_format(self, bucket_name, monkeypatch, caplog):
|
|
"""
|
|
Cases:
|
|
CRM_取得オブジェクト情報のキーobjectsの形式チェックが不正の場合、エラーが発生すること
|
|
Arranges:
|
|
- CRM_取得オブジェクト情報のキーobjectsの形式チェックで例外が発生するようにする
|
|
Expects:
|
|
- 例外が発生する
|
|
- 形式チェックが失敗した旨、エラーメッセージが表示される
|
|
"""
|
|
|
|
# Arrange
|
|
monkeypatch.setattr('src.prepare_data_fetch_process.OBJECT_INFO_FILENAME', 'crm_object_list_diff.json')
|
|
mock_config_bucket = MagicMock(return_value='')
|
|
mock_json_parser = MagicMock(return_value={})
|
|
mock_fetch_target_objects = MagicMock(side_effect=Exception('形式チェックエラー'))
|
|
# Act
|
|
with patch('src.aws.s3.ConfigBucket.get_object_info_file', mock_config_bucket), \
|
|
patch('src.parser.json_parser.JsonParser.parse', mock_json_parser), \
|
|
patch('src.config.objects.FetchTargetObjects.__init__', mock_fetch_target_objects):
|
|
with pytest.raises(InvalidConfigException) as e:
|
|
prepare_data_fetch_process()
|
|
|
|
# Assert
|
|
|
|
assert mock_config_bucket.called is True
|
|
assert mock_json_parser.called is True
|
|
assert mock_fetch_target_objects.called is True
|
|
assert e.value.error_id == 'E-PRE-03'
|
|
assert e.value.func_name == PRE_JP_NAME
|
|
assert e.value.args[0] == 'CRM_取得オブジェクト情報ファイルの形式チェックに失敗しました ファイル名:[crm_object_list_diff.json] エラー内容:[形式チェックエラー]'
|