test_admin_shortcuts.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from types import SimpleNamespace
  4. from unittest.mock import AsyncMock
  5. import pytest
  6. @pytest.mark.parametrize(
  7. ("text", "expected"),
  8. [
  9. ("封禁", ("/ban", ["ban"])),
  10. ("解封", ("/unban", ["unban"])),
  11. ("禁言", ("/mute", ["mute"])),
  12. ("解除禁言", ("/unmute", ["unmute"])),
  13. ("警告", ("/warn", ["warn"])),
  14. ("禁言10分钟", ("/tmute 10m", ["tmute", "10m"])),
  15. (" 禁言1分钟 ", ("/tmute 1m", ["tmute", "1m"])),
  16. ("禁言1分钟", ("/tmute 1m", ["tmute", "1m"])),
  17. ("禁言\u200b1分钟", ("/tmute 1m", ["tmute", "1m"])),
  18. ("禁言 2 小时", ("/tmute 2h", ["tmute", "2h"])),
  19. ("禁言1天", ("/tmute 1d", ["tmute", "1d"])),
  20. ("踢出", ("/kick", ["kick"])),
  21. ("踢", ("/kick", ["kick"])),
  22. ("飞", ("/kick", ["kick"])),
  23. ],
  24. )
  25. def test_member_action_shortcut_parser(app_modules, text, expected):
  26. shortcuts = app_modules.load("wbb.services.member_shortcuts")
  27. assert shortcuts.member_action_shortcut_command(text) == expected
  28. @pytest.mark.parametrize("text", ["禁言0分钟", "禁言100分钟", "封禁 原因", "踢他"])
  29. def test_member_action_shortcut_rejects_ambiguous_text(app_modules, text):
  30. shortcuts = app_modules.load("wbb.services.member_shortcuts")
  31. assert shortcuts.member_action_shortcut_command(text) is None
  32. @pytest.mark.asyncio
  33. async def test_member_action_shortcut_executes_temporary_mute(
  34. app_modules, monkeypatch
  35. ):
  36. admin = app_modules.load("wbb.modules.admin")
  37. chat_id = -100123
  38. actor_id = 10
  39. target_id = 20
  40. privileges = SimpleNamespace(
  41. can_post_messages=False,
  42. can_edit_messages=False,
  43. can_delete_messages=True,
  44. can_restrict_members=True,
  45. can_promote_members=False,
  46. can_change_info=False,
  47. can_invite_users=False,
  48. can_pin_messages=False,
  49. can_manage_video_chats=False,
  50. )
  51. app_modules.app.members[(chat_id, actor_id)] = SimpleNamespace(
  52. privileges=privileges
  53. )
  54. app_modules.app.get_users = AsyncMock(
  55. return_value=SimpleNamespace(mention="@target")
  56. )
  57. monkeypatch.setattr(admin, "list_admins", AsyncMock(return_value=[]))
  58. restrict_member = AsyncMock()
  59. target_reply = AsyncMock()
  60. replied_message = SimpleNamespace(
  61. from_user=SimpleNamespace(id=target_id),
  62. sender_chat=None,
  63. reply_text=target_reply,
  64. )
  65. message = SimpleNamespace(
  66. text=" 禁言1分钟\u200b ",
  67. command=None,
  68. chat=SimpleNamespace(id=chat_id, restrict_member=restrict_member),
  69. from_user=SimpleNamespace(id=actor_id, mention="@admin"),
  70. sender_chat=None,
  71. reply_to_message=replied_message,
  72. reply_text=AsyncMock(),
  73. )
  74. assert await admin._member_action_shortcut_filter(None, None, message)
  75. await admin.member_action_shortcut(None, message)
  76. restrict_member.assert_awaited_once()
  77. args, kwargs = restrict_member.await_args
  78. assert args == (target_id,)
  79. assert kwargs["until_date"] > datetime.now()
  80. assert message.text == " 禁言1分钟\u200b "
  81. assert message.command is None
  82. assert "禁言时长:** 1m" in target_reply.await_args.args[0]