2026-03-12 11:44:52 +08:00
|
|
|
from types import SimpleNamespace
|
|
|
|
|
from unittest.mock import Mock
|
|
|
|
|
|
|
|
|
|
from src.bot.command_guard import CommandGuard
|
2026-06-13 01:34:09 +08:00
|
|
|
from src.bot.services.entitlement_service import BotEntitlementService
|
2026-03-12 11:44:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def _message():
|
|
|
|
|
return SimpleNamespace(
|
|
|
|
|
from_user=SimpleNamespace(id=123, username="tester", first_name="Tester"),
|
|
|
|
|
chat=SimpleNamespace(id=999),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
2026-05-24 17:59:32 +08:00
|
|
|
def test_guard_charges_points():
|
2026-03-20 20:59:30 +08:00
|
|
|
fake_bot = SimpleNamespace(
|
|
|
|
|
reply_to=Mock(),
|
|
|
|
|
get_chat_member=Mock(return_value=SimpleNamespace(status="member")),
|
2026-03-12 11:44:52 +08:00
|
|
|
)
|
2026-03-20 20:59:30 +08:00
|
|
|
io_layer = SimpleNamespace(bot=fake_bot, ensure_query_points=Mock(return_value=True))
|
|
|
|
|
guard = CommandGuard(io_layer=io_layer, group_chat_id="-100123")
|
2026-03-12 11:44:52 +08:00
|
|
|
|
2026-06-13 01:34:09 +08:00
|
|
|
ok = guard.ensure_access_and_points(_message(), 1, "/top")
|
2026-03-12 11:44:52 +08:00
|
|
|
|
|
|
|
|
assert ok is True
|
|
|
|
|
assert io_layer.ensure_query_points.call_count == 1
|
|
|
|
|
assert fake_bot.reply_to.call_count == 0
|
2026-06-13 01:34:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_entitlement_service_has_no_removed_protected_commands_by_default(monkeypatch):
|
|
|
|
|
monkeypatch.setenv("POLYWEATHER_BOT_USE_SUPABASE_ENTITLEMENT", "false")
|
|
|
|
|
db = SimpleNamespace(get_user=lambda _user_id: {})
|
|
|
|
|
service = BotEntitlementService(db=db, enabled=True)
|
|
|
|
|
|
|
|
|
|
decision = service.check(123, "/city")
|
|
|
|
|
|
|
|
|
|
assert service.protected_commands == set()
|
|
|
|
|
assert decision.allowed is True
|
|
|
|
|
assert decision.reason == "command_not_protected"
|