test_points_commands.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from __future__ import annotations
  2. import sys
  3. import types
  4. from types import SimpleNamespace
  5. from unittest.mock import AsyncMock
  6. import pytest
  7. @pytest.fixture
  8. def points_module(app_modules, monkeypatch):
  9. permissions = types.ModuleType("wbb.core.decorators.permissions")
  10. def admins_only(*_args, **_kwargs):
  11. return lambda function: function
  12. permissions.adminsOnly = admins_only
  13. monkeypatch.setitem(
  14. sys.modules, "wbb.core.decorators.permissions", permissions
  15. )
  16. module = app_modules.load("wbb.modules.points")
  17. return module
  18. def _checkin_message() -> SimpleNamespace:
  19. response = SimpleNamespace(
  20. chat=SimpleNamespace(id=-100, type=SimpleNamespace(value="supergroup")),
  21. id=11,
  22. )
  23. return SimpleNamespace(
  24. chat=SimpleNamespace(id=-100, type=SimpleNamespace(value="supergroup")),
  25. id=10,
  26. from_user=SimpleNamespace(
  27. id=20,
  28. username="customer",
  29. first_name="顾客",
  30. last_name=None,
  31. ),
  32. reply_to_message=None,
  33. reply_text=AsyncMock(return_value=response),
  34. )
  35. @pytest.mark.parametrize("created", [True, False])
  36. async def test_checkin_schedules_user_and_bot_messages_for_cleanup(
  37. points_module, monkeypatch, created
  38. ):
  39. message = _checkin_message()
  40. account = {"balance": 10}
  41. cleanup = []
  42. monkeypatch.setattr(
  43. points_module,
  44. "award_checkin",
  45. AsyncMock(return_value=(account, created)),
  46. )
  47. monkeypatch.setattr(
  48. points_module,
  49. "get_point_rules",
  50. AsyncMock(
  51. return_value={
  52. "checkin_points": 10,
  53. "checkin_success_message": (
  54. "领取成功 +{points},余额 {balance},今日第 {rank} 个,"
  55. "连续 {streak} 天,本月 {month_days} 天"
  56. ),
  57. "checkin_already_message": (
  58. "今天领过了,余额 {balance},今日第 {rank} 个,"
  59. "连续 {streak} 天,本月 {month_days} 天"
  60. ),
  61. }
  62. ),
  63. )
  64. monkeypatch.setattr(
  65. points_module,
  66. "get_checkin_metrics",
  67. AsyncMock(return_value={"rank": 3, "streak": 5, "month_days": 12}),
  68. )
  69. monkeypatch.setattr(
  70. points_module,
  71. "schedule_group_cleanup",
  72. lambda *messages, **_kwargs: cleanup.extend(messages),
  73. )
  74. response = await points_module.points_checkin_command(None, message)
  75. expected_message = (
  76. "领取成功 +10,余额 10,今日第 3 个,连续 5 天,本月 12 天"
  77. if created
  78. else "今天领过了,余额 10,今日第 3 个,连续 5 天,本月 12 天"
  79. )
  80. assert message.reply_text.await_args.args == (expected_message,)
  81. assert (
  82. message.reply_text.await_args.kwargs["parse_mode"]
  83. == points_module.ParseMode.DISABLED
  84. )
  85. assert cleanup == [message, response]
  86. async def test_checkin_error_schedules_user_and_bot_messages_for_cleanup(
  87. points_module, monkeypatch
  88. ):
  89. message = _checkin_message()
  90. cleanup = []
  91. monkeypatch.setattr(
  92. points_module,
  93. "award_checkin",
  94. AsyncMock(side_effect=points_module.PointsError("签到暂不可用")),
  95. )
  96. monkeypatch.setattr(
  97. points_module,
  98. "schedule_group_cleanup",
  99. lambda *messages, **_kwargs: cleanup.extend(messages),
  100. )
  101. response = await points_module.points_checkin_command(None, message)
  102. assert message.reply_text.await_args.args == ("签到暂不可用",)
  103. assert (
  104. message.reply_text.await_args.kwargs["parse_mode"]
  105. == points_module.ParseMode.DISABLED
  106. )
  107. assert cleanup == [message, response]
  108. async def test_balance_schedules_user_and_bot_messages_for_cleanup(
  109. points_module, monkeypatch
  110. ):
  111. message = _checkin_message()
  112. cleanup = []
  113. monkeypatch.setattr(
  114. points_module,
  115. "get_point_account",
  116. AsyncMock(return_value={"balance": 25}),
  117. )
  118. monkeypatch.setattr(
  119. points_module,
  120. "schedule_group_cleanup",
  121. lambda *messages, **_kwargs: cleanup.extend(messages),
  122. )
  123. response = await points_module.points_balance_command(None, message)
  124. assert "<b>25</b> 积分" in message.reply_text.await_args.args[0]
  125. assert (
  126. message.reply_text.await_args.kwargs["parse_mode"]
  127. == points_module.ParseMode.HTML
  128. )
  129. assert cleanup == [message, response]