From dffbc17349fdc8299152ca6d632f7a6c4db933e0 Mon Sep 17 00:00:00 2001 From: Azide Date: Thu, 2 Jun 2022 00:24:51 +0800 Subject: [PATCH] =?UTF-8?q?chore:=E6=B7=BB=E5=8A=A0=E7=BE=A4=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=BD=E4=BB=A4=E7=9A=84=E5=8F=96=E6=B6=88=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BB=A5=E5=8F=8A=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/nonebot_bison/config_manager.py | 19 +++-- tests/test_config_manager_admin.py | 85 ++++++++++++++++++++- 2 files changed, 96 insertions(+), 8 deletions(-) diff --git a/src/plugins/nonebot_bison/config_manager.py b/src/plugins/nonebot_bison/config_manager.py index ec4c4f8..ab81812 100644 --- a/src/plugins/nonebot_bison/config_manager.py +++ b/src/plugins/nonebot_bison/config_manager.py @@ -353,7 +353,7 @@ async def send_group_list(bot: Bot, event: PrivateMessageEvent, state: T_State): for idx, group in enumerate(groups, 1): group_number_idx[idx] = group["group_id"] res_text += f'{idx}. {group["group_id"]} - {group["group_name"]}\n' - res_text += "请输入左侧序号" + res_text += "请输入左侧序号\n中止操作请输入'取消'" # await group_manage_matcher.send(res_text) state["_prompt"] = res_text state["group_number_idx"] = group_number_idx @@ -365,11 +365,16 @@ async def _parse_group_idx(state: T_State, event_msg: str = EventPlainText()): group_number_idx: Optional[dict[int, int]] = state.get("group_number_idx") assert group_number_idx try: + assert event_msg != "取消", "userAbort" idx = int(event_msg) - assert idx in group_number_idx.keys() + assert idx in group_number_idx.keys(), "idxNotInList" state["group_idx"] = idx - except: - await group_manage_matcher.reject("请输入正确序号") + except AssertionError as AE: + errType = AE.args[0] + if errType == "userAbort": + await group_manage_matcher.finish("已取消") + elif errType == "idxNotInList": + await group_manage_matcher.reject("请输入正确序号") @group_manage_matcher.got( @@ -383,13 +388,13 @@ async def do_choose_group_number(state: T_State): async def _check_command(event_msg: str = EventPlainText()): - if event_msg not in {"添加订阅", "查询订阅", "删除订阅"}: + if event_msg not in {"添加订阅", "查询订阅", "删除订阅", "取消"}: await group_manage_matcher.reject("请输入正确的命令") return @group_manage_matcher.got( - "command", "请输入需要使用的命令:添加订阅,查询订阅,删除订阅", [Depends(_check_command)] + "command", "请输入需要使用的命令:添加订阅,查询订阅,删除订阅,取消", [Depends(_check_command)] ) async def do_dispatch_command( bot: Bot, @@ -398,6 +403,8 @@ async def do_dispatch_command( matcher: Matcher, command: str = ArgStr(), ): + if command == "取消": + await group_manage_matcher.finish("已取消") permission = await matcher.update_permission(bot, event) new_matcher = Matcher.new( "message", diff --git a/tests/test_config_manager_admin.py b/tests/test_config_manager_admin.py index 51d7e35..c809b37 100644 --- a/tests/test_config_manager_admin.py +++ b/tests/test_config_manager_admin.py @@ -25,7 +25,9 @@ async def test_query_with_superuser_private(app: App): "get_group_list", {}, [{"group_id": 101, "group_name": "test group"}] ) ctx.should_call_send( - event, Message("请选择需要管理的群:\n1. 101 - test group\n请输入左侧序号"), True + event, + Message("请选择需要管理的群:\n1. 101 - test group\n请输入左侧序号\n中止操作请输入'取消'"), + True, ) event_1_err = fake_private_message_event( message=Message("0"), @@ -43,7 +45,7 @@ async def test_query_with_superuser_private(app: App): user_id=fake_superuser.user_id, ) ctx.receive_event(bot, event_1_ok) - ctx.should_call_send(event_1_ok, "请输入需要使用的命令:添加订阅,查询订阅,删除订阅", True) + ctx.should_call_send(event_1_ok, "请输入需要使用的命令:添加订阅,查询订阅,删除订阅,取消", True) event_2_err = fake_private_message_event( message=Message("222"), sender=fake_superuser, @@ -64,6 +66,85 @@ async def test_query_with_superuser_private(app: App): ctx.should_pass_permission() +@pytest.mark.asyncio +async def test_query_with_abort_on_idx(app: App): + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + from nonebot_bison.config_manager import group_manage_matcher + + async with app.test_matcher(group_manage_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event = fake_private_message_event( + message=Message("群管理"), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event) + ctx.should_pass_rule() + ctx.should_pass_permission() + ctx.should_call_api( + "get_group_list", {}, [{"group_id": 101, "group_name": "test group"}] + ) + ctx.should_call_send( + event, + Message("请选择需要管理的群:\n1. 101 - test group\n请输入左侧序号\n中止操作请输入'取消'"), + True, + ) + event_abort = fake_private_message_event( + message=Message("取消"), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event_abort) + ctx.should_call_send(event_abort, "已取消", True) + ctx.should_finished() + + +async def test_query_with_abort_on_command(app: App): + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + from nonebot_bison.config_manager import group_manage_matcher + + async with app.test_matcher(group_manage_matcher) as ctx: + bot = ctx.create_bot(base=Bot) + event = fake_private_message_event( + message=Message("群管理"), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event) + ctx.should_pass_rule() + ctx.should_pass_permission() + ctx.should_call_api( + "get_group_list", {}, [{"group_id": 101, "group_name": "test group"}] + ) + ctx.should_call_send( + event, + Message("请选择需要管理的群:\n1. 101 - test group\n请输入左侧序号\n中止操作请输入'取消'"), + True, + ) + event_1_ok = fake_private_message_event( + message=Message("1"), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event_1_ok) + ctx.should_call_send(event_1_ok, "请输入需要使用的命令:添加订阅,查询订阅,删除订阅,取消", True) + event_abort = fake_private_message_event( + message=Message("取消"), + sender=fake_superuser, + to_me=True, + user_id=fake_superuser.user_id, + ) + ctx.receive_event(bot, event_abort) + ctx.should_call_send(event_abort, "已取消", True) + ctx.should_finished() + + @pytest.mark.asyncio async def test_query_with_superuser_group_tome(app: App): from nonebot.adapters.onebot.v11.bot import Bot