From f0b02efd8e3399d182013812cbced763b442f506 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Wed, 17 Aug 2022 20:32:54 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor:=20=E3=81=BB=E3=81=8B=E3=83=A2?= =?UTF-8?q?=E3=82=B8=E3=83=A5=E3=83=BC=E3=83=AB=E3=81=AE=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=AB=E3=82=88=E3=82=8A=E3=80=81=E3=83=86?= =?UTF-8?q?=E3=82=B9=E3=83=88=E5=AE=9F=E6=96=BD=E4=B8=8D=E5=8F=AF=E3=81=A8?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=9F=E3=83=86=E3=82=B9=E3=83=88=E3=82=92?= =?UTF-8?q?=E3=82=B9=E3=82=AD=E3=83=83=E3=83=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/salesforce/test_soql_builder.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ecs/crm-datafetch/tests/salesforce/test_soql_builder.py b/ecs/crm-datafetch/tests/salesforce/test_soql_builder.py index da42d486..56ff81ea 100644 --- a/ecs/crm-datafetch/tests/salesforce/test_soql_builder.py +++ b/ecs/crm-datafetch/tests/salesforce/test_soql_builder.py @@ -1,4 +1,5 @@ +import pytest from src.config.objects import ExecuteDateTime, LastFetchDatetime, TargetObject from src.salesforce.soql_builder import SOQLBuilder @@ -119,7 +120,8 @@ class TestSOQLBuilder: assert actual.replace('\n', '').replace(' ', '') == expect.replace('\n', '').replace(' ', '') - def test_create_fetch_soql_no_columns(self): + @pytest.mark.skip('データ取得用のSOQLがカラムがない状態は、TargetObjectクラス側で制御されるため、テストを実施しない') + def test_raise_create_fetch_soql_cause_no_columns(self): """ Cases: データ取得用のSOQLがカラムがない状態で生成されること From 2d2ad65d16c5feed17afc6230086b67b5df93942 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 18 Aug 2022 11:14:21 +0900 Subject: [PATCH 2/4] =?UTF-8?q?frat:=20CSV=E5=A4=89=E6=8F=9B=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E3=83=86=E3=82=B9=E3=83=88=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_convert_crm_csv_data_process.py | 169 ++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py diff --git a/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py b/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py new file mode 100644 index 00000000..ec4ab64a --- /dev/null +++ b/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py @@ -0,0 +1,169 @@ +import textwrap +from collections import OrderedDict +from unittest.mock import patch + +import pytest +from src.config.objects import TargetObject +from src.convert_crm_csv_data_process import convert_crm_csv_data_process +from src.error.exceptions import DataConvertException +from src.system_var.constants import CONV_JP_NAME +from src.util.execute_datetime import ExecuteDateTime + +from .test_utils.log_message import generate_log_message_tuple + + +class TestConvertCrmCsvDataProcess: + + def test_run_process_success(self, caplog): + """ + Cases: + CSV変換処理が正常終了し、期待通りの結果が返ること + Arranges: + - チェック対象のdictオブジェクトを宣言する + Expects: + - CSV変換処理の結果文字列が返却されること + - CSV変換処理の仕様に沿った正常系ログが出力されること(デバッグログは除く) + """ + # Arrange + response_json = [ + OrderedDict([ + ('attributes', OrderedDict([('type', 'Account'), + ('url', '/services/data/v1.0/sobjects/Account/TEST001')])), + ('Id', 'TEST001'), + ('AccountNumber', 'test001'), + ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), + ('LastModifiedById', 1.234567E+6), + ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), + ('IsDeleted', True) + ]), + OrderedDict([ + ('attributes', OrderedDict([('type', 'Account'), + ('url', '/services/data/v1.0/sobjects/Account/TEST002')])), + ('Id', 'TEST002'), + ('AccountNumber', 'test002'), + ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), + ('LastModifiedById', 1.234567E+6), + ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), + ('IsDeleted', False) + ]), + OrderedDict([ + ('attributes', OrderedDict([('type', 'Account'), + ('url', '/services/data/v1.0/sobjects/Account/TEST003')])), + ('Id', 'TEST003'), + ('AccountNumber', 'test003'), + ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), + ('LastModifiedById', 1.234567E+6), + ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), + ('IsDeleted', False) + ]), + ] + + target_object_dict = { + 'object_name': 'Account', + 'columns': [ + 'Id', + 'AccountNumber', + 'LastModifiedDate', + 'LastModifiedById', + 'SystemModstamp', + 'IsDeleted' + ] + } + + execute_datetime = ExecuteDateTime() + target_object = TargetObject(target_object_dict, execute_datetime) + + # Act + actual_csv_string = convert_crm_csv_data_process(target_object, response_json) + + # Assert + + expect_csv_string = """\ + "Id","AccountNumber","LastModifiedDate","LastModifiedById","SystemModstamp","IsDeleted"\r\n\ + "TEST001","test001","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","1"\r\n\ + "TEST002","test002","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","0"\r\n\ + "TEST003","test003","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","0"\r\n\ + """ + # 返り値の期待値チェック + assert isinstance(actual_csv_string, str), 'CSV文字列が返却される' + assert actual_csv_string == textwrap.dedent(expect_csv_string) + + # ログの確認 + assert generate_log_message_tuple(log_message='I-CONV-01 [Account] のCSV変換処理を開始します') in caplog.record_tuples + assert generate_log_message_tuple(log_message='I-CONV-03 [Account] のCSV変換処理を終了します') in caplog.record_tuples + + def test_call_depended_modules(self): + """ + Cases: + CSV変換処理内で依存しているモジュールが正しく呼ばれていること + Arranges: + - CSV変換処理の依存モジュールをモック化する + Expects: + - 依存しているモジュールが正しく呼ばれている + """ + + # Arrange + target_object_dict = { + 'object_name': 'Account', + 'columns': [ + 'Id', + 'AccountNumber', + 'LastModifiedDate', + 'LastModifiedById', + 'SystemModstamp', + 'IsDeleted' + ] + } + + execute_datetime = ExecuteDateTime() + target_object = TargetObject(target_object_dict, execute_datetime) + # Act + with patch('src.convert_crm_csv_data_process.CSVStringConverter') as mock_converter: + inst = mock_converter.return_value + inst.convert.return_value = '' + convert_crm_csv_data_process(target_object, {}) + + # Assert + assert mock_converter.called is True + assert inst.convert.called is True + + def test_raise_convert(self): + """ + Cases: + オブジェクト形式チェック処理でエラーが発生した場合、検査例外が発生すること + Arranges: + - オブジェクト形式チェック処理で例外が発生するようにする + Expects: + - 例外が発生する + - 形式チェックが失敗したエラーが返却される + """ + + # Arrange + target_object_dict = { + 'object_name': 'Account', + 'columns': [ + 'Id', + 'AccountNumber', + 'LastModifiedDate', + 'LastModifiedById', + 'SystemModstamp', + 'IsDeleted' + ] + } + + execute_datetime = ExecuteDateTime() + target_object = TargetObject(target_object_dict, execute_datetime) + # Act + with patch('src.convert_crm_csv_data_process.CSVStringConverter') as mock_converter: + inst = mock_converter.return_value + inst.convert.side_effect = Exception('変換エラー') + with pytest.raises(DataConvertException) as e: + convert_crm_csv_data_process(target_object, {}) + + # Assert + assert mock_converter.called is True + assert inst.convert.called is True + + assert e.value.error_id == 'E-CONV-01' + assert e.value.func_name == CONV_JP_NAME + assert e.value.args[0] == f'[Account] CSV変換に失敗しました エラー内容:[変換エラー]' From 5f302f5dc2c5f152c4c9a7aafe1178dec88a5e8e Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 18 Aug 2022 11:14:42 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20VSCode=E3=81=AE=E6=8E=A8?= =?UTF-8?q?=E5=A5=A8=E8=A8=AD=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/.vscode/recommend_settings.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ecs/crm-datafetch/.vscode/recommend_settings.json b/ecs/crm-datafetch/.vscode/recommend_settings.json index 66a8f2b5..d4822731 100644 --- a/ecs/crm-datafetch/.vscode/recommend_settings.json +++ b/ecs/crm-datafetch/.vscode/recommend_settings.json @@ -12,5 +12,8 @@ "python.linting.flake8Enabled": true, "python.linting.flake8Args": ["--max-line-length=150", "--ignore=F541"], "python.formatting.provider": "autopep8", - "python.formatting.autopep8Args": ["--max-line-length", "150"] + "python.formatting.autopep8Args": ["--max-line-length", "150"], + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true } From 2a2316918596f9e404c047a92cf9c9e146ba7215 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Thu, 18 Aug 2022 16:46:10 +0900 Subject: [PATCH 4/4] =?UTF-8?q?style:=20=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py b/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py index ec4ab64a..49d960c0 100644 --- a/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py +++ b/ecs/crm-datafetch/tests/test_convert_crm_csv_data_process.py @@ -130,9 +130,9 @@ class TestConvertCrmCsvDataProcess: def test_raise_convert(self): """ Cases: - オブジェクト形式チェック処理でエラーが発生した場合、検査例外が発生すること + CSV変換処理でエラーが発生した場合、検査例外が発生すること Arranges: - - オブジェクト形式チェック処理で例外が発生するようにする + - CSV変換処理で例外が発生するようにする Expects: - 例外が発生する - 形式チェックが失敗したエラーが返却される