conftest.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from __future__ import annotations
  2. import importlib
  3. import sys
  4. import types
  5. from pathlib import Path
  6. from types import SimpleNamespace
  7. import pytest
  8. from mongomock_motor import AsyncMongoMockClient
  9. from pyrogram.enums import ChatMemberStatus
  10. ROOT = Path(__file__).resolve().parents[1]
  11. class FakeTelegramApp:
  12. def __init__(self) -> None:
  13. self.members: dict[tuple[int, int], object] = {}
  14. self.sent_messages: list[tuple[int, str]] = []
  15. async def get_chat_member(self, chat_id: int, user_id: int):
  16. member = self.members.get((int(chat_id), int(user_id)))
  17. if member is not None:
  18. return member
  19. return SimpleNamespace(
  20. status=ChatMemberStatus.MEMBER,
  21. privileges=None,
  22. user=SimpleNamespace(
  23. id=int(user_id),
  24. username=None,
  25. first_name=str(user_id),
  26. last_name=None,
  27. is_bot=False,
  28. is_deleted=False,
  29. ),
  30. custom_title=None,
  31. until_date=None,
  32. )
  33. async def send_message(self, chat_id: int, text: str, **_kwargs):
  34. self.sent_messages.append((int(chat_id), text))
  35. return SimpleNamespace(chat=SimpleNamespace(id=int(chat_id)), id=len(self.sent_messages))
  36. def on_message(self, *_args, **_kwargs):
  37. return lambda function: function
  38. def on_callback_query(self, *_args, **_kwargs):
  39. return lambda function: function
  40. @pytest.fixture
  41. def app_modules(tmp_path):
  42. previous = {
  43. name: module
  44. for name, module in sys.modules.items()
  45. if name == "wbb" or name.startswith("wbb.")
  46. }
  47. for name in list(previous):
  48. sys.modules.pop(name, None)
  49. fake_app = FakeTelegramApp()
  50. fake_wbb = types.ModuleType("wbb")
  51. fake_wbb.__path__ = [str(ROOT / "wbb")]
  52. fake_wbb.db = AsyncMongoMockClient().wbb
  53. fake_wbb.control_db = fake_wbb.db
  54. fake_wbb.app = fake_app
  55. fake_wbb.log = SimpleNamespace(info=lambda _message: None, error=lambda _message: None)
  56. fake_wbb.BOT_ID = 999
  57. fake_wbb.BOT_NAME = "Test Bot"
  58. fake_wbb.BOT_USERNAME = "test_bot"
  59. fake_wbb.BOT_PROFILE_ID = "primary"
  60. fake_wbb.LOG_GROUP_ID = 0
  61. fake_wbb.TELEGRAM_CONNECTED = True
  62. fake_wbb.SUPERVISOR_MODE = False
  63. fake_wbb.ADMIN_BOOTSTRAP_MODE = False
  64. fake_wbb.BOT_SUPERVISOR = None
  65. fake_wbb.SUDOERS = set()
  66. fake_wbb.MOD_LOAD = []
  67. fake_wbb.MOD_NOLOAD = []
  68. fake_wbb.MESSAGE_DUMP_CHAT = 0
  69. fake_wbb.ADMIN_WEB_USERNAME = "admin"
  70. fake_wbb.ADMIN_WEB_INITIAL_PASSWORD = "qwe0.123456"
  71. fake_wbb.ADMIN_WEB_SESSION_HOURS = 12
  72. fake_wbb.ADMIN_WEB_COOKIE_SECURE = False
  73. fake_wbb.ADMIN_WEB_UPLOAD_MAX_MB = 20
  74. fake_wbb.ADMIN_WEB_HOST = "127.0.0.1"
  75. fake_wbb.ADMIN_WEB_PORT = 8088
  76. fake_wbb.BOT_PROFILES_PATH = str(tmp_path / "bot_profiles.json")
  77. sys.modules["wbb"] = fake_wbb
  78. def load(name: str):
  79. return importlib.import_module(name)
  80. yield SimpleNamespace(wbb=fake_wbb, app=fake_app, load=load)
  81. for name in list(sys.modules):
  82. if name == "wbb" or name.startswith("wbb."):
  83. sys.modules.pop(name, None)
  84. sys.modules.update(previous)