from __future__ import annotations from types import SimpleNamespace from unittest.mock import AsyncMock, MagicMock from pyrogram.types import Message, ReplyKeyboardRemove async def test_remove_reply_keyboard_sends_removal_and_cleans_notice(app_modules): keyboard = app_modules.load("wbb.core.reply_keyboard") notice = SimpleNamespace(delete=AsyncMock()) message = SimpleNamespace(reply_text=AsyncMock(return_value=notice)) await keyboard.remove_reply_keyboard(message) call = message.reply_text.await_args assert "消息内菜单" in call.args[0] assert isinstance(call.kwargs["reply_markup"], ReplyKeyboardRemove) assert call.kwargs["reply_markup"].selective is False notice.delete.assert_awaited_once_with() async def test_directory_menu_uses_inline_buttons_and_removes_old_keyboard( app_modules, monkeypatch ): module = app_modules.load("wbb.modules.teacher_directory") remove_reply_keyboard = AsyncMock() monkeypatch.setattr(module, "remove_reply_keyboard", remove_reply_keyboard) monkeypatch.setattr( module, "observe_directory_user", AsyncMock( return_value={ "user_id": 123, "application_status": "none", } ), ) monkeypatch.setattr( module, "verify_platform_membership", AsyncMock(return_value={"allowed": False}), ) sent = SimpleNamespace() message = SimpleNamespace( from_user=SimpleNamespace(id=123), reply_text=AsyncMock(return_value=sent), ) await module.send_directory_menu(message) remove_reply_keyboard.assert_awaited_once_with(message) markup = message.reply_text.await_args.kwargs["reply_markup"] labels = [ button.text for row in markup.inline_keyboard for button in row ] assert "浏览技师" in labels assert "申请成为技师" in labels async def test_service_home_removes_old_keyboard_for_message_entry( app_modules, monkeypatch ): module = app_modules.load("wbb.modules.technician_services") remove_reply_keyboard = AsyncMock() monkeypatch.setattr(module, "remove_reply_keyboard", remove_reply_keyboard) monkeypatch.setattr(module, "_require_terms", AsyncMock(return_value=True)) message = MagicMock(spec=Message) message.from_user = SimpleNamespace(id=123) message.reply_text = AsyncMock() await module.send_service_home(message) remove_reply_keyboard.assert_awaited_once_with(message) markup = message.reply_text.await_args.kwargs["reply_markup"] assert markup.inline_keyboard[0][0].text == "浏览技师"