from __future__ import annotations import unittest from types import SimpleNamespace from unittest.mock import AsyncMock from app.commands.builtins import _format_id_report, id_command class IdCommandTests(unittest.IsolatedAsyncioTestCase): def _ctx(self): reply = SimpleNamespace( id=777, topic=SimpleNamespace(id=55, title="Deploys"), from_user=SimpleNamespace( id=202, first_name="Reply", last_name="User", username="reply_user", ), sender_chat=None, media=SimpleNamespace(value="photo"), text="hello from reply", caption=None, ) message = SimpleNamespace( id=123, chat=SimpleNamespace( id=-1001234567890, type=SimpleNamespace(value="channel"), title="Build Channel", username="builds", ), topic=SimpleNamespace(id=42, title="Main Thread"), from_user=SimpleNamespace( id=101, first_name="Owner", last_name=None, username="owner", ), sender_chat=None, reply_to_message=reply, reply_text=AsyncMock(), ) return SimpleNamespace(message=message, reply=message.reply_text) async def test_id_report_includes_current_and_replied_message_data(self) -> None: report = _format_id_report(self._ctx()) self.assertIn("chat_id: -1001234567890", report) self.assertIn("chat_type: channel", report) self.assertIn("thread_id: 42", report) self.assertIn("user_id: 101", report) self.assertIn("reply_message_id: 777", report) self.assertIn("reply_thread_id: 55", report) self.assertIn("reply_user_id: 202", report) self.assertIn("reply_media: photo", report) self.assertIn("reply_text: hello from reply", report) async def test_id_command_replies_with_report(self) -> None: ctx = self._ctx() await id_command(ctx) ctx.reply.assert_awaited_once() self.assertIn("chat_id: -1001234567890", ctx.reply.await_args.args[0]) if __name__ == "__main__": unittest.main()