diff options
author | Kristján Valur Jónsson <sweskman@gmail.com> | 2022-07-26 12:25:23 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-26 15:25:23 +0300 |
commit | 6f208212ed9114921840404591aecca9acd38f08 (patch) | |
tree | ab37049c4d6b5c04a11b32c85218d50bd8d54d52 /tests/test_asyncio/test_commands.py | |
parent | 1df1d32bb6845d2ccbbc340199babe9fe0ef29d6 (diff) | |
download | redis-py-6f208212ed9114921840404591aecca9acd38f08.tar.gz |
Fix warnings and resource usage problems in asyncio unittests (#2258)
* Use pytest-asyncio in auto mode
Remove overly genereric `pytestmark=pytest.mark.asyncio` causing lots of warning noise
* Use "Factories as Fixtures" test pattern for the `create_redis` fixture
this fixture is now async, avoiding teardown problems with missing event loops.
* Fix sporadic error on fast event loops, such as `--uvloop`
* Close connection, even if "username" was in kwargs
This fixes a resource usage warning in the async unittests.
* Do async cleanup of acl passwords via a fixture
* Remove unused import, fix whitespace
* Fix test with missing "await"
* Close pubsub objects after use in unittest
Use a simple fixture where possible, otherwise manually call pubsub.close()
* re-introduce `pytestmark=pytest.mark.asyncio` for python 3.6
* Use context manager to clean up connections in connection pool for unit tests
* Provide asynccontextmanager for python 3.6
* make `test_late_subscribe()` more robuste
* Catch a couple of additional leaked resources
Diffstat (limited to 'tests/test_asyncio/test_commands.py')
-rw-r--r-- | tests/test_asyncio/test_commands.py | 110 |
1 files changed, 31 insertions, 79 deletions
diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index e128ac4..913f05b 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -12,6 +12,8 @@ import pytest if sys.version_info[0:2] == (3, 6): import pytest as pytest_asyncio + + pytestmark = pytest.mark.asyncio else: import pytest_asyncio @@ -27,11 +29,24 @@ from tests.conftest import ( REDIS_6_VERSION = "5.9.0" -pytestmark = pytest.mark.asyncio +@pytest_asyncio.fixture() +async def r_teardown(r: redis.Redis): + """ + A special fixture which removes the provided names from the database after use + """ + usernames = [] + + def factory(username): + usernames.append(username) + return r + + yield factory + for username in usernames: + await r.acl_deluser(username) @pytest_asyncio.fixture() -async def slowlog(r: redis.Redis, event_loop): +async def slowlog(r: redis.Redis): current_config = await r.config_get() old_slower_than_value = current_config["slowlog-log-slower-than"] old_max_legnth_value = current_config["slowlog-max-len"] @@ -94,17 +109,9 @@ class TestRedisCommands: assert "get" in commands @skip_if_server_version_lt(REDIS_6_VERSION) - async def test_acl_deluser(self, r: redis.Redis, request, event_loop): + async def test_acl_deluser(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) assert await r.acl_deluser(username) == 0 assert await r.acl_setuser(username, enabled=False, reset=True) @@ -117,18 +124,9 @@ class TestRedisCommands: @skip_if_server_version_lt(REDIS_6_VERSION) @skip_if_server_version_gte("7.0.0") - async def test_acl_getuser_setuser(self, r: redis.Redis, request, event_loop): + async def test_acl_getuser_setuser(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) - + r = r_teardown(username) # test enabled=False assert await r.acl_setuser(username, enabled=False, reset=True) assert await r.acl_getuser(username) == { @@ -233,17 +231,9 @@ class TestRedisCommands: @skip_if_server_version_lt(REDIS_6_VERSION) @skip_if_server_version_gte("7.0.0") - async def test_acl_list(self, r: redis.Redis, request, event_loop): + async def test_acl_list(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) assert await r.acl_setuser(username, enabled=False, reset=True) users = await r.acl_list() @@ -251,17 +241,9 @@ class TestRedisCommands: @skip_if_server_version_lt(REDIS_6_VERSION) @pytest.mark.onlynoncluster - async def test_acl_log(self, r: redis.Redis, request, event_loop, create_redis): + async def test_acl_log(self, r_teardown, create_redis): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) await r.acl_setuser( username, enabled=True, @@ -294,55 +276,25 @@ class TestRedisCommands: assert await r.acl_log_reset() @skip_if_server_version_lt(REDIS_6_VERSION) - async def test_acl_setuser_categories_without_prefix_fails( - self, r: redis.Redis, request, event_loop - ): + async def test_acl_setuser_categories_without_prefix_fails(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) with pytest.raises(exceptions.DataError): await r.acl_setuser(username, categories=["list"]) @skip_if_server_version_lt(REDIS_6_VERSION) - async def test_acl_setuser_commands_without_prefix_fails( - self, r: redis.Redis, request, event_loop - ): + async def test_acl_setuser_commands_without_prefix_fails(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) with pytest.raises(exceptions.DataError): await r.acl_setuser(username, commands=["get"]) @skip_if_server_version_lt(REDIS_6_VERSION) - async def test_acl_setuser_add_passwords_and_nopass_fails( - self, r: redis.Redis, request, event_loop - ): + async def test_acl_setuser_add_passwords_and_nopass_fails(self, r_teardown): username = "redis-py-user" - - def teardown(): - coro = r.acl_deluser(username) - if event_loop.is_running(): - event_loop.create_task(coro) - else: - event_loop.run_until_complete(coro) - - request.addfinalizer(teardown) + r = r_teardown(username) with pytest.raises(exceptions.DataError): await r.acl_setuser(username, passwords="+mypass", nopass=True) |