From 08f87d2abfd3360941f70b577a1b2fe381878e92 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 Aug 2022 16:02:26 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E4=BD=8F=E6=89=80=E5=9E=8B?= =?UTF-8?q?=E3=81=8C=E8=A4=87=E5=90=88=E3=82=AA=E3=83=96=E3=82=B8=E3=82=A7?= =?UTF-8?q?=E3=82=AF=E3=83=88=E9=A0=85=E7=9B=AE=E3=81=AB=E3=81=AA=E3=81=A3?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=9F=E3=81=9F=E3=82=81=E3=80=81=E5=80=8B?= =?UTF-8?q?=E5=88=A5=E3=81=AB=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 --- .../tests/salesforce/test_salesforce.py | 67 +++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py index b815e772..2b02a5cb 100644 --- a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py +++ b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py @@ -9,6 +9,8 @@ Accountオブジェクトの下記SFIDのレコードはいじらないように 変更してしまった場合は各SOQLの取得日付とデータを修正してください """ +from typing import OrderedDict + import pytest from requests.exceptions import ConnectTimeout, ReadTimeout from src.config.objects import LastFetchDatetime, TargetObject @@ -160,7 +162,7 @@ class TestSalesforceApiClient: - LastFetchDatetimeのFromに2000年1月1日を指定する - LastFetchDatetimeのToに2100年12月31日を指定する Expects: - 取得件数が16になる + 取得件数が17になる """ execute_datetime = ExecuteDateTime() @@ -190,7 +192,7 @@ class TestSalesforceApiClient: sut = SalesforceApiClient() actual = sut.fetch_sf_count(soql) - assert actual == 16 + assert actual == 17 def test_fetch_sf_data_one_record(self): """ @@ -422,6 +424,63 @@ class TestSalesforceApiClient: assert dict(actual[0]) == expect + def test_fetch_sf_data_by_soql_builder_address_item_check(self): + """ + Cases: + - SOQLBuilderから生成したSOQLで、Salesforceからオブジェクトが取得できること + - SystemModStampのFromが2000年1月1日以降のレコードが取得できること + - SystemModStampのToが2100年12月31日未満のレコードが取得できること + Arranges: + - SalesforceのAccountオブジェクトに、レコードを作成する + - LastFetchDatetimeのFromに2000年1月1日を指定する + - LastFetchDatetimeのToに2100年12月31日を指定する + Expects: + 取得できたオブジェクト件数が1件になる + 住所項目(BillingAddress)が想定通りの値になっていること + """ + + execute_datetime = ExecuteDateTime() + last_fetch_datetime = LastFetchDatetime({ + 'last_fetch_datetime_from': '2022-08-19T05:53:29.000Z', + 'last_fetch_datetime_to': '2022-08-19T05:53:30.000Z', + }, execute_datetime) + target_object = TargetObject({ + 'object_name': 'Account', + 'columns': [ + 'Id', + 'Name', + 'SystemModstamp', + 'LastModifiedDate', + 'BillingAddress', + 'CustomItem1__c', + 'CustomItem2__c', + 'CustomItem3__c', + 'CustomItem4__c', + 'CustomItem5__c', + 'CustomItem6__c', + 'CustomItem7__c', + 'CustomItem8__c' + ] + }, execute_datetime) + soql_builder = SOQLBuilder(target_object, last_fetch_datetime) + soql = soql_builder.create_fetch_soql() + sut = SalesforceApiClient() + + actual = sut.fetch_sf_data(soql) + assert len(actual) == 1 + expect_address = OrderedDict([ + ("city", '〇〇区'), + ("country", "日本"), + ("geocodeAccuracy", None), + ("latitude", None), + ("longitude", None), + ("postalCode", '999-9999'), + ("state", '東京都'), + ("street", '△△-✗✗'), + ]) + + assert actual[0]['BillingAddress'] == expect_address + def test_fetch_sf_data_by_soql_builder_system_modstamp_all_range(self): """ Cases: @@ -433,7 +492,7 @@ class TestSalesforceApiClient: - LastFetchDatetimeのFromに2000年1月1日を指定する - LastFetchDatetimeのToに2100年12月31日を指定する Expects: - 取得できたオブジェクト件数が16件になる + 取得できたオブジェクト件数が17件になる """ execute_datetime = ExecuteDateTime() @@ -463,7 +522,7 @@ class TestSalesforceApiClient: sut = SalesforceApiClient() actual = sut.fetch_sf_data(soql) - assert len(actual) == 16 + assert len(actual) == 17 # 内容の確認は別のケースで行っているため省略 def test_raise_create_instance_cause_auth_failed(self, monkeypatch): From 2e24ce85f2079b6abeadf38b16721961148df3b0 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 Aug 2022 16:11:33 +0900 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20dict=E5=9E=8B=E3=81=AE=E5=A4=89?= =?UTF-8?q?=E6=8F=9B=E5=99=A8=E7=94=9F=E6=88=90=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/converter/convert_strategy.py | 10 +++++ .../tests/converter/test_convert_strategy.py | 45 +++++++++++++++++-- 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/ecs/crm-datafetch/src/converter/convert_strategy.py b/ecs/crm-datafetch/src/converter/convert_strategy.py index 22fca8fc..3e092315 100644 --- a/ecs/crm-datafetch/src/converter/convert_strategy.py +++ b/ecs/crm-datafetch/src/converter/convert_strategy.py @@ -1,4 +1,5 @@ import re +from collections import OrderedDict from datetime import datetime from dateutil.tz import gettz @@ -17,6 +18,7 @@ class ConvertStrategyFactory: self.__datetime_convert_strategy = DatetimeConvertStrategy() self.__int_convert_strategy = IntConvertStrategy() self.__string_convert_strategy = StringConvertStrategy() + self.__dict_convert_strategy = DictConvertStrategy() def create(self, value): @@ -35,6 +37,8 @@ class ConvertStrategyFactory: elif type(value) == int: convert_strategy = self.__int_convert_strategy + elif type(value) == dict or type(value) == OrderedDict: + convert_strategy = self.__dict_convert_strategy else: convert_strategy = self.__string_convert_strategy @@ -78,3 +82,9 @@ class StringConvertStrategy: """string型を変換せずに返す処理""" # ConvertStrategyFactoryにて型チェックを行っているため値を変換せずに返す return convert_value + + +class DictConvertStrategy: + def convert_value(self, convert_value: str): + """dict型の項目を文字列に変換して返す処理""" + return convert_value diff --git a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py index 0e268fc4..77ecfea2 100644 --- a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py +++ b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py @@ -1,6 +1,9 @@ +from typing import OrderedDict + from src.converter.convert_strategy import (BooleanConvertStrategy, ConvertStrategyFactory, DatetimeConvertStrategy, + DictConvertStrategy, FloatConvertStrategy, IntConvertStrategy, NoneValueConvertStrategy, @@ -94,10 +97,10 @@ class TestConvertStrategyFactory: # Expects assert type(actual) == DatetimeConvertStrategy - def test_create_other_str(self): + def test_create_str(self): """ Cases: - 引数にSalesforce日付型以外の文字列を指定した場合、NonConvertStrategyインスタンスが返ってくること + 引数にSalesforce日付型以外の文字列を指定した場合、StringConvertStrategyインスタンスが返ってくること Arranges: - なし Expects: @@ -111,10 +114,10 @@ class TestConvertStrategyFactory: # Expects assert type(actual) == StringConvertStrategy - def test_create_other_int(self): + def test_create_int(self): """ Cases: - 引数に整数を指定した場合、NonConvertStrategyインスタンスが返ってくること + 引数に整数を指定した場合、IntConvertStrategyインスタンスが返ってくること Arranges: - なし Expects: @@ -128,6 +131,40 @@ class TestConvertStrategyFactory: # Expects assert type(actual) == IntConvertStrategy + def test_create_dict(self): + """ + Cases: + 引数に辞書型の値を指定した場合、IntConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create({'key': 'value'}) + + # Expects + assert type(actual) == DictConvertStrategy + + def test_create_ordered_dict_dict(self): + """ + Cases: + 引数に辞書型の値を指定した場合、IntConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(OrderedDict([('key', 'value')])) + + # Expects + assert type(actual) == DictConvertStrategy + class TestNoneValueConvertStrategy: From 5e857aa9c6cab1a37502def748ba3fb4835923c7 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 Aug 2022 16:33:49 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=E8=BE=9E=E6=9B=B8=E5=9E=8B?= =?UTF-8?q?=E9=A0=85=E7=9B=AE=E3=82=92=E6=96=87=E5=AD=97=E5=88=97=E3=81=AB?= =?UTF-8?q?=E5=A4=89=E6=8F=9B=E3=81=99=E3=82=8B=E5=87=A6=E7=90=86=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/converter/convert_strategy.py | 5 +- .../tests/converter/test_convert_strategy.py | 58 ++++++++++++++++++- .../tests/salesforce/test_salesforce.py | 1 + 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/ecs/crm-datafetch/src/converter/convert_strategy.py b/ecs/crm-datafetch/src/converter/convert_strategy.py index 3e092315..5f3daf9d 100644 --- a/ecs/crm-datafetch/src/converter/convert_strategy.py +++ b/ecs/crm-datafetch/src/converter/convert_strategy.py @@ -1,3 +1,4 @@ +import json import re from collections import OrderedDict from datetime import datetime @@ -85,6 +86,6 @@ class StringConvertStrategy: class DictConvertStrategy: - def convert_value(self, convert_value: str): + def convert_value(self, convert_value: dict): """dict型の項目を文字列に変換して返す処理""" - return convert_value + return json.dumps(convert_value, ensure_ascii=False) diff --git a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py index 77ecfea2..20d5f655 100644 --- a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py +++ b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py @@ -1,4 +1,4 @@ -from typing import OrderedDict +from collections import OrderedDict from src.converter.convert_strategy import (BooleanConvertStrategy, ConvertStrategyFactory, @@ -301,3 +301,59 @@ class TestStringConvertStrategy: # Expects assert actual == 'テストデータ' + + +class TestDictConvertStrategy: + + def test_convert_value_dict(self): + """ + Cases: + 引数に辞書型のデータを指定した場合、JSONの文字列が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = DictConvertStrategy() + actual = sut.convert_value({'テストデータキー': 'テストデータバリュー'}) + + # Expects + assert actual == '{"テストデータキー": "テストデータバリュー"}' + + def test_convert_value_dict_in_line_break(self): + """ + Cases: + 引数に辞書型のデータを指定した場合、JSONの文字列が返ってくること(バリューに改行を含む) + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = DictConvertStrategy() + actual = sut.convert_value({'テストデータキー': 'テスト\nデータ\nバリュー'}) + + # Expects + assert actual == '{"テストデータキー": "テスト\\nデータ\\nバリュー"}' + + def test_convert_value_ordered_dict(self): + """ + Cases: + 引数に整列された辞書型のデータを指定した場合、JSONの文字列が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = DictConvertStrategy() + actual = sut.convert_value(OrderedDict( + [('テストデータキー', 'テストデータバリュー')] + )) + + # Expects + assert actual == '{"テストデータキー": "テストデータバリュー"}' diff --git a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py index 2b02a5cb..9547b97d 100644 --- a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py +++ b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py @@ -507,6 +507,7 @@ class TestSalesforceApiClient: 'Name', 'SystemModstamp', 'LastModifiedDate', + 'BillingAddress', 'CustomItem1__c', 'CustomItem2__c', 'CustomItem3__c', From dfaa405d724073ba559ff4306e37a87247616420 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Fri, 19 Aug 2022 17:17:38 +0900 Subject: [PATCH 4/6] =?UTF-8?q?feat:=20=E5=A4=89=E6=8F=9B=E5=87=A6?= =?UTF-8?q?=E7=90=86=E3=81=AE=E5=8D=98=E4=BD=93=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=81=A7=E3=80=81JSON=E5=9E=8B=E3=81=AE=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E3=81=AE=E5=A4=89=E6=8F=9B=E3=83=86=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=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 | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 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 49d960c0..9615d234 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 @@ -34,7 +34,17 @@ class TestConvertCrmCsvDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', True) + ('IsDeleted', True), + ('PersonMailingAddress', OrderedDict([ + ('PersonMailingStreet', 'Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit, \nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'), # noqa: E501 + ('PersonMailingCity', 'New york city'), + ('PersonMailingState', 'Ohaio'), + ('PersonMailingPostalCode', '999-9999'), + ('PersonMailingCountry', 'US'), + ('PersonMailingLatitude', 50.1234567), + ('PersonMailingLongitude', 103.1234567), + ('PersonMailingGeocodeAccuracy', 'Address'), + ])), ]), OrderedDict([ ('attributes', OrderedDict([('type', 'Account'), @@ -44,7 +54,17 @@ class TestConvertCrmCsvDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', False) + ('IsDeleted', False), + ('PersonMailingAddress', OrderedDict([ + ('PersonMailingStreet', 'Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit, \nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'), # noqa: E501 + ('PersonMailingCity', 'New york city'), + ('PersonMailingState', 'Ohaio'), + ('PersonMailingPostalCode', '999-9999'), + ('PersonMailingCountry', 'US'), + ('PersonMailingLatitude', 50.1234567), + ('PersonMailingLongitude', 103.1234567), + ('PersonMailingGeocodeAccuracy', 'Address'), + ])), ]), OrderedDict([ ('attributes', OrderedDict([('type', 'Account'), @@ -54,7 +74,17 @@ class TestConvertCrmCsvDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', False) + ('IsDeleted', False), + ('PersonMailingAddress', OrderedDict([ + ('PersonMailingStreet', 'Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit, \nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'), # noqa: E501 + ('PersonMailingCity', 'New york city'), + ('PersonMailingState', 'Ohaio'), + ('PersonMailingPostalCode', '999-9999'), + ('PersonMailingCountry', 'US'), + ('PersonMailingLatitude', 50.1234567), + ('PersonMailingLongitude', 103.1234567), + ('PersonMailingGeocodeAccuracy', 'Address'), + ])), ]), ] @@ -66,7 +96,8 @@ class TestConvertCrmCsvDataProcess: 'LastModifiedDate', 'LastModifiedById', 'SystemModstamp', - 'IsDeleted' + 'IsDeleted', + 'PersonMailingAddress' ] } @@ -79,10 +110,10 @@ class TestConvertCrmCsvDataProcess: # 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\ + "Id","AccountNumber","LastModifiedDate","LastModifiedById","SystemModstamp","IsDeleted","PersonMailingAddress"\r\n\ + "TEST001","test001","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","1","{""PersonMailingStreet"": ""Lorem ipsum dolor sit amet, \\nconsectetur adipiscing elit, \\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua."", ""PersonMailingCity"": ""New york city"", ""PersonMailingState"": ""Ohaio"", ""PersonMailingPostalCode"": ""999-9999"", ""PersonMailingCountry"": ""US"", ""PersonMailingLatitude"": 50.1234567, ""PersonMailingLongitude"": 103.1234567, ""PersonMailingGeocodeAccuracy"": ""Address""}"\r\n\ + "TEST002","test002","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","0","{""PersonMailingStreet"": ""Lorem ipsum dolor sit amet, \\nconsectetur adipiscing elit, \\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua."", ""PersonMailingCity"": ""New york city"", ""PersonMailingState"": ""Ohaio"", ""PersonMailingPostalCode"": ""999-9999"", ""PersonMailingCountry"": ""US"", ""PersonMailingLatitude"": 50.1234567, ""PersonMailingLongitude"": 103.1234567, ""PersonMailingGeocodeAccuracy"": ""Address""}"\r\n\ + "TEST003","test003","2022-06-01 09:00:00","1234567","2022-06-01 09:00:00","0","{""PersonMailingStreet"": ""Lorem ipsum dolor sit amet, \\nconsectetur adipiscing elit, \\nsed do eiusmod tempor incididunt ut labore et dolore magna aliqua."", ""PersonMailingCity"": ""New york city"", ""PersonMailingState"": ""Ohaio"", ""PersonMailingPostalCode"": ""999-9999"", ""PersonMailingCountry"": ""US"", ""PersonMailingLatitude"": 50.1234567, ""PersonMailingLongitude"": 103.1234567, ""PersonMailingGeocodeAccuracy"": ""Address""}"\r\n\ """ # 返り値の期待値チェック assert isinstance(actual_csv_string, str), 'CSV文字列が返却される' From f052732e20e9df31c0dfe2f2ff80d068291f306b Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Aug 2022 11:46:31 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=E4=BD=8F=E6=89=80=E9=A0=85?= =?UTF-8?q?=E7=9B=AE=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 --- .../tests/salesforce/test_salesforce.py | 36 +++++++++++-------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py index 9547b97d..c06ce546 100644 --- a/ecs/crm-datafetch/tests/salesforce/test_salesforce.py +++ b/ecs/crm-datafetch/tests/salesforce/test_salesforce.py @@ -428,12 +428,10 @@ class TestSalesforceApiClient: """ Cases: - SOQLBuilderから生成したSOQLで、Salesforceからオブジェクトが取得できること - - SystemModStampのFromが2000年1月1日以降のレコードが取得できること - - SystemModStampのToが2100年12月31日未満のレコードが取得できること + - できること Arranges: - - SalesforceのAccountオブジェクトに、レコードを作成する - - LastFetchDatetimeのFromに2000年1月1日を指定する - - LastFetchDatetimeのToに2100年12月31日を指定する + - SalesforceのAccountオブジェクトに、住所項目を持つレコードを作成する + - 住所項目を持つレコードだけが取れるよう日付を設定する Expects: 取得できたオブジェクト件数が1件になる 住所項目(BillingAddress)が想定通りの値になっていること @@ -441,8 +439,8 @@ class TestSalesforceApiClient: execute_datetime = ExecuteDateTime() last_fetch_datetime = LastFetchDatetime({ - 'last_fetch_datetime_from': '2022-08-19T05:53:29.000Z', - 'last_fetch_datetime_to': '2022-08-19T05:53:30.000Z', + 'last_fetch_datetime_from': '2022-08-23T02:38:00.000Z', + 'last_fetch_datetime_to': '2022-08-23T02:39:00.000Z', }, execute_datetime) target_object = TargetObject({ 'object_name': 'Account', @@ -451,15 +449,15 @@ class TestSalesforceApiClient: 'Name', 'SystemModstamp', 'LastModifiedDate', + 'BillingStreet', + 'BillingCity', + 'BillingState', + 'BillingPostalCode', + 'BillingCountry', + 'BillingLatitude', + 'BillingLongitude', + 'BillingGeocodeAccuracy', 'BillingAddress', - 'CustomItem1__c', - 'CustomItem2__c', - 'CustomItem3__c', - 'CustomItem4__c', - 'CustomItem5__c', - 'CustomItem6__c', - 'CustomItem7__c', - 'CustomItem8__c' ] }, execute_datetime) soql_builder = SOQLBuilder(target_object, last_fetch_datetime) @@ -480,6 +478,14 @@ class TestSalesforceApiClient: ]) assert actual[0]['BillingAddress'] == expect_address + assert actual[0]['BillingCity'] == '〇〇区' + assert actual[0]['BillingCountry'] == '日本' + assert actual[0]['BillingGeocodeAccuracy'] is None + assert actual[0]['BillingLatitude'] is None + assert actual[0]['BillingLongitude'] is None + assert actual[0]['BillingPostalCode'] == '999-9999' + assert actual[0]['BillingState'] == '東京都' + assert actual[0]['BillingStreet'] == '△△-✗✗' def test_fetch_sf_data_by_soql_builder_system_modstamp_all_range(self): """ From 4ffb55563ba27b64154c20e1e15146c3fa078d85 Mon Sep 17 00:00:00 2001 From: "shimoda.m@nds-tyo.co.jp" Date: Tue, 23 Aug 2022 11:48:13 +0900 Subject: [PATCH 6/6] =?UTF-8?q?fix:=20JSON=E5=86=85=E3=81=AE=E6=97=A5?= =?UTF-8?q?=E6=9C=AC=E8=AA=9E=E3=81=8CHex=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E5=80=A4=E3=81=A7=E5=87=BA=E5=8A=9B=E3=81=95=E3=82=8C=E3=81=A6?= =?UTF-8?q?=E3=81=84=E3=82=8B=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecs/crm-datafetch/src/aws/s3.py | 4 ++-- .../tests/test_backup_crm_data_process.py | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ecs/crm-datafetch/src/aws/s3.py b/ecs/crm-datafetch/src/aws/s3.py index d5bd03f0..7b63861f 100644 --- a/ecs/crm-datafetch/src/aws/s3.py +++ b/ecs/crm-datafetch/src/aws/s3.py @@ -87,7 +87,7 @@ class BackupBucket: def put_response_json(self, file_path: str, data: dict) -> None: object_key = f'{RESPONSE_JSON_BACKUP_FOLDER}/{file_path}' - self.__s3_resource.put_object(object_key, json.dumps(data)) + self.__s3_resource.put_object(object_key, json.dumps(data, ensure_ascii=False)) return def put_csv(self, file_path: str, data: str) -> None: @@ -97,5 +97,5 @@ class BackupBucket: def put_result_json(self, file_path: str, data: dict) -> None: object_key = f'{PROCESS_RESULT_FOLDER}/{file_path}' - self.__s3_resource.put_object(object_key, json.dumps(data)) + self.__s3_resource.put_object(object_key, json.dumps(data, ensure_ascii=False)) return diff --git a/ecs/crm-datafetch/tests/test_backup_crm_data_process.py b/ecs/crm-datafetch/tests/test_backup_crm_data_process.py index 9ad35d52..4e48c419 100644 --- a/ecs/crm-datafetch/tests/test_backup_crm_data_process.py +++ b/ecs/crm-datafetch/tests/test_backup_crm_data_process.py @@ -44,7 +44,8 @@ class TestBackupCrmDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', False) + ('IsDeleted', False), + ('Name', 'テスト取引先1') ]), OrderedDict([ ('attributes', OrderedDict([('type', 'Account'), @@ -54,7 +55,8 @@ class TestBackupCrmDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', False) + ('IsDeleted', False), + ('Name', 'テスト取引先2') ]), OrderedDict([ ('attributes', OrderedDict([('type', 'Account'), @@ -64,7 +66,8 @@ class TestBackupCrmDataProcess: ('LastModifiedDate', '2022-06-01T00:00:00.000+0000'), ('LastModifiedById', 1.234567E+6), ('SystemModstamp', '2022-06-01T00:00:00.000+0000'), - ('IsDeleted', False) + ('IsDeleted', False), + ('Name', 'テスト取引先3') ]), ] @@ -96,7 +99,7 @@ class TestBackupCrmDataProcess: actual = s3_client.get_object( Bucket=bucket_name, Key=f'response_json/{execute_datetime.to_path()}/CRM_Account_{execute_datetime.format_date()}.json') - assert actual['Body'].read().decode('utf-8') == json.dumps(response_json) + assert actual['Body'].read().decode('utf-8') == json.dumps(response_json, ensure_ascii=False) # ログの確認 assert generate_log_message_tuple(