diff --git a/CHANGES/1320.misc.rst b/CHANGES/1320.misc.rst new file mode 100644 index 00000000..f7e079ce --- /dev/null +++ b/CHANGES/1320.misc.rst @@ -0,0 +1 @@ +Fixed ResourceWarning in the tests, reworked :code:`RedisEventsIsolation` fixture to use Redis connection from :code:`RedisStorage` diff --git a/pyproject.toml b/pyproject.toml index 0557223b..2ae2f1b6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -237,10 +237,9 @@ asyncio_mode = "auto" testpaths = [ "tests", ] -filterwarnings = [ - "error", - "ignore::pytest.PytestUnraisableExceptionWarning", -] +#filterwarnings = [ +# "error", +#] [tool.coverage.run] branch = false diff --git a/tests/conftest.py b/tests/conftest.py index 1c72f386..3e063ff1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -38,7 +38,7 @@ def pytest_collection_modifyitems(config, items): raise UsageError(f"Invalid redis URI {redis_uri!r}: {e}") -@pytest.fixture(scope="session") +@pytest.fixture() def redis_server(request): redis_uri = request.config.getoption("--redis") return redis_uri @@ -73,20 +73,9 @@ async def memory_storage(): @pytest.fixture() @pytest.mark.redis -async def redis_isolation(redis_server): - if not redis_server: - pytest.skip("Redis is not available here") - isolation = RedisEventIsolation.from_url(redis_server) - try: - await isolation.redis.info() - except ConnectionError as e: - pytest.skip(str(e)) - try: - yield isolation - finally: - conn = await isolation.redis - await conn.flushdb() - await isolation.close() +async def redis_isolation(redis_storage): + isolation = redis_storage.create_isolation() + return isolation @pytest.fixture() diff --git a/tests/test_api/test_client/test_session/test_aiohttp_session.py b/tests/test_api/test_client/test_session/test_aiohttp_session.py index bc7aff83..6740dcc1 100644 --- a/tests/test_api/test_client/test_session/test_aiohttp_session.py +++ b/tests/test_api/test_client/test_session/test_aiohttp_session.py @@ -96,6 +96,8 @@ class TestAiohttpSession: await session.close() mocked_close.assert_called_once() + await session.close() + def test_build_form_data_with_data_only(self, bot: MockedBot): class TestMethod(TelegramMethod[bool]): __api_method__ = "test" diff --git a/tests/test_fsm/storage/test_isolation.py b/tests/test_fsm/storage/test_isolation.py index 60e240ae..8be303c4 100644 --- a/tests/test_fsm/storage/test_isolation.py +++ b/tests/test_fsm/storage/test_isolation.py @@ -1,6 +1,10 @@ +from unittest import mock +from unittest.mock import AsyncMock, patch + import pytest from aiogram.fsm.storage.base import BaseEventIsolation, StorageKey +from aiogram.fsm.storage.redis import RedisEventIsolation from tests.mocked_bot import MockedBot @@ -18,7 +22,6 @@ def create_storage_key(bot: MockedBot): ], ) class TestIsolations: - @pytest.mark.filterwarnings("ignore::ResourceWarning") async def test_lock( self, isolation: BaseEventIsolation, @@ -26,3 +29,35 @@ class TestIsolations: ): async with isolation.lock(key=storage_key): assert True, "Are you kidding me?" + + +class TestRedisEventIsolation: + def test_init_without_key_builder(self): + redis = AsyncMock() + isolation = RedisEventIsolation(redis=redis) + assert isolation.redis is redis + + assert isolation.key_builder is not None + + def test_init_with_key_builder(self): + redis = AsyncMock() + key_builder = AsyncMock() + isolation = RedisEventIsolation(redis=redis, key_builder=key_builder) + assert isolation.redis is redis + assert isolation.key_builder is key_builder + + def test_create_from_url(self): + with patch("redis.asyncio.connection.ConnectionPool.from_url") as pool: + isolation = RedisEventIsolation.from_url("redis://localhost:6379/0") + assert isinstance(isolation, RedisEventIsolation) + assert isolation.redis is not None + assert isolation.key_builder is not None + + assert pool.called_once_with("redis://localhost:6379/0") + + async def test_close(self): + isolation = RedisEventIsolation(redis=AsyncMock()) + await isolation.close() + + # close is not called because connection should be closed from the storage + # assert isolation.redis.close.called_once()