#896 Restrict including routers with strings

This commit is contained in:
Alex Root Junior 2022-04-25 20:54:48 +03:00
parent 4fb77a3a2a
commit 76daef5f1a
No known key found for this signature in database
GPG key ID: 074C1D455EBEA4AC
4 changed files with 2 additions and 38 deletions

1
CHANGES/896.misc.rst Normal file
View file

@ -0,0 +1 @@
Restrict including routers with strings

View file

@ -4,7 +4,6 @@ import warnings
from typing import Any, Dict, Generator, List, Optional, Set, Union from typing import Any, Dict, Generator, List, Optional, Set, Union
from ..types import TelegramObject from ..types import TelegramObject
from ..utils.imports import import_module
from ..utils.warnings import CodeHasNoEffect from ..utils.warnings import CodeHasNoEffect
from .event.bases import REJECTED, UNHANDLED from .event.bases import REJECTED, UNHANDLED
from .event.event import EventObserver from .event.event import EventObserver
@ -211,8 +210,6 @@ class Router:
:param router: :param router:
:return: :return:
""" """
if isinstance(router, str): # Resolve import string
router = import_module(router)
if not isinstance(router, Router): if not isinstance(router, Router):
raise ValueError( raise ValueError(
f"router should be instance of Router not {type(router).__class__.__name__}" f"router should be instance of Router not {type(router).__class__.__name__}"

View file

@ -5,7 +5,6 @@ from aiogram.dispatcher.router import Router
from aiogram.utils.warnings import CodeHasNoEffect from aiogram.utils.warnings import CodeHasNoEffect
pytestmark = pytest.mark.asyncio pytestmark = pytest.mark.asyncio
importable_router = Router()
class TestRouter: class TestRouter:
@ -46,14 +45,10 @@ class TestRouter:
with pytest.warns(CodeHasNoEffect): with pytest.warns(CodeHasNoEffect):
assert router1.include_router(router2) assert router1.include_router(router2)
def test_include_router_by_string(self):
router = Router()
router.include_router("tests.test_dispatcher.test_router:importable_router")
def test_include_router_by_string_bad_type(self): def test_include_router_by_string_bad_type(self):
router = Router() router = Router()
with pytest.raises(ValueError, match=r"router should be instance of Router"): with pytest.raises(ValueError, match=r"router should be instance of Router"):
router.include_router("tests.test_dispatcher.test_router:TestRouter") router.include_router(self)
def test_set_parent_router_bad_type(self): def test_set_parent_router_bad_type(self):
router = Router() router = Router()

View file

@ -1,29 +0,0 @@
import pytest
import aiogram
from aiogram.utils.imports import import_module
class TestImports:
def test_bad_type(self):
with pytest.raises(ValueError, match=r"Target should be string not"):
import_module(42)
@pytest.mark.parametrize("value", ["module", "module:", ":attribute"])
def test_bad_format(self, value):
with pytest.raises(ValueError, match='must be in format "<module>:<attribute>"'):
import_module(value)
@pytest.mark.parametrize("value", ["module", "aiogram.KABOOM", "aiogram.KABOOM.TEST"])
def test_bad_value(self, value):
with pytest.raises(ValueError, match="Could not import module"):
import_module(f"{value}:attribute")
def test_has_no_attribute(self):
with pytest.raises(ValueError, match="has no attribute"):
import_module("aiogram:KABOOM")
def test_imported(self):
value = import_module("aiogram:__version__")
isinstance(value, str)
assert value == aiogram.__version__