chore: интерфесы бота

This commit is contained in:
protokey committed 2026-09-24 17:33:10 +04:00
1 parent 5f53cadf89
commit 6d322f36a9
42 files changed
+1731 -111

No files matched your search

+65
View File
@@ -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