test_private_keyboard.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from __future__ import annotations
  2. from types import SimpleNamespace
  3. from unittest.mock import AsyncMock, MagicMock
  4. from pyrogram.types import Message, ReplyKeyboardRemove
  5. async def test_remove_reply_keyboard_sends_removal_and_cleans_notice(app_modules):
  6. keyboard = app_modules.load("wbb.core.reply_keyboard")
  7. notice = SimpleNamespace(delete=AsyncMock())
  8. message = SimpleNamespace(reply_text=AsyncMock(return_value=notice))
  9. await keyboard.remove_reply_keyboard(message)
  10. call = message.reply_text.await_args
  11. assert "消息内菜单" in call.args[0]
  12. assert isinstance(call.kwargs["reply_markup"], ReplyKeyboardRemove)
  13. assert call.kwargs["reply_markup"].selective is False
  14. notice.delete.assert_awaited_once_with()
  15. async def test_directory_menu_uses_inline_buttons_and_removes_old_keyboard(
  16. app_modules, monkeypatch
  17. ):
  18. module = app_modules.load("wbb.modules.teacher_directory")
  19. remove_reply_keyboard = AsyncMock()
  20. monkeypatch.setattr(module, "remove_reply_keyboard", remove_reply_keyboard)
  21. monkeypatch.setattr(
  22. module,
  23. "observe_directory_user",
  24. AsyncMock(
  25. return_value={
  26. "user_id": 123,
  27. "application_status": "none",
  28. }
  29. ),
  30. )
  31. monkeypatch.setattr(
  32. module,
  33. "verify_platform_membership",
  34. AsyncMock(return_value={"allowed": False}),
  35. )
  36. sent = SimpleNamespace()
  37. message = SimpleNamespace(
  38. from_user=SimpleNamespace(id=123),
  39. reply_text=AsyncMock(return_value=sent),
  40. )
  41. await module.send_directory_menu(message)
  42. remove_reply_keyboard.assert_awaited_once_with(message)
  43. markup = message.reply_text.await_args.kwargs["reply_markup"]
  44. labels = [
  45. button.text for row in markup.inline_keyboard for button in row
  46. ]
  47. assert "浏览技师" in labels
  48. assert "申请成为技师" in labels
  49. async def test_service_home_removes_old_keyboard_for_message_entry(
  50. app_modules, monkeypatch
  51. ):
  52. module = app_modules.load("wbb.modules.technician_services")
  53. remove_reply_keyboard = AsyncMock()
  54. monkeypatch.setattr(module, "remove_reply_keyboard", remove_reply_keyboard)
  55. monkeypatch.setattr(module, "_require_terms", AsyncMock(return_value=True))
  56. message = MagicMock(spec=Message)
  57. message.from_user = SimpleNamespace(id=123)
  58. message.reply_text = AsyncMock()
  59. await module.send_service_home(message)
  60. remove_reply_keyboard.assert_awaited_once_with(message)
  61. markup = message.reply_text.await_args.kwargs["reply_markup"]
  62. assert markup.inline_keyboard[0][0].text == "浏览技师"