From a40bad20333ef1a2c5ded2c19901131cda007b6f Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Mon, 8 Aug 2022 20:26:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20convert=5Fstrategy=E3=81=AE?= =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=82=B3=E3=83=BC=E3=83=89=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/converter/convert_strategy.py | 2 +- ecs/crm-datafetch/src/system_var/constants.py | 4 +- .../tests/converter/test_convert_strategy.py | 262 ++++++++++++++++++ 3 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 ecs/crm-datafetch/tests/converter/test_convert_strategy.py diff --git a/ecs/crm-datafetch/src/converter/convert_strategy.py b/ecs/crm-datafetch/src/converter/convert_strategy.py index 8664d7cd..de8c124a 100644 --- a/ecs/crm-datafetch/src/converter/convert_strategy.py +++ b/ecs/crm-datafetch/src/converter/convert_strategy.py @@ -59,5 +59,5 @@ class FloatConvertStrategy: class NonConvertStrategy: - def convert_value(self, convert_value: str): + def convert_value(self, convert_value): return convert_value diff --git a/ecs/crm-datafetch/src/system_var/constants.py b/ecs/crm-datafetch/src/system_var/constants.py index bf65010c..788c0409 100644 --- a/ecs/crm-datafetch/src/system_var/constants.py +++ b/ecs/crm-datafetch/src/system_var/constants.py @@ -71,8 +71,8 @@ UPD_JP_NAME = '前回取得日時ファイル更新' END_JP_NAME = '取得処理実施結果アップロード処理' # CSVチェック -CSV_TRUE_VALUE = '1' -CSV_FALSE_VALUE = '0' +CSV_TRUE_VALUE = 1 +CSV_FALSE_VALUE = 0 # オブジェクト変数 OBJECTS_KEY = 'objects' diff --git a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py new file mode 100644 index 00000000..1018db5c --- /dev/null +++ b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py @@ -0,0 +1,262 @@ +from src.converter.convert_strategy import (BooleanConvertStrategy, + ConvertStrategyFactory, + DatetimeConvertStrategy, + FloatConvertStrategy, + NonConvertStrategy, + NoneValueConvertStrategy) + + +class TestConvertStrategyFactory: + + def test_create_none(self): + """ + Cases: + 引数にnull(None)を指定した場合、NoneValueConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(None) + + # Expects + assert type(actual).__name__ == "NoneValueConvertStrategy" + + def test_create_float(self): + """ + Cases: + 引数に指数表記を指定した場合、FloatConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(1.2345678E7) + + # Expects + assert type(actual).__name__ == "FloatConvertStrategy" + + def test_create_bool_true(self): + """ + Cases: + 引数に論理値(True)を指定した場合、BooleanConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(True) + + # Expects + assert type(actual).__name__ == "BooleanConvertStrategy" + + def test_create_bool_false(self): + """ + Cases: + 引数に論理値(False)を指定した場合、BooleanConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(False) + + # Expects + assert type(actual).__name__ == "BooleanConvertStrategy" + + def test_create_datetime(self): + """ + Cases: + 引数に文字列かつ日付文字列を指定した場合、DatetimeConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create('2022-06-13T10:15:32.000+0000') + + # Expects + assert type(actual).__name__ == "DatetimeConvertStrategy" + + def test_create_other_str(self): + """ + Cases: + 引数にSalesforce日付型以外の文字列を指定した場合、NonConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create('test_string') + + # Expects + assert type(actual).__name__ == "NonConvertStrategy" + + def test_create_other_int(self): + """ + Cases: + 引数に整数を指定した場合、NonConvertStrategyインスタンスが返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = ConvertStrategyFactory() + actual = sut.create(100) + + # Expects + assert type(actual).__name__ == "NonConvertStrategy" + + +class TestNoneValueConvertStrategy: + + def test_convert_value(self) -> str: + """ + Cases: + 引数にnull(None)を指定した場合、''(空文字)が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = NoneValueConvertStrategy() + actual = sut.convert_value(None) + + # Expects + assert actual == "" + + +class TestBooleanConvertStrategy: + + def test_convert_value_true(self) -> bool: + """ + Cases: + 引数に論理値(True)を指定した場合、数値(1)が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = BooleanConvertStrategy() + actual = sut.convert_value(True) + + # Expects + assert actual == 1 + + def test_convert_value_false(self) -> bool: + """ + Cases: + 引数に論理値(False)を指定した場合、数値(0)が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = BooleanConvertStrategy() + actual = sut.convert_value(False) + + # Expects + assert actual == 0 + + +class TestDatetimeConvertStrategy: + + def test_convert_value(self) -> str: + """ + Cases: + 引数に日付文字列を指定した場合、YYYY-MM-DD HH:MM:SSがJSTで返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = DatetimeConvertStrategy() + actual = sut.convert_value('2022-06-13T20:15:32.000+0000') + + # Expects + assert actual == "2022-06-14 05:15:32" + + +class TestFloatConvertStrategy: + + def test_convert_value(self) -> int: + """ + Cases: + 引数に指数表記を指定した場合、整数で返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = FloatConvertStrategy() + actual = sut.convert_value(1.2345678E7) + + # Expects + assert actual == 12345678 + + +class TestNonConvertStrategy: + + def test_convert_value_str(self): + """ + Cases: + 引数に文字列を指定した場合、加工されず文字列が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = NonConvertStrategy() + actual = sut.convert_value('テストデータ') + + # Expects + assert actual == 'テストデータ' + + def test_convert_value_int(self): + """ + Cases: + 引数に整数を指定した場合、加工されず整数が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = NonConvertStrategy() + actual = sut.convert_value(100) + + # Expects + assert actual == 100 From 63cdbd6c0331a43d9669ba366bb95e8a04760410 Mon Sep 17 00:00:00 2001 From: Y_SAKAI Date: Tue, 16 Aug 2022 12:09:37 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E3=83=AC=E3=83=93=E3=83=A5=E3=83=BC?= =?UTF-8?q?=E6=8C=87=E6=91=98=E7=82=B9=E3=81=AE=E5=8F=8D=E6=98=A0=E3=80=81?= =?UTF-8?q?int=E5=9E=8B=E3=81=A8string=E5=9E=8B=E3=81=AE=E5=88=A4=E5=AE=9A?= =?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 | 25 ++++++-- .../tests/converter/test_convert_strategy.py | 62 ++++++++++--------- 2 files changed, 54 insertions(+), 33 deletions(-) diff --git a/ecs/crm-datafetch/src/converter/convert_strategy.py b/ecs/crm-datafetch/src/converter/convert_strategy.py index de8c124a..22fca8fc 100644 --- a/ecs/crm-datafetch/src/converter/convert_strategy.py +++ b/ecs/crm-datafetch/src/converter/convert_strategy.py @@ -15,7 +15,8 @@ class ConvertStrategyFactory: self.__float_convert_strategy = FloatConvertStrategy() self.__boolean_convert_strategy = BooleanConvertStrategy() self.__datetime_convert_strategy = DatetimeConvertStrategy() - self.__non_convert_strategy = NonConvertStrategy() + self.__int_convert_strategy = IntConvertStrategy() + self.__string_convert_strategy = StringConvertStrategy() def create(self, value): @@ -31,33 +32,49 @@ class ConvertStrategyFactory: elif type(value) == str and re.fullmatch(DATE_PATTERN_YYYYMMDDHHMMSSFFF_UTC, value): convert_strategy = self.__datetime_convert_strategy + elif type(value) == int: + convert_strategy = self.__int_convert_strategy + else: - convert_strategy = self.__non_convert_strategy + convert_strategy = self.__string_convert_strategy return convert_strategy class NoneValueConvertStrategy: def convert_value(self, convert_value: None) -> str: + """Noneを''空文字に変換する処理""" return '' class BooleanConvertStrategy: def convert_value(self, convert_value: str) -> bool: + """booleanを数値に変換する処理""" return CSV_TRUE_VALUE if convert_value is True else CSV_FALSE_VALUE class DatetimeConvertStrategy: def convert_value(self, convert_value: str) -> str: + """UTCのdatetime文字列をJSTの日時文字列に変換する処理""" # データ登録処理がJSTとして登録するため、変換処理内で事前にJSTの日時文字列に変換する return datetime.strptime(convert_value, CRM_DATETIME_FORMAT).astimezone(gettz(CONVERT_TZ)).strftime(YYYYMMDDHHMMSS) class FloatConvertStrategy: def convert_value(self, convert_value: str) -> int: + """float型をint型に変換する処理""" return int(convert_value) -class NonConvertStrategy: - def convert_value(self, convert_value): +class IntConvertStrategy: + def convert_value(self, convert_value: int): + """int型を変換せずに返す処理""" + # ConvertStrategyFactoryにて型チェックを行っているため値を変換せずに返す + return convert_value + + +class StringConvertStrategy: + def convert_value(self, convert_value: str): + """string型を変換せずに返す処理""" + # ConvertStrategyFactoryにて型チェックを行っているため値を変換せずに返す 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 1018db5c..0e268fc4 100644 --- a/ecs/crm-datafetch/tests/converter/test_convert_strategy.py +++ b/ecs/crm-datafetch/tests/converter/test_convert_strategy.py @@ -2,8 +2,9 @@ from src.converter.convert_strategy import (BooleanConvertStrategy, ConvertStrategyFactory, DatetimeConvertStrategy, FloatConvertStrategy, - NonConvertStrategy, - NoneValueConvertStrategy) + IntConvertStrategy, + NoneValueConvertStrategy, + StringConvertStrategy) class TestConvertStrategyFactory: @@ -23,7 +24,7 @@ class TestConvertStrategyFactory: actual = sut.create(None) # Expects - assert type(actual).__name__ == "NoneValueConvertStrategy" + assert type(actual) == NoneValueConvertStrategy def test_create_float(self): """ @@ -40,7 +41,7 @@ class TestConvertStrategyFactory: actual = sut.create(1.2345678E7) # Expects - assert type(actual).__name__ == "FloatConvertStrategy" + assert type(actual) == FloatConvertStrategy def test_create_bool_true(self): """ @@ -57,7 +58,7 @@ class TestConvertStrategyFactory: actual = sut.create(True) # Expects - assert type(actual).__name__ == "BooleanConvertStrategy" + assert type(actual) == BooleanConvertStrategy def test_create_bool_false(self): """ @@ -74,7 +75,7 @@ class TestConvertStrategyFactory: actual = sut.create(False) # Expects - assert type(actual).__name__ == "BooleanConvertStrategy" + assert type(actual) == BooleanConvertStrategy def test_create_datetime(self): """ @@ -91,7 +92,7 @@ class TestConvertStrategyFactory: actual = sut.create('2022-06-13T10:15:32.000+0000') # Expects - assert type(actual).__name__ == "DatetimeConvertStrategy" + assert type(actual) == DatetimeConvertStrategy def test_create_other_str(self): """ @@ -108,7 +109,7 @@ class TestConvertStrategyFactory: actual = sut.create('test_string') # Expects - assert type(actual).__name__ == "NonConvertStrategy" + assert type(actual) == StringConvertStrategy def test_create_other_int(self): """ @@ -125,7 +126,7 @@ class TestConvertStrategyFactory: actual = sut.create(100) # Expects - assert type(actual).__name__ == "NonConvertStrategy" + assert type(actual) == IntConvertStrategy class TestNoneValueConvertStrategy: @@ -225,26 +226,9 @@ class TestFloatConvertStrategy: assert actual == 12345678 -class TestNonConvertStrategy: +class TestIntConvertStrategy: - def test_convert_value_str(self): - """ - Cases: - 引数に文字列を指定した場合、加工されず文字列が返ってくること - Arranges: - - なし - Expects: - - 戻り値が、期待値と一致する - """ - - # Act - sut = NonConvertStrategy() - actual = sut.convert_value('テストデータ') - - # Expects - assert actual == 'テストデータ' - - def test_convert_value_int(self): + def test_convert_value(self): """ Cases: 引数に整数を指定した場合、加工されず整数が返ってくること @@ -255,8 +239,28 @@ class TestNonConvertStrategy: """ # Act - sut = NonConvertStrategy() + sut = IntConvertStrategy() actual = sut.convert_value(100) # Expects assert actual == 100 + + +class TestStringConvertStrategy: + + def test_convert_value(self): + """ + Cases: + 引数に文字列を指定した場合、加工されず文字列が返ってくること + Arranges: + - なし + Expects: + - 戻り値が、期待値と一致する + """ + + # Act + sut = StringConvertStrategy() + actual = sut.convert_value('テストデータ') + + # Expects + assert actual == 'テストデータ'