mirror of
https://github.com/aiogram/aiogram.git
synced 2025-12-12 10:11:52 +00:00
[3.x] Bot API 5.3 + Improvements (#618)
* Regenerate API * Update code * Fixed command filter for photos * Fix tests so they are able to run * Test new and renamed API methods * Reformat files * Fix outer_middleware resolution (#637) (#640) * Fix outer_middleware resolution (#637) * Reformat files * Reorder routers when resolve middlewares Co-authored-by: Alex Root Junior <jroot.junior@gmail.com> * Added possibility to use empty callback data factory filter * Rename KeyboardConstructor to KeyboardBuilder * Fixed type Co-authored-by: evgfilim1 <evgfilim1@yandex.ru>
This commit is contained in:
parent
4599913e18
commit
ac2b0bb198
69 changed files with 1223 additions and 206 deletions
|
|
@ -42,6 +42,10 @@ async def redis_storage(redis_server):
|
|||
if not redis_server:
|
||||
pytest.skip("Redis is not available here")
|
||||
storage = RedisStorage.from_url(redis_server)
|
||||
try:
|
||||
await storage.redis.info()
|
||||
except ConnectionError as e:
|
||||
pytest.skip(str(e))
|
||||
try:
|
||||
yield storage
|
||||
finally:
|
||||
|
|
|
|||
24
tests/test_api/test_methods/test_ban_chat_member.py
Normal file
24
tests/test_api/test_methods/test_ban_chat_member.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.methods import BanChatMember, Request
|
||||
from tests.mocked_bot import MockedBot
|
||||
|
||||
|
||||
class TestKickChatMember:
|
||||
@pytest.mark.asyncio
|
||||
async def test_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(BanChatMember, ok=True, result=True)
|
||||
|
||||
response: bool = await BanChatMember(chat_id=-42, user_id=42)
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "banChatMember"
|
||||
assert response == prepare_result.result
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_bot_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(BanChatMember, ok=True, result=True)
|
||||
|
||||
response: bool = await bot.ban_chat_member(chat_id=-42, user_id=42)
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "banChatMember"
|
||||
assert response == prepare_result.result
|
||||
24
tests/test_api/test_methods/test_delete_my_commands.py
Normal file
24
tests/test_api/test_methods/test_delete_my_commands.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.methods import BanChatMember, DeleteMyCommands, Request
|
||||
from tests.mocked_bot import MockedBot
|
||||
|
||||
|
||||
class TestKickChatMember:
|
||||
@pytest.mark.asyncio
|
||||
async def test_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(DeleteMyCommands, ok=True, result=True)
|
||||
|
||||
response: bool = await DeleteMyCommands()
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "deleteMyCommands"
|
||||
assert response == prepare_result.result
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_bot_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(DeleteMyCommands, ok=True, result=True)
|
||||
|
||||
response: bool = await bot.delete_my_commands()
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "deleteMyCommands"
|
||||
assert response == prepare_result.result
|
||||
|
|
@ -3,7 +3,7 @@ from typing import List
|
|||
import pytest
|
||||
|
||||
from aiogram.methods import GetChatAdministrators, Request
|
||||
from aiogram.types import ChatMember, User
|
||||
from aiogram.types import ChatMember, ChatMemberOwner, User
|
||||
from tests.mocked_bot import MockedBot
|
||||
|
||||
|
||||
|
|
@ -14,7 +14,9 @@ class TestGetChatAdministrators:
|
|||
GetChatAdministrators,
|
||||
ok=True,
|
||||
result=[
|
||||
ChatMember(user=User(id=42, is_bot=False, first_name="User"), status="creator")
|
||||
ChatMemberOwner(
|
||||
user=User(id=42, is_bot=False, first_name="User"), is_anonymous=False
|
||||
)
|
||||
],
|
||||
)
|
||||
|
||||
|
|
@ -29,7 +31,9 @@ class TestGetChatAdministrators:
|
|||
GetChatAdministrators,
|
||||
ok=True,
|
||||
result=[
|
||||
ChatMember(user=User(id=42, is_bot=False, first_name="User"), status="creator")
|
||||
ChatMemberOwner(
|
||||
user=User(id=42, is_bot=False, first_name="User"), is_anonymous=False
|
||||
)
|
||||
],
|
||||
)
|
||||
response: List[ChatMember] = await bot.get_chat_administrators(chat_id=-42)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.methods import GetChatMember, Request
|
||||
from aiogram.types import ChatMember, User
|
||||
from aiogram.types import ChatMember, ChatMemberOwner, User
|
||||
from tests.mocked_bot import MockedBot
|
||||
|
||||
|
||||
|
|
@ -11,7 +11,9 @@ class TestGetChatMember:
|
|||
prepare_result = bot.add_result_for(
|
||||
GetChatMember,
|
||||
ok=True,
|
||||
result=ChatMember(user=User(id=42, is_bot=False, first_name="User"), status="creator"),
|
||||
result=ChatMemberOwner(
|
||||
user=User(id=42, is_bot=False, first_name="User"), is_anonymous=False
|
||||
),
|
||||
)
|
||||
|
||||
response: ChatMember = await GetChatMember(chat_id=-42, user_id=42)
|
||||
|
|
@ -24,7 +26,9 @@ class TestGetChatMember:
|
|||
prepare_result = bot.add_result_for(
|
||||
GetChatMember,
|
||||
ok=True,
|
||||
result=ChatMember(user=User(id=42, is_bot=False, first_name="User"), status="creator"),
|
||||
result=ChatMemberOwner(
|
||||
user=User(id=42, is_bot=False, first_name="User"), is_anonymous=False
|
||||
),
|
||||
)
|
||||
|
||||
response: ChatMember = await bot.get_chat_member(chat_id=-42, user_id=42)
|
||||
|
|
|
|||
24
tests/test_api/test_methods/test_get_chat_member_count.py
Normal file
24
tests/test_api/test_methods/test_get_chat_member_count.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.methods import GetChatMemberCount, Request
|
||||
from tests.mocked_bot import MockedBot
|
||||
|
||||
|
||||
class TestGetChatMembersCount:
|
||||
@pytest.mark.asyncio
|
||||
async def test_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(GetChatMemberCount, ok=True, result=42)
|
||||
|
||||
response: int = await GetChatMemberCount(chat_id=-42)
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "getChatMemberCount"
|
||||
assert response == prepare_result.result
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_bot_method(self, bot: MockedBot):
|
||||
prepare_result = bot.add_result_for(GetChatMemberCount, ok=True, result=42)
|
||||
|
||||
response: int = await bot.get_chat_member_count(chat_id=-42)
|
||||
request: Request = bot.get_request()
|
||||
assert request.method == "getChatMemberCount"
|
||||
assert response == prepare_result.result
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
import pytest
|
||||
|
||||
from aiogram.types import ChatMember, User
|
||||
|
||||
user = User(id=42, is_bot=False, first_name="User", last_name=None)
|
||||
|
||||
|
||||
class TestChatMember:
|
||||
@pytest.mark.parametrize(
|
||||
"status,result", [["administrator", True], ["creator", True], ["member", False]]
|
||||
)
|
||||
def test_is_chat_admin(self, status: str, result: bool):
|
||||
chat_member = ChatMember(user=user, status=status)
|
||||
assert chat_member.is_chat_admin == result
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"status,result",
|
||||
[
|
||||
["administrator", True],
|
||||
["creator", True],
|
||||
["member", True],
|
||||
["restricted", True],
|
||||
["kicked", False],
|
||||
["left", False],
|
||||
],
|
||||
)
|
||||
def test_is_chat_member(self, status: str, result: bool):
|
||||
chat_member = ChatMember(user=user, status=status)
|
||||
assert chat_member.is_chat_member == result
|
||||
|
|
@ -2,6 +2,7 @@ import asyncio
|
|||
import datetime
|
||||
import time
|
||||
import warnings
|
||||
from collections import Counter
|
||||
from typing import Any
|
||||
|
||||
import pytest
|
||||
|
|
@ -14,7 +15,7 @@ from aiogram.methods import GetMe, GetUpdates, SendMessage
|
|||
from aiogram.types import (
|
||||
CallbackQuery,
|
||||
Chat,
|
||||
ChatMember,
|
||||
ChatMemberMember,
|
||||
ChatMemberUpdated,
|
||||
ChosenInlineResult,
|
||||
InlineQuery,
|
||||
|
|
@ -375,11 +376,11 @@ class TestDispatcher:
|
|||
chat=Chat(id=42, type="private"),
|
||||
from_user=User(id=42, is_bot=False, first_name="Test"),
|
||||
date=datetime.datetime.now(),
|
||||
old_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
old_chat_member=ChatMemberMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test")
|
||||
),
|
||||
new_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
new_chat_member=ChatMemberMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test")
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
@ -394,11 +395,11 @@ class TestDispatcher:
|
|||
chat=Chat(id=42, type="private"),
|
||||
from_user=User(id=42, is_bot=False, first_name="Test"),
|
||||
date=datetime.datetime.now(),
|
||||
old_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
old_chat_member=ChatMemberMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test")
|
||||
),
|
||||
new_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
new_chat_member=ChatMemberMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test")
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
@ -494,6 +495,50 @@ class TestDispatcher:
|
|||
assert result["event_router"] == router1
|
||||
assert result["test"] == "PASS"
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_nested_router_middleware_resolution(self, bot: MockedBot):
|
||||
counter = Counter()
|
||||
|
||||
def mw(type_: str, inject_data: dict):
|
||||
async def middleware(h, event, data):
|
||||
counter[type_] += 1
|
||||
data.update(inject_data)
|
||||
return await h(event, data)
|
||||
|
||||
return middleware
|
||||
|
||||
async def handler(event, foo, bar, baz, fizz, buzz):
|
||||
counter["child.handler"] += 1
|
||||
|
||||
root = Dispatcher()
|
||||
child = Router()
|
||||
|
||||
root.message.outer_middleware(mw("root.outer_middleware", {"foo": True}))
|
||||
root.message.middleware(mw("root.middleware", {"bar": None}))
|
||||
child.message.outer_middleware(mw("child.outer_middleware", {"fizz": 42}))
|
||||
child.message.middleware(mw("child.middleware", {"buzz": -42}))
|
||||
child.message.register(handler)
|
||||
|
||||
root.include_router(child)
|
||||
await root.feed_update(
|
||||
bot=bot,
|
||||
update=Update(
|
||||
update_id=42,
|
||||
message=Message(
|
||||
message_id=42,
|
||||
date=datetime.datetime.fromtimestamp(0),
|
||||
chat=Chat(id=-42, type="group"),
|
||||
),
|
||||
),
|
||||
baz=...,
|
||||
)
|
||||
|
||||
assert counter["root.outer_middleware"] == 2
|
||||
assert counter["root.middleware"] == 1
|
||||
assert counter["child.outer_middleware"] == 1
|
||||
assert counter["child.middleware"] == 1
|
||||
assert counter["child.handler"] == 1
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_process_update_call_request(self, bot: MockedBot):
|
||||
dispatcher = Dispatcher()
|
||||
|
|
|
|||
|
|
@ -156,7 +156,11 @@ class TestCallbackDataFilter:
|
|||
["test", F.foo == "test", False],
|
||||
["test:spam:42", F.foo == "test", False],
|
||||
["test:test:42", F.foo == "test", {"callback_data": MyCallback(foo="test", bar=42)}],
|
||||
["test:test:42", None, {"callback_data": MyCallback(foo="test", bar=42)}],
|
||||
["test:test:777", None, {"callback_data": MyCallback(foo="test", bar=777)}],
|
||||
["spam:test:777", None, False],
|
||||
["test:test:", F.foo == "test", False],
|
||||
["test:test:", None, False],
|
||||
],
|
||||
)
|
||||
@pytest.mark.asyncio
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ from typing import Any
|
|||
import pytest
|
||||
|
||||
from aiogram.dispatcher.handler.chat_member import ChatMemberHandler
|
||||
from aiogram.types import Chat, ChatMember, ChatMemberUpdated, User
|
||||
from aiogram.types import Chat, ChatMemberMember, ChatMemberUpdated, User
|
||||
|
||||
|
||||
class TestChatMemberUpdated:
|
||||
|
|
@ -14,12 +14,8 @@ class TestChatMemberUpdated:
|
|||
chat=Chat(id=42, type="private"),
|
||||
from_user=User(id=42, is_bot=False, first_name="Test"),
|
||||
date=datetime.datetime.now(),
|
||||
old_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
),
|
||||
new_chat_member=ChatMember(
|
||||
user=User(id=42, is_bot=False, first_name="Test"), status="restricted"
|
||||
),
|
||||
old_chat_member=ChatMemberMember(user=User(id=42, is_bot=False, first_name="Test")),
|
||||
new_chat_member=ChatMemberMember(user=User(id=42, is_bot=False, first_name="Test")),
|
||||
)
|
||||
|
||||
class MyHandler(ChatMemberHandler):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue