summaryrefslogtreecommitdiff
path: root/tests/test_asyncio/test_commands.py
diff options
context:
space:
mode:
authorKristján Valur Jónsson <sweskman@gmail.com>2022-07-26 12:25:23 +0000
committerGitHub <noreply@github.com>2022-07-26 15:25:23 +0300
commit6f208212ed9114921840404591aecca9acd38f08 (patch)
treeab37049c4d6b5c04a11b32c85218d50bd8d54d52 /tests/test_asyncio/test_commands.py
parent1df1d32bb6845d2ccbbc340199babe9fe0ef29d6 (diff)
downloadredis-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.py110
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)