diff --git a/.butcher/enums/ContentType.yml b/.butcher/enums/ContentType.yml
index 0c908bf3..fdebf066 100644
--- a/.butcher/enums/ContentType.yml
+++ b/.butcher/enums/ContentType.yml
@@ -40,3 +40,4 @@ extract:
- business_connection_id
- sender_business_bot
- is_from_offline
+ - has_media_spoiler
diff --git a/.butcher/schema/schema.json b/.butcher/schema/schema.json
index 0e480601..94bf6573 100644
--- a/.butcher/schema/schema.json
+++ b/.butcher/schema/schema.json
@@ -5450,16 +5450,16 @@
"annotations": [
{
"type": "Integer",
- "description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 24 60",
- "html_description": "
The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 24 60 | ",
+ "description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60",
+ "html_description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60 | ",
"rst_description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60\n",
"name": "opening_minute",
"required": true
},
{
"type": "Integer",
- "description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 24 60",
- "html_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 24 60 | ",
+ "description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60",
+ "html_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60 | ",
"rst_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60\n",
"name": "closing_minute",
"required": true
diff --git a/.butcher/types/BusinessOpeningHoursInterval/entity.json b/.butcher/types/BusinessOpeningHoursInterval/entity.json
index ad07ba67..7c5dbf86 100644
--- a/.butcher/types/BusinessOpeningHoursInterval/entity.json
+++ b/.butcher/types/BusinessOpeningHoursInterval/entity.json
@@ -13,16 +13,16 @@
"annotations": [
{
"type": "Integer",
- "description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 24 60",
- "html_description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 24 60 | ",
+ "description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60",
+ "html_description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60 | ",
"rst_description": "The minute's sequence number in a week, starting on Monday, marking the start of the time interval during which the business is open; 0 - 7 * 24 * 60\n",
"name": "opening_minute",
"required": true
},
{
"type": "Integer",
- "description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 24 60",
- "html_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 24 60 | ",
+ "description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60",
+ "html_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60 | ",
"rst_description": "The minute's sequence number in a week, starting on Monday, marking the end of the time interval during which the business is open; 0 - 8 * 24 * 60\n",
"name": "closing_minute",
"required": true
diff --git a/CHANGES/1453.bugfix.rst b/CHANGES/1453.bugfix.rst
deleted file mode 100644
index 3a7eeeac..00000000
--- a/CHANGES/1453.bugfix.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fixing tests and content types for Telegram Bot API 7.2 update
\ No newline at end of file
diff --git a/aiogram/dispatcher/middlewares/user_context.py b/aiogram/dispatcher/middlewares/user_context.py
index 8dacc543..2cec944b 100644
--- a/aiogram/dispatcher/middlewares/user_context.py
+++ b/aiogram/dispatcher/middlewares/user_context.py
@@ -86,6 +86,10 @@ class UserContextMiddleware(BaseMiddleware):
return event.chat_boost.chat, None, None
if event.removed_chat_boost:
return event.removed_chat_boost.chat, None, None
+ if event.deleted_business_messages:
+ return event.deleted_business_messages.chat, None, None
+ if event.business_connection:
+ return None, event.business_connection.user, None
if event.business_message:
return (
event.business_message.chat,
diff --git a/aiogram/enums/content_type.py b/aiogram/enums/content_type.py
index c74753aa..20b01c43 100644
--- a/aiogram/enums/content_type.py
+++ b/aiogram/enums/content_type.py
@@ -18,7 +18,6 @@ class ContentType(str, Enum):
VIDEO = "video"
VIDEO_NOTE = "video_note"
VOICE = "voice"
- HAS_MEDIA_SPOILER = "has_media_spoiler"
CONTACT = "contact"
DICE = "dice"
GAME = "game"
@@ -62,7 +61,3 @@ class ContentType(str, Enum):
VIDEO_CHAT_PARTICIPANTS_INVITED = "video_chat_participants_invited"
WEB_APP_DATA = "web_app_data"
USER_SHARED = "user_shared"
- SHARED_USER = "shared_user"
- BUSINESS_CONNECTION_ID = "business_connection_id"
- SENDER_BUSINESS_BOT = "sender_business_bot"
- IS_FROM_OFFLINE = "is_from_offline"
diff --git a/aiogram/types/message.py b/aiogram/types/message.py
index c8999ef7..261489dc 100644
--- a/aiogram/types/message.py
+++ b/aiogram/types/message.py
@@ -3,7 +3,7 @@ from __future__ import annotations
import datetime
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
-from pydantic import Field
+from pydantic import Field, computed_field
from aiogram.utils.text_decorations import (
TextDecoration,
@@ -96,13 +96,13 @@ if TYPE_CHECKING:
from .reply_keyboard_markup import ReplyKeyboardMarkup
from .reply_keyboard_remove import ReplyKeyboardRemove
from .reply_parameters import ReplyParameters
+ from .shared_user import SharedUser
from .sticker import Sticker
from .story import Story
from .successful_payment import SuccessfulPayment
from .text_quote import TextQuote
from .user import User
from .user_shared import UserShared
- from .shared_user import SharedUser
from .users_shared import UsersShared
from .venue import Venue
from .video import Video
@@ -239,8 +239,6 @@ class Message(MaybeInaccessibleMessage):
"""*Optional*. Message is an invoice for a `payment `_, information about the invoice. `More about payments » `_"""
successful_payment: Optional[SuccessfulPayment] = None
"""*Optional*. Message is a service message about a successful payment, information about the payment. `More about payments » `_"""
- shared_user: Optional[SharedUser] = None
- """*Optional*. A user that was shared with the bot"""
users_shared: Optional[UsersShared] = None
"""*Optional*. Service message: users were shared with the bot"""
chat_shared: Optional[ChatShared] = None
@@ -623,22 +621,12 @@ class Message(MaybeInaccessibleMessage):
return ContentType.USER_SHARED
if self.chat_shared:
return ContentType.CHAT_SHARED
- if self.shared_user:
- return ContentType.SHARED_USER
if self.story:
return ContentType.STORY
- if self.has_media_spoiler:
- return ContentType.HAS_MEDIA_SPOILER
if self.write_access_allowed:
return ContentType.WRITE_ACCESS_ALLOWED
if self.boost_added:
return ContentType.BOOST_ADDED
- if self.business_connection_id:
- return ContentType.BUSINESS_CONNECTION_ID
- if self.is_from_offline:
- return ContentType.IS_FROM_OFFLINE
- if self.sender_business_bot:
- return ContentType.SENDER_BUSINESS_BOT
return ContentType.UNKNOWN
diff --git a/tests/test_api/test_methods/test_add_sticker_to_set.py b/tests/test_api/test_methods/test_add_sticker_to_set.py
index 332713c7..84b7a9a8 100644
--- a/tests/test_api/test_methods/test_add_sticker_to_set.py
+++ b/tests/test_api/test_methods/test_add_sticker_to_set.py
@@ -11,7 +11,9 @@ class TestAddStickerToSet:
response: bool = await bot.add_sticker_to_set(
user_id=42,
name="test stickers pack",
- sticker=InputSticker(sticker="file id", format=StickerFormat.STATIC, emoji_list=[":)"]),
+ sticker=InputSticker(
+ sticker="file id", format=StickerFormat.STATIC, emoji_list=[":)"]
+ ),
)
request = bot.get_request()
assert response == prepare_result.result
diff --git a/tests/test_api/test_methods/test_create_new_sticker_set.py b/tests/test_api/test_methods/test_create_new_sticker_set.py
index 47223a83..840f0c91 100644
--- a/tests/test_api/test_methods/test_create_new_sticker_set.py
+++ b/tests/test_api/test_methods/test_create_new_sticker_set.py
@@ -14,7 +14,9 @@ class TestCreateNewStickerSet:
title="title",
stickers=[
InputSticker(sticker="file id", format=StickerFormat.STATIC, emoji_list=[":)"]),
- InputSticker(sticker=FSInputFile("file.png"), format=StickerFormat.STATIC, emoji_list=["=("]),
+ InputSticker(
+ sticker=FSInputFile("file.png"), format=StickerFormat.STATIC, emoji_list=["=("]
+ ),
],
sticker_format=StickerFormat.STATIC,
)
diff --git a/tests/test_api/test_methods/test_get_business_connection.py b/tests/test_api/test_methods/test_get_business_connection.py
new file mode 100644
index 00000000..22776cb4
--- /dev/null
+++ b/tests/test_api/test_methods/test_get_business_connection.py
@@ -0,0 +1,24 @@
+from aiogram.methods import GetBusinessConnection
+from aiogram.types import BusinessConnection, User
+from tests.mocked_bot import MockedBot
+
+
+class TestGetBusinessConnection:
+ async def test_bot_method(self, bot: MockedBot):
+ prepare_result = bot.add_result_for(
+ GetBusinessConnection,
+ ok=True,
+ result=BusinessConnection(
+ id="test",
+ user=User(id=42, is_bot=False, first_name="User"),
+ user_chat_id=42,
+ date=42,
+ can_reply=True,
+ is_enabled=True,
+ ),
+ )
+ response: BusinessConnection = await bot.get_business_connection(
+ business_connection_id="test"
+ )
+ request = bot.get_request()
+ assert response == prepare_result.result
diff --git a/tests/test_api/test_methods/test_replace_sticker_in_set.py b/tests/test_api/test_methods/test_replace_sticker_in_set.py
new file mode 100644
index 00000000..e556919d
--- /dev/null
+++ b/tests/test_api/test_methods/test_replace_sticker_in_set.py
@@ -0,0 +1,21 @@
+from aiogram.methods import ReplaceStickerInSet
+from aiogram.types import InputSticker
+from tests.mocked_bot import MockedBot
+
+
+class TestReplaceStickerInSet:
+ async def test_bot_method(self, bot: MockedBot):
+ prepare_result = bot.add_result_for(ReplaceStickerInSet, ok=True, result=True)
+
+ response: bool = await bot.replace_sticker_in_set(
+ user_id=42,
+ name="test",
+ old_sticker="test",
+ sticker=InputSticker(
+ sticker="test",
+ format="static",
+ emoji_list=["test"],
+ ),
+ )
+ request = bot.get_request()
+ assert response == prepare_result.result
diff --git a/tests/test_api/test_methods/test_set_sticker_set_thumbnail.py b/tests/test_api/test_methods/test_set_sticker_set_thumbnail.py
index 045a58f5..bfdfd808 100644
--- a/tests/test_api/test_methods/test_set_sticker_set_thumbnail.py
+++ b/tests/test_api/test_methods/test_set_sticker_set_thumbnail.py
@@ -7,6 +7,8 @@ class TestSetStickerSetThumbnail:
async def test_bot_method(self, bot: MockedBot):
prepare_result = bot.add_result_for(SetStickerSetThumbnail, ok=True, result=None)
- response: bool = await bot.set_sticker_set_thumbnail(name="test", format=StickerFormat.STATIC, user_id=42)
+ response: bool = await bot.set_sticker_set_thumbnail(
+ name="test", format=StickerFormat.STATIC, user_id=42
+ )
request = bot.get_request()
assert response == prepare_result.result
diff --git a/tests/test_api/test_types/test_message.py b/tests/test_api/test_types/test_message.py
index 17259741..a17228b4 100644
--- a/tests/test_api/test_types/test_message.py
+++ b/tests/test_api/test_types/test_message.py
@@ -463,13 +463,6 @@ TEST_MESSAGE_USER_SHARED = Message(
from_user=User(id=42, is_bot=False, first_name="Test"),
user_shared=UserShared(request_id=42, user_id=42),
)
-TEST_MESSAGE_SHARED_USER = Message(
- message_id=42,
- date=datetime.datetime.now(),
- chat=Chat(id=42, type="private"),
- from_user=User(id=42, is_bot=False, first_name="User"),
- shared_user=SharedUser(request_id=42, user_id=1),
-)
TEST_MESSAGE_USERS_SHARED = Message(
message_id=42,
date=datetime.datetime.now(),
@@ -493,8 +486,6 @@ TEST_MESSAGE_STORY = Message(
chat=Chat(id=42, type="private"),
from_user=User(id=42, is_bot=False, first_name="Test"),
story=Story(chat=Chat(id=42, type="private"), id=42),
- forward_signature="Test",
- forward_date=datetime.datetime.now(),
)
TEST_MESSAGE_GIVEAWAY = Message(
@@ -535,13 +526,6 @@ TEST_MESSAGE_GIVEAWAY_COMPLETED = Message(
from_user=None,
giveaway_completed=GiveawayCompleted(winner_count=10),
)
-TEST_MESSAGE_HAS_MEDIA_SPOILER = Message(
- message_id=42,
- date=datetime.datetime.now(),
- chat=Chat(id=42, type="private"),
- from_user=None,
- has_media_spoiler=True,
-)
TEST_MESSAGE_GENERAL_FORUM_TOPIC_HIDDEN = Message(
message_id=42,
date=datetime.datetime.now(),
@@ -560,7 +544,6 @@ TEST_MESSAGE_WRITE_ACCESS_ALLOWED = Message(
message_id=42,
date=datetime.datetime.now(),
chat=Chat(id=42, type="private"),
- from_user=None,
write_access_allowed=WriteAccessAllowed(),
)
TEST_MESSAGE_BOOST_ADDED = Message(
@@ -570,27 +553,6 @@ TEST_MESSAGE_BOOST_ADDED = Message(
from_user=User(id=42, is_bot=False, first_name="User"),
boost_added=ChatBoostAdded(boost_count=1),
)
-TEST_MESSAGE_BUSINESS_CONNECTION_ID = Message(
- message_id=42,
- date=datetime.datetime.now(),
- chat=Chat(id=42, type="private"),
- from_user=User(id=42, is_bot=False, first_name="User"),
- business_connection_id="idk"
-)
-TEST_MESSAGE_IS_FROM_OFFLINE = Message(
- message_id=42,
- date=datetime.datetime.now(),
- chat=Chat(id=42, type="private"),
- from_user=User(id=42, is_bot=False, first_name="User"),
- is_from_offline=True
-)
-TEST_MESSAGE_SENDER_BUSINESS_BOT = Message(
- message_id=42,
- date=datetime.datetime.now(),
- chat=Chat(id=42, type="private"),
- from_user=User(id=42, is_bot=True, first_name="Bot"),
- sender_business_bot=User(id=42, is_bot=True, first_name="Bot")
-)
TEST_MESSAGE_UNKNOWN = Message(
message_id=42,
date=datetime.datetime.now(),
@@ -649,20 +611,15 @@ MESSAGES_AND_CONTENT_TYPES = [
[TEST_MESSAGE_USER_SHARED, ContentType.USER_SHARED],
[TEST_MESSAGE_USERS_SHARED, ContentType.USERS_SHARED],
[TEST_CHAT_SHARED, ContentType.CHAT_SHARED],
- [TEST_MESSAGE_SHARED_USER, ContentType.SHARED_USER],
[TEST_MESSAGE_STORY, ContentType.STORY],
[TEST_MESSAGE_GIVEAWAY, ContentType.GIVEAWAY],
[TEST_MESSAGE_GIVEAWAY_CREATED, ContentType.GIVEAWAY_CREATED],
[TEST_MESSAGE_GIVEAWAY_WINNERS, ContentType.GIVEAWAY_WINNERS],
[TEST_MESSAGE_GIVEAWAY_COMPLETED, ContentType.GIVEAWAY_COMPLETED],
- [TEST_MESSAGE_HAS_MEDIA_SPOILER, ContentType.HAS_MEDIA_SPOILER],
[TEST_MESSAGE_GENERAL_FORUM_TOPIC_HIDDEN, ContentType.GENERAL_FORUM_TOPIC_HIDDEN],
[TEST_MESSAGE_GENERAL_FORUM_TOPIC_UNHIDDEN, ContentType.GENERAL_FORUM_TOPIC_UNHIDDEN],
[TEST_MESSAGE_WRITE_ACCESS_ALLOWED, ContentType.WRITE_ACCESS_ALLOWED],
[TEST_MESSAGE_BOOST_ADDED, ContentType.BOOST_ADDED],
- [TEST_MESSAGE_BUSINESS_CONNECTION_ID, ContentType.BUSINESS_CONNECTION_ID],
- [TEST_MESSAGE_IS_FROM_OFFLINE, ContentType.IS_FROM_OFFLINE],
- [TEST_MESSAGE_SENDER_BUSINESS_BOT, ContentType.SENDER_BUSINESS_BOT],
[TEST_MESSAGE_UNKNOWN, ContentType.UNKNOWN],
]
@@ -706,9 +663,7 @@ MESSAGES_AND_COPY_METHODS = [
[TEST_MESSAGE_DICE, SendDice],
[TEST_MESSAGE_USER_SHARED, None],
[TEST_CHAT_SHARED, None],
- [TEST_MESSAGE_SHARED_USER, None],
[TEST_MESSAGE_GIVEAWAY_COMPLETED, None],
- [TEST_MESSAGE_HAS_MEDIA_SPOILER, None],
[TEST_MESSAGE_WEB_APP_DATA, None],
[TEST_FORUM_TOPIC_CREATED, None],
[TEST_FORUM_TOPIC_EDITED, None],
@@ -723,9 +678,6 @@ MESSAGES_AND_COPY_METHODS = [
[TEST_MESSAGE_GIVEAWAY, None],
[TEST_MESSAGE_GIVEAWAY_WINNERS, None],
[TEST_MESSAGE_BOOST_ADDED, None],
- [TEST_MESSAGE_BUSINESS_CONNECTION_ID, None],
- [TEST_MESSAGE_IS_FROM_OFFLINE, None],
- [TEST_MESSAGE_SENDER_BUSINESS_BOT, None],
[TEST_MESSAGE_UNKNOWN, None],
]
diff --git a/tests/test_dispatcher/test_dispatcher.py b/tests/test_dispatcher/test_dispatcher.py
index ccac7c1e..e5fed1a4 100644
--- a/tests/test_dispatcher/test_dispatcher.py
+++ b/tests/test_dispatcher/test_dispatcher.py
@@ -16,6 +16,8 @@ from aiogram.dispatcher.event.bases import UNHANDLED, SkipHandler
from aiogram.dispatcher.router import Router
from aiogram.methods import GetMe, GetUpdates, SendMessage, TelegramMethod
from aiogram.types import (
+ BusinessConnection,
+ BusinessMessagesDeleted,
CallbackQuery,
Chat,
ChatBoost,
@@ -525,6 +527,65 @@ class TestDispatcher:
True,
False,
),
+ pytest.param(
+ "deleted_business_messages",
+ Update(
+ update_id=42,
+ deleted_business_messages=BusinessMessagesDeleted(
+ chat=Chat(id=-42, type="private"),
+ business_connection_id="qwerty",
+ message_ids=[1, 2, 3],
+ ),
+ ),
+ True,
+ False,
+ ),
+ pytest.param(
+ "business_connection",
+ Update(
+ update_id=42,
+ business_connection=BusinessConnection(
+ id="qwerty",
+ user=User(id=42, is_bot=False, first_name="Test"),
+ user_chat_id=42,
+ date=int(time.time()),
+ can_reply=True,
+ is_enabled=True,
+ ),
+ ),
+ False,
+ True,
+ ),
+ pytest.param(
+ "edited_business_message",
+ Update(
+ update_id=42,
+ edited_business_message=Message(
+ message_id=42,
+ date=datetime.datetime.now(),
+ text="test",
+ chat=Chat(id=42, type="private"),
+ from_user=User(id=42, is_bot=False, first_name="Test"),
+ ),
+ ),
+ True,
+ True,
+ ),
+ pytest.param(
+ "business_message",
+ Update(
+ update_id=42,
+ business_message=Message(
+ message_id=42,
+ date=datetime.datetime.now(),
+ text="test",
+ chat=Chat(id=42, type="private"),
+ from_user=User(id=42, is_bot=False, first_name="Test"),
+ ),
+ ),
+ True,
+ True,
+ ),
],
)
async def test_listen_update(