diff --git a/aiogram/utils/helper.py b/aiogram/utils/helper.py index a7725f3e..67400511 100644 --- a/aiogram/utils/helper.py +++ b/aiogram/utils/helper.py @@ -79,7 +79,7 @@ class HelperMode(Helper): @classmethod def _snake_case(cls, text): """ - Transform text to snake cale (Based on SCREAMING_SNAKE_CASE) + Transform text to snake case (Based on SCREAMING_SNAKE_CASE) :param text: :return: diff --git a/tests/utils/__init__.py b/tests/test_utils/__init__.py similarity index 100% rename from tests/utils/__init__.py rename to tests/test_utils/__init__.py diff --git a/tests/test_utils/test_helper.py b/tests/test_utils/test_helper.py new file mode 100644 index 00000000..5477917e --- /dev/null +++ b/tests/test_utils/test_helper.py @@ -0,0 +1,127 @@ +import pytest +from aiogram.utils.helper import Helper, HelperMode, Item, ListItem, OrderedHelper + + +class TestHelper: + def test_items_all(self): + class MyHelper(Helper): + A = Item() + B = Item() + C = Item() + D = Item() + + assert set(MyHelper.all()) == {"A", "B", "C", "D"} + + def test_listed_items_all(self): + class MyHelper(Helper): + A = ListItem() + B = ListItem() + C = ListItem() + D = ListItem() + + assert set(MyHelper.all()) == {"A", "B", "C", "D"} + + def test_listed_items_combinations(self): + class MyHelper(Helper): + A = ListItem() + B = ListItem() + C = ListItem() + D = ListItem() + + assert (MyHelper.A | MyHelper.B) == ["A", "B"] + assert (MyHelper.C & MyHelper.D) == ["C", "D"] + assert MyHelper.A.add(MyHelper.D) == ["A", "D"] + assert MyHelper.B + MyHelper.D == ["B", "D"] + + def test_wrong_name(self): + with pytest.raises(RuntimeError): + + class MyHelper(Helper): + kaboom = Item() + + +class TestHelperMode: + def test_helper_mode_all(self): + assert set(HelperMode.all()) == { + "SCREAMING_SNAKE_CASE", + "lowerCamelCase", + "CamelCase", + "snake_case", + "lowercase", + } + + def test_screaming_snake_case(self): + class MyHelper(Helper): + mode = HelperMode.SCREAMING_SNAKE_CASE + + FOO = Item() + BAR_BAZ = Item() + + assert MyHelper.FOO == "FOO" + assert MyHelper.BAR_BAZ == "BAR_BAZ" + + def test_lower_camel_case(self): + class MyHelper(Helper): + mode = HelperMode.lowerCamelCase + + FOO = Item() + BAR_BAZ = Item() + + assert MyHelper.FOO == "foo" + assert MyHelper.BAR_BAZ == "barBaz" + + def test_camel_case(self): + class MyHelper(Helper): + mode = HelperMode.CamelCase + + FOO = Item() + BAR_BAZ = Item() + + assert MyHelper.FOO == "Foo" + assert MyHelper.BAR_BAZ == "BarBaz" + + def test_snake_case(self): + class MyHelper(Helper): + mode = HelperMode.snake_case + + FOO = Item() + BAR_BAZ = Item() + + assert MyHelper.FOO == "foo" + assert MyHelper.BAR_BAZ == "bar_baz" + + def test_lowercase(self): + class MyHelper(Helper): + mode = HelperMode.lowercase + + FOO = Item() + BAR_BAZ = Item() + + assert MyHelper.FOO == "foo" + assert MyHelper.BAR_BAZ == "barbaz" + + def test_extended_converters(self): + assert HelperMode.apply("test_text", mode=HelperMode.SCREAMING_SNAKE_CASE) == "TEST_TEXT" + assert HelperMode.apply("TestText", mode=HelperMode.SCREAMING_SNAKE_CASE) == "TEST_TEXT" + assert HelperMode.apply("test_text", mode=HelperMode.snake_case) == "test_text" + assert HelperMode.apply("foo", mode=lambda m: m.upper()) == "FOO" + + +class TestOrderedHelper: + def test_items_are_ordered(self): + class MyOrderedHelper(OrderedHelper): + A = Item() + D = Item() + C = Item() + B = Item() + + assert MyOrderedHelper.all() == ["A", "D", "C", "B"] + + def test_list_items_are_ordered(self): + class MyOrderedHelper(OrderedHelper): + A = ListItem() + D = ListItem() + C = ListItem() + B = ListItem() + + assert MyOrderedHelper.all() == ["A", "D", "C", "B"] diff --git a/tests/test_utils/test_mixins.py b/tests/test_utils/test_mixins.py new file mode 100644 index 00000000..720bd38e --- /dev/null +++ b/tests/test_utils/test_mixins.py @@ -0,0 +1,51 @@ +import pytest +from aiogram.utils.mixins import ContextInstanceMixin, DataMixin + + +class DataObject(DataMixin): + pass + + +class ContextObject(ContextInstanceMixin): + pass + + +class TestDataMixin: + def test_store_value(self): + obj = DataObject() + obj["foo"] = 42 + + assert "foo" in obj + assert obj["foo"] == 42 + assert len(obj.data) == 1 + + def test_remove_value(self): + obj = DataObject() + obj["foo"] = 42 + del obj["foo"] + + assert "key" not in obj + assert len(obj.data) == 0 + + def test_getter(self): + obj = DataObject() + obj["foo"] = 42 + + assert obj.get("foo") == 42 + assert obj.get("bar") is None + assert obj.get("baz", "test") == "test" + + +class TestContextInstanceMixin: + def test_empty(self): + obj = ContextObject() + + assert obj.get_current(no_error=True) is None + with pytest.raises(LookupError): + assert obj.get_current(no_error=False) + + def test_set_wrong_type(self): + obj = ContextObject() + + with pytest.raises(TypeError, match=r"Value should be instance of 'ContextObject' not '.+'"): + obj.set_current(42) diff --git a/tests/utils/test_mixins.py b/tests/utils/test_mixins.py deleted file mode 100644 index c2141127..00000000 --- a/tests/utils/test_mixins.py +++ /dev/null @@ -1,36 +0,0 @@ -from aiogram.utils.mixins import DataMixin - - -class MyClass(DataMixin): - pass - - -class TestDataMixin: - def test_store_value(self): - obj = MyClass() - obj["foo"] = 42 - - assert "foo" in obj - assert obj["foo"] == 42 - assert len(obj.data) == 1 - - def test_remove_value(self): - obj = MyClass() - obj["foo"] = 42 - del obj["foo"] - - assert "key" not in obj - assert len(obj.data) == 0 - - def test_getter(self): - obj = MyClass() - obj["foo"] = 42 - - assert obj.get("foo") == 42 - assert obj.get("bar") is None - assert obj.get("baz", "test") == "test" - - -class TestContextInstanceMixin: - def test_instance(self): - pass