mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-12 10:11:52 +00:00
153 lines
5 KiB
Python
153 lines
5 KiB
Python
|
|
import pytest
|
||
|
|
|
||
|
|
from aiogram.dispatcher.fsm.state import State, StatesGroup, any_state
|
||
|
|
|
||
|
|
|
||
|
|
class TestState:
|
||
|
|
def test_empty(self):
|
||
|
|
state = State()
|
||
|
|
assert state._state is None
|
||
|
|
assert state._group_name is None
|
||
|
|
assert state._group is None
|
||
|
|
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
assert state.group
|
||
|
|
|
||
|
|
assert state.state is None
|
||
|
|
assert str(state) == "<State ''>"
|
||
|
|
|
||
|
|
def test_star(self):
|
||
|
|
state = State(state="*")
|
||
|
|
assert state._state == "*"
|
||
|
|
assert state._group_name is None
|
||
|
|
assert state._group is None
|
||
|
|
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
assert state.group
|
||
|
|
assert state.state == "*"
|
||
|
|
assert str(state) == "<State '*'>"
|
||
|
|
|
||
|
|
def test_star_filter(self):
|
||
|
|
assert any_state(None, "foo")
|
||
|
|
assert any_state(None, "bar")
|
||
|
|
assert any_state(None, "baz")
|
||
|
|
|
||
|
|
def test_alone(self):
|
||
|
|
state = State("test")
|
||
|
|
assert state._state == "test"
|
||
|
|
assert state._group_name is None
|
||
|
|
assert state._group is None
|
||
|
|
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
assert state.group
|
||
|
|
|
||
|
|
assert state.state == "@:test"
|
||
|
|
assert str(state) == "<State '@:test'>"
|
||
|
|
|
||
|
|
def test_alone_with_group(self):
|
||
|
|
state = State("test", group_name="Test")
|
||
|
|
assert state._state == "test"
|
||
|
|
assert state._group_name == "Test"
|
||
|
|
assert state._group is None
|
||
|
|
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
assert state.group == "Test"
|
||
|
|
|
||
|
|
assert state.state == "Test:test"
|
||
|
|
assert str(state) == "<State 'Test:test'>"
|
||
|
|
|
||
|
|
@pytest.mark.parametrize(
|
||
|
|
"state,check,result",
|
||
|
|
[
|
||
|
|
[State("test"), "test", False],
|
||
|
|
[State("test"), "@:test", True],
|
||
|
|
[State("test"), "test1", False],
|
||
|
|
[State("test", group_name="test"), "test:test", True],
|
||
|
|
[State("test", group_name="test"), "test:test2", False],
|
||
|
|
[State("test", group_name="test"), "test2:test", False],
|
||
|
|
[State("test", group_name="test"), "test2:test2", False],
|
||
|
|
],
|
||
|
|
)
|
||
|
|
def test_filter(self, state, check, result):
|
||
|
|
assert state(None, check) is result
|
||
|
|
|
||
|
|
def test_state_in_unknown_class(self):
|
||
|
|
with pytest.raises(RuntimeError):
|
||
|
|
|
||
|
|
class MyClass:
|
||
|
|
state1 = State()
|
||
|
|
|
||
|
|
|
||
|
|
class TestStatesGroup:
|
||
|
|
def test_empty(self):
|
||
|
|
class MyGroup(StatesGroup):
|
||
|
|
pass
|
||
|
|
|
||
|
|
assert MyGroup.__states__ == ()
|
||
|
|
assert MyGroup.__state_names__ == ()
|
||
|
|
assert MyGroup.__all_childs__ == ()
|
||
|
|
assert MyGroup.__all_states__ == ()
|
||
|
|
assert MyGroup.__all_states_names__ == ()
|
||
|
|
assert MyGroup.__parent__ is None
|
||
|
|
assert MyGroup.__full_group_name__ == "MyGroup"
|
||
|
|
|
||
|
|
assert str(MyGroup) == "<StatesGroup 'MyGroup'>"
|
||
|
|
|
||
|
|
def test_with_state(self):
|
||
|
|
class MyGroup(StatesGroup):
|
||
|
|
state1 = State()
|
||
|
|
|
||
|
|
assert MyGroup.__states__ == (MyGroup.state1,)
|
||
|
|
assert MyGroup.__state_names__ == ("MyGroup:state1",)
|
||
|
|
assert MyGroup.__all_childs__ == ()
|
||
|
|
assert MyGroup.__all_states__ == (MyGroup.state1,)
|
||
|
|
assert MyGroup.__parent__ is None
|
||
|
|
assert MyGroup.__full_group_name__ == "MyGroup"
|
||
|
|
|
||
|
|
assert str(MyGroup) == "<StatesGroup 'MyGroup'>"
|
||
|
|
|
||
|
|
assert MyGroup.state1.state == "MyGroup:state1"
|
||
|
|
assert MyGroup.state1.group == MyGroup
|
||
|
|
|
||
|
|
def test_nested_group(self):
|
||
|
|
class MyGroup(StatesGroup):
|
||
|
|
state1 = State()
|
||
|
|
|
||
|
|
class MyNestedGroup(StatesGroup):
|
||
|
|
state1 = State()
|
||
|
|
|
||
|
|
assert MyGroup.__states__ == (MyGroup.state1,)
|
||
|
|
assert MyGroup.__state_names__ == ("MyGroup:state1",)
|
||
|
|
assert MyGroup.__all_childs__ == (MyGroup.MyNestedGroup,)
|
||
|
|
assert MyGroup.__all_states__ == (MyGroup.state1, MyGroup.MyNestedGroup.state1)
|
||
|
|
assert MyGroup.__parent__ is None
|
||
|
|
assert MyGroup.MyNestedGroup.__parent__ is MyGroup
|
||
|
|
assert MyGroup.__full_group_name__ == "MyGroup"
|
||
|
|
assert MyGroup.MyNestedGroup.__full_group_name__ == "MyGroup.MyNestedGroup"
|
||
|
|
|
||
|
|
assert str(MyGroup) == "<StatesGroup 'MyGroup'>"
|
||
|
|
assert str(MyGroup.MyNestedGroup) == "<StatesGroup 'MyGroup.MyNestedGroup'>"
|
||
|
|
|
||
|
|
assert MyGroup.state1.state == "MyGroup:state1"
|
||
|
|
assert MyGroup.state1.group == MyGroup
|
||
|
|
|
||
|
|
assert MyGroup.MyNestedGroup.state1.state == "MyGroup.MyNestedGroup:state1"
|
||
|
|
assert MyGroup.MyNestedGroup.state1.group == MyGroup.MyNestedGroup
|
||
|
|
|
||
|
|
assert MyGroup.MyNestedGroup.state1 in MyGroup.MyNestedGroup
|
||
|
|
assert MyGroup.MyNestedGroup.state1 in MyGroup
|
||
|
|
assert MyGroup.state1 not in MyGroup.MyNestedGroup
|
||
|
|
assert MyGroup.state1 in MyGroup
|
||
|
|
|
||
|
|
# Not working as well
|
||
|
|
# assert MyGroup.MyNestedGroup in MyGroup
|
||
|
|
|
||
|
|
assert "MyGroup.MyNestedGroup:state1" in MyGroup
|
||
|
|
assert "MyGroup.MyNestedGroup:state1" in MyGroup.MyNestedGroup
|
||
|
|
|
||
|
|
assert MyGroup.state1 not in MyGroup.MyNestedGroup
|
||
|
|
assert "test" not in MyGroup
|
||
|
|
assert 42 not in MyGroup
|
||
|
|
|
||
|
|
assert MyGroup.MyNestedGroup.get_root() is MyGroup
|