diff --git a/tests/states_group.py b/tests/states_group.py new file mode 100644 index 00000000..8593cea3 --- /dev/null +++ b/tests/states_group.py @@ -0,0 +1,102 @@ +import pytest + +from aiogram.dispatcher.filters.state import State, StatesGroup, any_state, default_state + + +class MyGroup(StatesGroup): + state = State() + state_1 = State() + state_2 = State() + + class MySubGroup(StatesGroup): + sub_state = State() + sub_state_1 = State() + sub_state_2 = State() + + in_custom_group = State(group_name='custom_group') + + class NewGroup(StatesGroup): + spam = State() + renamed_state = State(state='spam_state') + + +alone_state = State('alone') +alone_in_group = State('alone', group_name='home') + + +def test_default_state(): + assert default_state.state is None + + +def test_any_state(): + assert any_state.state == '*' + + +def test_alone_state(): + assert alone_state.state == '@:alone' + assert alone_in_group.state == 'home:alone' + + +def test_group_names(): + assert MyGroup.__group_name__ == 'MyGroup' + assert MyGroup.__full_group_name__ == 'MyGroup' + + assert MyGroup.MySubGroup.__group_name__ == 'MySubGroup' + assert MyGroup.MySubGroup.__full_group_name__ == 'MyGroup.MySubGroup' + + assert MyGroup.MySubGroup.NewGroup.__group_name__ == 'NewGroup' + assert MyGroup.MySubGroup.NewGroup.__full_group_name__ == 'MyGroup.MySubGroup.NewGroup' + + +def test_custom_group_in_group(): + assert MyGroup.MySubGroup.in_custom_group.state == 'custom_group:in_custom_group' + + +def test_custom_state_name_in_group(): + assert MyGroup.MySubGroup.NewGroup.renamed_state.state == 'MyGroup.MySubGroup.NewGroup:spam_state' + + +def test_group_states_names(): + assert len(MyGroup.states) == 3 + assert len(MyGroup.all_states) == 9 + + assert MyGroup.states_names == ('MyGroup:state', 'MyGroup:state_1', 'MyGroup:state_2') + assert MyGroup.MySubGroup.states_names == ( + 'MyGroup.MySubGroup:sub_state', 'MyGroup.MySubGroup:sub_state_1', 'MyGroup.MySubGroup:sub_state_2', + 'custom_group:in_custom_group') + assert MyGroup.MySubGroup.NewGroup.states_names == ( + 'MyGroup.MySubGroup.NewGroup:spam', 'MyGroup.MySubGroup.NewGroup:spam_state') + + assert MyGroup.all_states_names == ( + 'MyGroup:state', 'MyGroup:state_1', 'MyGroup:state_2', + 'MyGroup.MySubGroup:sub_state', + 'MyGroup.MySubGroup:sub_state_1', + 'MyGroup.MySubGroup:sub_state_2', + 'custom_group:in_custom_group', + 'MyGroup.MySubGroup.NewGroup:spam', + 'MyGroup.MySubGroup.NewGroup:spam_state') + + assert MyGroup.MySubGroup.all_states_names == ( + 'MyGroup.MySubGroup:sub_state', + 'MyGroup.MySubGroup:sub_state_1', + 'MyGroup.MySubGroup:sub_state_2', + 'custom_group:in_custom_group', + 'MyGroup.MySubGroup.NewGroup:spam', + 'MyGroup.MySubGroup.NewGroup:spam_state') + + assert MyGroup.MySubGroup.NewGroup.all_states_names == ( + 'MyGroup.MySubGroup.NewGroup:spam', + 'MyGroup.MySubGroup.NewGroup:spam_state') + + +def test_root_element(): + root = MyGroup.MySubGroup.NewGroup.spam.get_root() + + assert issubclass(root, StatesGroup) + assert root == MyGroup + + assert root == MyGroup.state.get_root() + assert root == MyGroup.MySubGroup.get_root() + + with pytest.raises(RuntimeError): + any_state.get_root()