aiogram/tests/test_utils/test_helper.py

216 lines
6 KiB
Python
Raw Normal View History

import pytest
from aiogram.utils.helper import DefaultProperty, 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()
2020-03-28 18:47:42 +03:00
def test_not_a_helper_subclass(self):
with pytest.raises(RuntimeError):
class NotAHelperSubclass:
A = 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"]
class TestDefaultDescriptor:
def test_descriptor_fs(self):
obj = type("ClassA", (), {})()
default_x_val = "some_x"
x = DefaultProperty(default_x_val)
x.__set_name__(owner=obj.__class__, name="x")
# we can omit owner, usually it's just obj.__class__
assert x.__get__(instance=obj, owner=None) == default_x_val
assert x.__get__(instance=obj, owner=obj.__class__) == default_x_val
new_x_val = "new_x"
assert x.__set__(instance=obj, value=new_x_val) is None
with pytest.raises(AttributeError) as exc:
x.__set__(instance=obj.__class__, value="will never be set")
assert "Instance cannot be class or None" in str(exc.value)
assert x.__get__(instance=obj, owner=obj.__class__) == new_x_val
with pytest.raises(AttributeError) as exc:
x.__delete__(instance=obj.__class__)
assert "Instance cannot be class or None" in str(exc.value)
x.__delete__(instance=obj)
assert x.__get__(instance=obj, owner=obj.__class__) == default_x_val
def test_set_name(self):
class A:
x = DefaultProperty("default")
a = A()
assert "_x" not in vars(a)
a.x = "new value"
assert "_x" in vars(a)
del a.x
assert "_x" not in vars(a)
assert a.x == "default"
class B:
x = DefaultProperty("default", name_resolver=lambda name: f"_{name}_4_{name}_")
b = B()
b.x = ">>"
assert "_x_4_x_" in vars(b)
C = type("C", (), {"x": DefaultProperty("default")})
c = C()
assert c.x == "default"
c.x = "new value"
assert "_x" in vars(c)
d = type("D", (), {})()
x = DefaultProperty("default")
with pytest.raises(AttributeError) as exc:
x.__set__(d, "new_value")
assert f"Name for descriptor was never set in {d}" in str(exc.value)
def test_init(self):
class A:
x = DefaultProperty(fget=lambda a_inst: "nothing")
a = A()
assert a.x == "nothing"
x = DefaultProperty("x")
assert x.__get__(None, None) == "x"
assert x.fget(None) == x.__get__(None, None)
with pytest.raises(ValueError) as exc:
class _:
x = DefaultProperty(default=None, fget=None)
assert "Either default or fget should be passed." in str(exc.value)