Fix: close #822 Fix exception filter (#827)

* fix exceptions filters

* Update CHANGES/827.bugfix

Co-authored-by: Alex Root Junior <jroot.junior@gmail.com>

Co-authored-by: Alex Root Junior <jroot.junior@gmail.com>
This commit is contained in:
darksidecat 2022-02-12 01:38:01 +02:00 committed by GitHub
parent c705858421
commit 1b8e22d90f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 5 deletions

1
CHANGES/827.bugfix Normal file
View file

@ -0,0 +1 @@
Fixed exceptions filters

View file

@ -4,6 +4,7 @@ from typing import Any, Dict, Pattern, Tuple, Type, Union, cast
from pydantic import validator
from aiogram.dispatcher.filters import BaseFilter
from aiogram.types import TelegramObject
class ExceptionTypeFilter(BaseFilter):
@ -17,7 +18,9 @@ class ExceptionTypeFilter(BaseFilter):
class Config:
arbitrary_types_allowed = True
async def __call__(self, exception: Exception) -> Union[bool, Dict[str, Any]]:
async def __call__(
self, obj: TelegramObject, exception: Exception
) -> Union[bool, Dict[str, Any]]:
return isinstance(exception, self.exception)
@ -38,7 +41,9 @@ class ExceptionMessageFilter(BaseFilter):
return re.compile(value)
return value
async def __call__(self, exception: Exception) -> Union[bool, Dict[str, Any]]:
async def __call__(
self, obj: TelegramObject, exception: Exception
) -> Union[bool, Dict[str, Any]]:
pattern = cast(Pattern[str], self.pattern)
result = pattern.match(str(exception))
if not result:

View file

@ -2,7 +2,9 @@ import re
import pytest
from aiogram import Dispatcher, F
from aiogram.dispatcher.filters import ExceptionMessageFilter, ExceptionTypeFilter
from aiogram.types import Update
pytestmark = pytest.mark.asyncio
@ -16,10 +18,10 @@ class TestExceptionMessageFilter:
async def test_match(self):
obj = ExceptionMessageFilter(pattern="KABOOM")
result = await obj(Exception())
result = await obj(Update(update_id=0), exception=Exception())
assert not result
result = await obj(Exception("KABOOM"))
result = await obj(Update(update_id=0), exception=Exception("KABOOM"))
assert isinstance(result, dict)
assert "match_exception" in result
@ -46,6 +48,21 @@ class TestExceptionTypeFilter:
async def test_check(self, exception: Exception, value: bool):
obj = ExceptionTypeFilter(exception=MyException)
result = await obj(exception)
result = await obj(Update(update_id=0), exception=exception)
assert result == value
class TestDispatchException:
async def test_handle_exception(self, bot):
dp = Dispatcher()
@dp.update()
async def update_handler(update):
raise ValueError("KABOOM")
@dp.errors(ExceptionMessageFilter(pattern="KABOOM"))
async def handler0(update, exception):
return "Handled"
assert await dp.feed_update(bot, Update(update_id=0)) == "Handled"