chore: интерфесы бота
This commit is contained in:
1 parent
5f53cadf89
commit
6d322f36a9
42 files changed
+1731
-111
No files matched your search
@@ -0,0 +1,65 @@
|
||||
"""Помощники для тестов приложений, которые строят интерфейсы ботов."""
|
||||
from types import SimpleNamespace
|
||||
|
||||
from telebot import types
|
||||
|
||||
USER_ID = 7
|
||||
CHAT_ID = 42
|
||||
|
||||
|
||||
class FakeApi:
|
||||
"""Подменяет TeleBot: запоминает отправленные и удаленные сообщения."""
|
||||
|
||||
def __init__(self):
|
||||
self.sent = []
|
||||
self.deleted = []
|
||||
|
||||
def send_message(self, chat_id, text, reply_markup=None, parse_mode=None):
|
||||
self.sent.append(SimpleNamespace(chat_id=chat_id, text=text, reply_markup=reply_markup, parse_mode=parse_mode))
|
||||
return SimpleNamespace(message_id=len(self.sent))
|
||||
|
||||
def delete_message(self, chat_id, message_id):
|
||||
self.deleted.append((chat_id, message_id))
|
||||
|
||||
@property
|
||||
def last_text(self):
|
||||
return self.sent[-1].text if self.sent else None
|
||||
|
||||
@property
|
||||
def last_keyboard(self) -> list[list[str]] | None:
|
||||
markup = self.sent[-1].reply_markup if self.sent else None
|
||||
keyboard = getattr(markup, 'keyboard', None)
|
||||
return [[button['text'] for button in row] for row in keyboard] if keyboard is not None else None
|
||||
|
||||
|
||||
def message_update(update_id: int, text: str, chat_type: str = 'private', user_id: int = USER_ID) -> types.Update:
|
||||
return types.Update.de_json({
|
||||
'update_id': update_id,
|
||||
'message': {
|
||||
'message_id': update_id,
|
||||
'date': 0,
|
||||
'text': text,
|
||||
'chat': {'id': CHAT_ID if user_id == USER_ID else user_id, 'type': chat_type,
|
||||
'title': 'group' if chat_type != 'private' else None},
|
||||
'from': {'id': user_id, 'is_bot': False, 'first_name': 'Ann', 'username': f'user{user_id}'},
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
class Conversation:
|
||||
"""Диалог пользователя с ботом: say() отправляет сообщение и возвращает ответ бота."""
|
||||
|
||||
def __init__(self, bot, user_id: int = USER_ID, api: FakeApi | None = None):
|
||||
from .dispatcher import handle_update
|
||||
|
||||
self._handle_update = handle_update
|
||||
self.bot = bot
|
||||
self.user_id = user_id
|
||||
self.api = api or FakeApi()
|
||||
self._update_id = 0
|
||||
|
||||
def say(self, text: str) -> str | None:
|
||||
self._update_id += 1
|
||||
sent_before = len(self.api.sent)
|
||||
self._handle_update(self.api, self.bot, message_update(self._update_id, text, user_id=self.user_id))
|
||||
return self.api.last_text if len(self.api.sent) > sent_before else None
|
||||
Reference in new issue
Block a user