aiogram/tests/test_utils/test_callback_answer.py
Alex Root Junior 51beb48257
Enabled tests on Python 3.13, disabled on Python 3.8 (#1589)
* Try to enable tests on Python 3.13

* Remove support for Python 3.8 and PyPy 3.8

Dropped Python 3.8 and PyPy 3.8 from the CI workflow and updated the minimum required Python version to 3.9 in pyproject.toml. Also updated dependencies and tools to align with the new minimum Python version.

* Added changelog

* Reformat code

* Bump mypy python version
2024-10-19 14:55:38 +03:00

220 lines
6.8 KiB
Python

from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from aiogram.exceptions import CallbackAnswerException
from aiogram.methods import AnswerCallbackQuery
from aiogram.types import CallbackQuery, User
from aiogram.utils.callback_answer import CallbackAnswer, CallbackAnswerMiddleware
class TestCallbackAnswer:
@pytest.mark.parametrize(
"name,value",
[
["answered", True],
["answered", False],
["disabled", True],
["disabled", False],
["text", "test"],
["text", None],
["show_alert", True],
["show_alert", False],
["show_alert", None],
["url", "https://example.com"],
["url", None],
["cache_time", None],
["cache_time", 10],
],
)
def test_getters(self, name, value):
kwargs = {
"answered": False,
name: value,
}
instance = CallbackAnswer(**kwargs)
result = getattr(instance, name)
assert result == value
@pytest.mark.parametrize(
"name,value",
[
["disabled", True],
["disabled", False],
["text", None],
["text", ""],
["text", "test"],
["show_alert", None],
["show_alert", True],
["show_alert", False],
["url", None],
["url", "https://example.com"],
["cache_time", None],
["cache_time", 0],
["cache_time", 10],
],
)
def test_setter_allowed(self, name, value):
instance = CallbackAnswer(answered=False)
setattr(instance, name, value)
assert getattr(instance, name) == value
@pytest.mark.parametrize(
"name",
[
"disabled",
"text",
"show_alert",
"url",
"cache_time",
],
)
def test_setter_blocked(self, name):
instance = CallbackAnswer(answered=True)
with pytest.raises(CallbackAnswerException):
setattr(instance, name, "test")
def test_disable(self):
instance = CallbackAnswer(answered=False)
assert not instance.disabled
instance.disable()
assert instance.disabled
def test_str(self):
instance = CallbackAnswer(answered=False, text="test")
assert str(instance) == "CallbackAnswer(answered=False, disabled=False, text='test')"
class TestCallbackAnswerMiddleware:
@pytest.mark.parametrize(
"init_kwargs,flag_properties,expected",
[
[
{},
True,
{
"answered": False,
"disabled": False,
"text": None,
"show_alert": None,
"url": None,
"cache_time": None,
},
],
[
{
"pre": True,
"text": "test",
"show_alert": True,
"url": "https://example.com",
"cache_time": 5,
},
True,
{
"answered": True,
"disabled": False,
"text": "test",
"show_alert": True,
"url": "https://example.com",
"cache_time": 5,
},
],
[
{
"pre": False,
"text": "test",
"show_alert": True,
"url": "https://example.com",
"cache_time": 5,
},
{
"pre": True,
"disabled": True,
"text": "another test",
"show_alert": False,
"url": "https://example.com/game.html",
"cache_time": 10,
},
{
"answered": True,
"disabled": True,
"text": "another test",
"show_alert": False,
"url": "https://example.com/game.html",
"cache_time": 10,
},
],
],
)
def test_construct_answer(self, init_kwargs, flag_properties, expected):
middleware = CallbackAnswerMiddleware(**init_kwargs)
callback_answer = middleware.construct_callback_answer(properties=flag_properties)
for key, value in expected.items():
assert getattr(callback_answer, key) == value
def test_answer(self):
middleware = CallbackAnswerMiddleware()
event = CallbackQuery(
id="1",
from_user=User(id=42, first_name="Test", is_bot=False),
chat_instance="test",
)
callback_answer = CallbackAnswer(
answered=False,
disabled=False,
text="another test",
show_alert=False,
url="https://example.com/game.html",
cache_time=10,
)
method = middleware.answer(event=event, callback_answer=callback_answer)
assert isinstance(method, AnswerCallbackQuery)
assert method.text == callback_answer.text
assert method.show_alert == callback_answer.show_alert
assert method.url == callback_answer.url
assert method.cache_time == callback_answer.cache_time
@pytest.mark.parametrize(
"properties,expected_stack",
[
[{"answered": False}, ["handler", "answer"]],
[{"answered": True}, ["answer", "handler"]],
[{"disabled": True}, ["handler"]],
],
)
async def test_call(self, properties, expected_stack):
stack = []
event = CallbackQuery(
id="1",
from_user=User(id=42, first_name="Test", is_bot=False),
chat_instance="test",
)
async def handler(*args, **kwargs):
stack.append("handler")
async def answer(*args, **kwargs):
stack.append("answer")
middleware = CallbackAnswerMiddleware()
with (
patch(
"aiogram.utils.callback_answer.CallbackAnswerMiddleware.construct_callback_answer",
new_callable=MagicMock,
side_effect=lambda **kwargs: CallbackAnswer(**{"answered": False, **properties}),
),
patch(
"aiogram.utils.callback_answer.CallbackAnswerMiddleware.answer",
new=answer,
),
):
await middleware(handler, event, {})
assert stack == expected_stack
async def test_invalid_event_type(self):
middleware = CallbackAnswerMiddleware()
handler = AsyncMock()
await middleware(handler, None, {})
handler.assert_awaited()