aiogram/tests/test_dispatcher/test_fsm/test_state.py
2021-08-17 00:09:11 +03:00

184 lines
6.1 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
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
def test_empty_filter(self):
class MyGroup(StatesGroup):
pass
assert str(MyGroup()) == "StatesGroup MyGroup"
def test_with_state_filter(self):
class MyGroup(StatesGroup):
state1 = State()
state2 = State()
assert MyGroup()(None, "MyGroup:state1")
assert MyGroup()(None, "MyGroup:state2")
assert not MyGroup()(None, "MyGroup:state3")
assert str(MyGroup()) == "StatesGroup MyGroup"
def test_nested_group_filter(self):
class MyGroup(StatesGroup):
state1 = State()
class MyNestedGroup(StatesGroup):
state1 = State()
assert MyGroup()(None, "MyGroup:state1")
assert MyGroup()(None, "MyGroup.MyNestedGroup:state1")
assert not MyGroup()(None, "MyGroup:state2")
assert MyGroup.MyNestedGroup()(None, "MyGroup.MyNestedGroup:state1")
assert not MyGroup.MyNestedGroup()(None, "MyGroup:state1")
assert str(MyGroup()) == "StatesGroup MyGroup"
assert str(MyGroup.MyNestedGroup()) == "StatesGroup MyGroup.MyNestedGroup"