From c43ff9b6f9dd62cd2d84272e5c460b904b4c3276 Mon Sep 17 00:00:00 2001 From: Andrey Tikhonov Date: Sun, 14 Aug 2022 18:29:35 +0300 Subject: [PATCH] Patch 2 (#977) * Fix filtering skip_patterns * cache skip actions * fix item' is not defined, add tests --- aiogram/dispatcher/middlewares.py | 11 ++-- .../test_lifetimecontroller.py | 53 +++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 tests/test_dispatcher/test_middlewares/test_lifetimecontroller.py diff --git a/aiogram/dispatcher/middlewares.py b/aiogram/dispatcher/middlewares.py index cbe55220..fa002c88 100644 --- a/aiogram/dispatcher/middlewares.py +++ b/aiogram/dispatcher/middlewares.py @@ -117,11 +117,12 @@ class LifetimeControllerMiddleware(BaseMiddleware): if self._skip_actions is None: self._skip_actions = [] if self.skip_patterns: - self._skip_actions.extend([ - f"pre_process_{item}", - f"process_{item}", - f"post_process_{item}", - ]) + for item in self.skip_patterns: + self._skip_actions.extend([ + f"pre_process_{item}", + f"process_{item}", + f"post_process_{item}", + ]) return self._skip_actions async def pre_process(self, obj, data, *args): diff --git a/tests/test_dispatcher/test_middlewares/test_lifetimecontroller.py b/tests/test_dispatcher/test_middlewares/test_lifetimecontroller.py new file mode 100644 index 00000000..b4519a9b --- /dev/null +++ b/tests/test_dispatcher/test_middlewares/test_lifetimecontroller.py @@ -0,0 +1,53 @@ +from unittest.mock import AsyncMock + +import pytest +from aiogram.dispatcher.middlewares import LifetimeControllerMiddleware + +pytestmark = pytest.mark.asyncio + + +async def test_no_skip(): + class Middleware(LifetimeControllerMiddleware): + pre_process = AsyncMock() + post_process = AsyncMock() + + m = Middleware() + await m.trigger("pre_process_update_xxx", [1, 2, 3]) + m.pre_process.assert_called_once_with(1, 3, 2) + m.post_process.assert_not_called() + await m.trigger("post_process_update_xxx", [1, 2, 3]) + m.pre_process.reset_mock() + m.pre_process.assert_not_called() + m.post_process.assert_called_once_with(1, 3, 2) + + +async def test_skip_prefix(): + class Middleware(LifetimeControllerMiddleware): + skip_patterns = ["update"] + pre_process = AsyncMock() + post_process = AsyncMock() + + m = Middleware() + await m.trigger("pre_process_update_xxx", [1, 2, 3]) + m.pre_process.assert_called_once_with(1, 3, 2) + m.post_process.assert_not_called() + await m.trigger("post_process_update_xxx", [1, 2, 3]) + m.pre_process.reset_mock() + m.pre_process.assert_not_called() + m.post_process.assert_called_once_with(1, 3, 2) + + +async def test_skip(): + class Middleware(LifetimeControllerMiddleware): + skip_patterns = ["update_xxx"] + pre_process = AsyncMock() + post_process = AsyncMock() + + m = Middleware() + await m.trigger("pre_process_update_xxx", [1, 2, 3]) + m.pre_process.assert_not_called() + m.post_process.assert_not_called() + await m.trigger("post_process_update_xxx", [1, 2, 3]) + m.pre_process.reset_mock() + m.pre_process.assert_not_called() + m.post_process.assert_not_called()