from datetime import datetime
import pytest
from pydantic_core import PydanticSerializationError
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ChatType, MessageEntityType, ParseMode
from aiogram.methods import SendMessage
from aiogram.types import Chat, LinkPreviewOptions, Message, MessageEntity, User
from aiogram.utils.serialization import (
DeserializedTelegramObject,
deserialize_telegram_object,
deserialize_telegram_object_to_python,
)
class TestSerialize:
def test_deserialize(self):
method = SendMessage(chat_id=42, text="test", parse_mode="HTML")
deserialized = deserialize_telegram_object(method)
assert isinstance(deserialized, DeserializedTelegramObject)
assert isinstance(deserialized.data, dict)
assert deserialized.data["chat_id"] == 42
def test_deserialize_default(self):
message = Message(
message_id=42,
date=datetime.now(),
chat=Chat(id=42, type=ChatType.PRIVATE, first_name="Test"),
from_user=User(id=42, first_name="Test", is_bot=False),
text="https://example.com",
link_preview_options=LinkPreviewOptions(is_disabled=True),
entities=[MessageEntity(type=MessageEntityType.URL, length=19, offset=0)],
)
with pytest.raises(PydanticSerializationError):
# https://github.com/aiogram/aiogram/issues/1450
message.model_dump_json(exclude_none=True)
deserialized = deserialize_telegram_object(message)
assert deserialized.data["link_preview_options"] == {"is_disabled": True}
assert isinstance(deserialized.data["date"], int)
def test_deserialize_with_custom_default(self):
default = DefaultBotProperties(parse_mode="HTML")
method = SendMessage(chat_id=42, text="test")
deserialized = deserialize_telegram_object(method, default=default)
assert deserialized.data["parse_mode"] == ParseMode.HTML
assert deserialized.data["parse_mode"] != method.parse_mode
def test_deserialize_telegram_object_to_python(self):
method = SendMessage(chat_id=42, text="test", parse_mode="HTML")
deserialized = deserialize_telegram_object_to_python(method)
assert isinstance(deserialized, dict)