diff --git a/doctests/dt_set.py b/doctests/dt_set.py index 8ac22fe1de..0c0562ac80 100644 --- a/doctests/dt_set.py +++ b/doctests/dt_set.py @@ -58,11 +58,11 @@ r.sadd("bikes:racing:usa", "bike:1", "bike:4") # HIDE_END res7 = r.sinter("bikes:racing:france", "bikes:racing:usa") -print(res7) # >>> {'bike:1'} +print(res7) # >>> ['bike:1'] # STEP_END # REMOVE_START -assert res7 == {"bike:1"} +assert res7 == ["bike:1"] # REMOVE_END # STEP_START scard @@ -83,12 +83,12 @@ print(res9) # >>> 3 res10 = r.smembers("bikes:racing:france") -print(res10) # >>> {'bike:1', 'bike:2', 'bike:3'} +print(res10) # >>> ['bike:1', 'bike:2', 'bike:3'] # STEP_END # REMOVE_START assert res9 == 3 -assert res10 == {"bike:1", "bike:2", "bike:3"} +assert res10 == ['bike:1', 'bike:2', 'bike:3'] # REMOVE_END # STEP_START smismember @@ -109,11 +109,11 @@ r.sadd("bikes:racing:usa", "bike:1", "bike:4") res13 = r.sdiff("bikes:racing:france", "bikes:racing:usa") -print(res13) # >>> {'bike:2', 'bike:3'} +print(res13) # >>> ['bike:2', 'bike:3'] # STEP_END # REMOVE_START -assert res13 == {"bike:2", "bike:3"} +assert res13 == ['bike:2', 'bike:3'] r.delete("bikes:racing:france") r.delete("bikes:racing:usa") # REMOVE_END @@ -124,27 +124,27 @@ r.sadd("bikes:racing:italy", "bike:1", "bike:2", "bike:3", "bike:4") res13 = r.sinter("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") -print(res13) # >>> {'bike:1'} +print(res13) # >>> ['bike:1'] res14 = r.sunion("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") -print(res14) # >>> {'bike:1', 'bike:2', 'bike:3', 'bike:4'} +print(res14) # >>> ['bike:1', 'bike:2', 'bike:3', 'bike:4'] res15 = r.sdiff("bikes:racing:france", "bikes:racing:usa", "bikes:racing:italy") -print(res15) # >>> set() +print(res15) # >>> [] res16 = r.sdiff("bikes:racing:usa", "bikes:racing:france") -print(res16) # >>> {'bike:4'} +print(res16) # >>> ['bike:4'] res17 = r.sdiff("bikes:racing:france", "bikes:racing:usa") -print(res17) # >>> {'bike:2', 'bike:3'} +print(res17) # >>> ['bike:2', 'bike:3'] # STEP_END # REMOVE_START -assert res13 == {"bike:1"} -assert res14 == {"bike:1", "bike:2", "bike:3", "bike:4"} -assert res15 == set() -assert res16 == {"bike:4"} -assert res17 == {"bike:2", "bike:3"} +assert res13 == ['bike:1'] +assert res14 == ['bike:1', 'bike:2', 'bike:3', 'bike:4'] +assert res15 == [] +assert res16 == ['bike:4'] +assert res17 == ['bike:2', 'bike:3'] r.delete("bikes:racing:france") r.delete("bikes:racing:usa") r.delete("bikes:racing:italy") @@ -160,7 +160,7 @@ print(res19) # >>> bike:3 res20 = r.smembers("bikes:racing:france") -print(res20) # >>> {'bike:2', 'bike:4', 'bike:5'} +print(res20) # >>> ['bike:2', 'bike:4', 'bike:5'] res21 = r.srandmember("bikes:racing:france") print(res21) # >>> bike:4 diff --git a/redis/_parsers/helpers.py b/redis/_parsers/helpers.py index 23fc6db40e..85b084dfdf 100644 --- a/redis/_parsers/helpers.py +++ b/redis/_parsers/helpers.py @@ -783,9 +783,6 @@ def string_keys_to_dict(key_string, callback): _RedisCallbacksRESP2 = { - **string_keys_to_dict( - "SDIFF SINTER SMEMBERS SUNION", lambda r: r and set(r) or set() - ), **string_keys_to_dict( "ZDIFF ZINTER ZPOPMAX ZPOPMIN ZRANGE ZRANGEBYSCORE ZRANK ZREVRANGE " "ZREVRANGEBYSCORE ZREVRANK ZUNION", diff --git a/redis/_parsers/resp3.py b/redis/_parsers/resp3.py index cc210b9df5..3547fcf355 100644 --- a/redis/_parsers/resp3.py +++ b/redis/_parsers/resp3.py @@ -88,15 +88,11 @@ def _read_response(self, disable_decoding=False, push_request=False): # set response elif byte == b"~": # redis can return unhashable types (like dict) in a set, - # so we need to first convert to a list, and then try to convert it to a set + # so we return sets as list, all the time, for predictability response = [ self._read_response(disable_decoding=disable_decoding) for _ in range(int(response)) ] - try: - response = set(response) - except TypeError: - pass # map response elif byte == b"%": # We cannot use a dict-comprehension to parse stream. @@ -233,15 +229,11 @@ async def _read_response( # set response elif byte == b"~": # redis can return unhashable types (like dict) in a set, - # so we need to first convert to a list, and then try to convert it to a set + # so we always convert to a list, to have predictable return types response = [ (await self._read_response(disable_decoding=disable_decoding)) for _ in range(int(response)) ] - try: - response = set(response) - except TypeError: - pass # map response elif byte == b"%": # We cannot use a dict-comprehension to parse stream. diff --git a/redis/commands/bf/commands.py b/redis/commands/bf/commands.py index 447f844508..0a88505557 100644 --- a/redis/commands/bf/commands.py +++ b/redis/commands/bf/commands.py @@ -1,6 +1,5 @@ from redis.client import NEVER_DECODE -from redis.exceptions import ModuleError -from redis.utils import HIREDIS_AVAILABLE, deprecated_function +from redis.utils import deprecated_function BF_RESERVE = "BF.RESERVE" BF_ADD = "BF.ADD" @@ -139,9 +138,6 @@ def scandump(self, key, iter): This command will return successive (iter, data) pairs until (0, NULL) to indicate completion. For more information see `BF.SCANDUMP `_. """ # noqa - if HIREDIS_AVAILABLE: - raise ModuleError("This command cannot be used when hiredis is available.") - params = [key, iter] options = {} options[NEVER_DECODE] = [] diff --git a/redis/utils.py b/redis/utils.py index 360ee54b8c..a0f31f7ca4 100644 --- a/redis/utils.py +++ b/redis/utils.py @@ -6,8 +6,8 @@ try: import hiredis # noqa - # Only support Hiredis >= 1.0: - HIREDIS_AVAILABLE = not hiredis.__version__.startswith("0.") + # Only support Hiredis >= 3.0: + HIREDIS_AVAILABLE = int(hiredis.__version__.split(".")[0]) >= 3 HIREDIS_PACK_AVAILABLE = hasattr(hiredis, "pack_command") except ImportError: HIREDIS_AVAILABLE = False diff --git a/setup.py b/setup.py index 39cd40b807..0c968a4d9f 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ "Programming Language :: Python :: Implementation :: PyPy", ], extras_require={ - "hiredis": ["hiredis>=1.0.0"], + "hiredis": ["hiredis>=3.0.0"], "ocsp": ["cryptography>=36.0.1", "pyopenssl==23.2.1", "requests>=2.31.0"], }, ) diff --git a/tests/test_asyncio/test_bloom.py b/tests/test_asyncio/test_bloom.py index c63559a31c..031e8364d7 100644 --- a/tests/test_asyncio/test_bloom.py +++ b/tests/test_asyncio/test_bloom.py @@ -3,8 +3,7 @@ import pytest import pytest_asyncio import redis.asyncio as redis -from redis.exceptions import ModuleError, RedisError -from redis.utils import HIREDIS_AVAILABLE +from redis.exceptions import RedisError from tests.conftest import ( assert_resp_response, is_resp2_connection, @@ -105,10 +104,6 @@ async def do_verify(): await do_verify() cmds = [] - if HIREDIS_AVAILABLE: - with pytest.raises(ModuleError): - cur = await decoded_r.bf().scandump("myBloom", 0) - return cur = await decoded_r.bf().scandump("myBloom", 0) first = cur[0] diff --git a/tests/test_asyncio/test_cluster.py b/tests/test_asyncio/test_cluster.py index a36040f11b..c16272bb5b 100644 --- a/tests/test_asyncio/test_cluster.py +++ b/tests/test_asyncio/test_cluster.py @@ -1753,49 +1753,49 @@ async def test_cluster_rpoplpush(self, r: RedisCluster) -> None: async def test_cluster_sdiff(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2", "3") - assert await r.sdiff("{foo}a", "{foo}b") == {b"1", b"2", b"3"} + assert set(await r.sdiff("{foo}a", "{foo}b")) == {b"1", b"2", b"3"} await r.sadd("{foo}b", "2", "3") - assert await r.sdiff("{foo}a", "{foo}b") == {b"1"} + assert await r.sdiff("{foo}a", "{foo}b") == [b"1"] async def test_cluster_sdiffstore(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2", "3") assert await r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 3 - assert await r.smembers("{foo}c") == {b"1", b"2", b"3"} + assert set(await r.smembers("{foo}c")) == {b"1", b"2", b"3"} await r.sadd("{foo}b", "2", "3") assert await r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 1 - assert await r.smembers("{foo}c") == {b"1"} + assert await r.smembers("{foo}c") == [b"1"] async def test_cluster_sinter(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2", "3") - assert await r.sinter("{foo}a", "{foo}b") == set() + assert await r.sinter("{foo}a", "{foo}b") == [] await r.sadd("{foo}b", "2", "3") - assert await r.sinter("{foo}a", "{foo}b") == {b"2", b"3"} + assert set(await r.sinter("{foo}a", "{foo}b")) == {b"2", b"3"} async def test_cluster_sinterstore(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2", "3") assert await r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 0 - assert await r.smembers("{foo}c") == set() + assert await r.smembers("{foo}c") == [] await r.sadd("{foo}b", "2", "3") assert await r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 2 - assert await r.smembers("{foo}c") == {b"2", b"3"} + assert set(await r.smembers("{foo}c")) == {b"2", b"3"} async def test_cluster_smove(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "a1", "a2") await r.sadd("{foo}b", "b1", "b2") assert await r.smove("{foo}a", "{foo}b", "a1") - assert await r.smembers("{foo}a") == {b"a2"} - assert await r.smembers("{foo}b") == {b"b1", b"b2", b"a1"} + assert await r.smembers("{foo}a") == [b"a2"] + assert set(await r.smembers("{foo}b")) == {b"b1", b"b2", b"a1"} async def test_cluster_sunion(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2") await r.sadd("{foo}b", "2", "3") - assert await r.sunion("{foo}a", "{foo}b") == {b"1", b"2", b"3"} + assert set(await r.sunion("{foo}a", "{foo}b")) == {b"1", b"2", b"3"} async def test_cluster_sunionstore(self, r: RedisCluster) -> None: await r.sadd("{foo}a", "1", "2") await r.sadd("{foo}b", "2", "3") assert await r.sunionstore("{foo}c", "{foo}a", "{foo}b") == 3 - assert await r.smembers("{foo}c") == {b"1", b"2", b"3"} + assert set(await r.smembers("{foo}c")) == {b"1", b"2", b"3"} @skip_if_server_version_lt("6.2.0") async def test_cluster_zdiff(self, r: RedisCluster) -> None: diff --git a/tests/test_asyncio/test_commands.py b/tests/test_asyncio/test_commands.py index 61c00541cb..28c3094cdb 100644 --- a/tests/test_asyncio/test_commands.py +++ b/tests/test_asyncio/test_commands.py @@ -1406,7 +1406,7 @@ async def test_zscan_iter(self, r: redis.Redis): async def test_sadd(self, r: redis.Redis): members = {b"1", b"2", b"3"} await r.sadd("a", *members) - assert await r.smembers("a") == members + assert set(await r.smembers("a")) == members async def test_scard(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") @@ -1415,34 +1415,34 @@ async def test_scard(self, r: redis.Redis): @pytest.mark.onlynoncluster async def test_sdiff(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") - assert await r.sdiff("a", "b") == {b"1", b"2", b"3"} + assert set(await r.sdiff("a", "b")) == {b"1", b"2", b"3"} await r.sadd("b", "2", "3") - assert await r.sdiff("a", "b") == {b"1"} + assert await r.sdiff("a", "b") == [b"1"] @pytest.mark.onlynoncluster async def test_sdiffstore(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") assert await r.sdiffstore("c", "a", "b") == 3 - assert await r.smembers("c") == {b"1", b"2", b"3"} + assert set(await r.smembers("c")) == {b"1", b"2", b"3"} await r.sadd("b", "2", "3") assert await r.sdiffstore("c", "a", "b") == 1 - assert await r.smembers("c") == {b"1"} + assert await r.smembers("c") == [b"1"] @pytest.mark.onlynoncluster async def test_sinter(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") - assert await r.sinter("a", "b") == set() + assert await r.sinter("a", "b") == [] await r.sadd("b", "2", "3") - assert await r.sinter("a", "b") == {b"2", b"3"} + assert set(await r.sinter("a", "b")) == {b"2", b"3"} @pytest.mark.onlynoncluster async def test_sinterstore(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") assert await r.sinterstore("c", "a", "b") == 0 - assert await r.smembers("c") == set() + assert await r.smembers("c") == [] await r.sadd("b", "2", "3") assert await r.sinterstore("c", "a", "b") == 2 - assert await r.smembers("c") == {b"2", b"3"} + assert set(await r.smembers("c")) == {b"2", b"3"} async def test_sismember(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") @@ -1453,22 +1453,22 @@ async def test_sismember(self, r: redis.Redis): async def test_smembers(self, r: redis.Redis): await r.sadd("a", "1", "2", "3") - assert await r.smembers("a") == {b"1", b"2", b"3"} + assert set(await r.smembers("a")) == {b"1", b"2", b"3"} @pytest.mark.onlynoncluster async def test_smove(self, r: redis.Redis): await r.sadd("a", "a1", "a2") await r.sadd("b", "b1", "b2") assert await r.smove("a", "b", "a1") - assert await r.smembers("a") == {b"a2"} - assert await r.smembers("b") == {b"b1", b"b2", b"a1"} + assert await r.smembers("a") == [b"a2"] + assert set(await r.smembers("b")) == {b"b1", b"b2", b"a1"} async def test_spop(self, r: redis.Redis): s = [b"1", b"2", b"3"] await r.sadd("a", *s) value = await r.spop("a") assert value in s - assert await r.smembers("a") == set(s) - {value} + assert set(await r.smembers("a")) == set(s) - {value} @skip_if_server_version_lt("3.2.0") async def test_spop_multi_value(self, r: redis.Redis): @@ -1481,9 +1481,7 @@ async def test_spop_multi_value(self, r: redis.Redis): assert value in s response = await r.spop("a", 1) - assert_resp_response( - r, response, list(set(s) - set(values)), set(s) - set(values) - ) + assert set(response) == set(s) - set(values) async def test_srandmember(self, r: redis.Redis): s = [b"1", b"2", b"3"] @@ -1502,20 +1500,20 @@ async def test_srem(self, r: redis.Redis): await r.sadd("a", "1", "2", "3", "4") assert await r.srem("a", "5") == 0 assert await r.srem("a", "2", "4") == 2 - assert await r.smembers("a") == {b"1", b"3"} + assert set(await r.smembers("a")) == {b"1", b"3"} @pytest.mark.onlynoncluster async def test_sunion(self, r: redis.Redis): await r.sadd("a", "1", "2") await r.sadd("b", "2", "3") - assert await r.sunion("a", "b") == {b"1", b"2", b"3"} + assert set(await r.sunion("a", "b")) == {b"1", b"2", b"3"} @pytest.mark.onlynoncluster async def test_sunionstore(self, r: redis.Redis): await r.sadd("a", "1", "2") await r.sadd("b", "2", "3") assert await r.sunionstore("c", "a", "b") == 3 - assert await r.smembers("c") == {b"1", b"2", b"3"} + assert set(await r.smembers("c")) == {b"1", b"2", b"3"} # SORTED SET COMMANDS async def test_zadd(self, r: redis.Redis): diff --git a/tests/test_asyncio/test_search.py b/tests/test_asyncio/test_search.py index 47d34f9c07..68560d1f2a 100644 --- a/tests/test_asyncio/test_search.py +++ b/tests/test_asyncio/test_search.py @@ -24,7 +24,6 @@ from redis.commands.search.result import Result from redis.commands.search.suggestion import Suggestion from tests.conftest import ( - assert_resp_response, is_resp2_connection, skip_if_redis_enterprise, skip_if_resp_version, @@ -862,7 +861,7 @@ async def test_tags(decoded_r: redis.Redis): assert 1 == res["total_results"] q2 = await decoded_r.ft().tagvals("tags") - assert set(tags.split(",") + tags2.split(",")) == q2 + assert set(tags.split(",") + tags2.split(",")) == set(q2) @pytest.mark.redismod @@ -986,7 +985,7 @@ async def test_dict_operations(decoded_r: redis.Redis): # Dump dict and inspect content res = await decoded_r.ft().dict_dump("custom_dict") - assert_resp_response(decoded_r, res, ["item1", "item3"], {"item1", "item3"}) + assert res == ["item1", "item3"] # Remove rest of the items before reload await decoded_r.ft().dict_del("custom_dict", *res) diff --git a/tests/test_asyncio/test_timeseries.py b/tests/test_asyncio/test_timeseries.py index 0475c318ec..5a1597f2d0 100644 --- a/tests/test_asyncio/test_timeseries.py +++ b/tests/test_asyncio/test_timeseries.py @@ -746,7 +746,7 @@ async def test_query_index(decoded_r: redis.Redis): assert 2 == len(await decoded_r.ts().queryindex(["Test=This"])) assert 1 == len(await decoded_r.ts().queryindex(["Taste=That"])) assert_resp_response( - decoded_r, await decoded_r.ts().queryindex(["Taste=That"]), [2], {"2"} + decoded_r, await decoded_r.ts().queryindex(["Taste=That"]), [2], ["2"] ) diff --git a/tests/test_bloom.py b/tests/test_bloom.py index d1a0484225..e44c421634 100644 --- a/tests/test_bloom.py +++ b/tests/test_bloom.py @@ -2,8 +2,7 @@ import pytest import redis.commands.bf -from redis.exceptions import ModuleError, RedisError -from redis.utils import HIREDIS_AVAILABLE +from redis.exceptions import RedisError from .conftest import ( _get_client, @@ -136,10 +135,6 @@ def do_verify(): do_verify() cmds = [] - if HIREDIS_AVAILABLE: - with pytest.raises(ModuleError): - cur = client.bf().scandump("myBloom", 0) - return cur = client.bf().scandump("myBloom", 0) first = cur[0] diff --git a/tests/test_cluster.py b/tests/test_cluster.py index 5a32bd6a7e..5a28f4cde5 100644 --- a/tests/test_cluster.py +++ b/tests/test_cluster.py @@ -1868,49 +1868,49 @@ def test_cluster_rpoplpush(self, r): def test_cluster_sdiff(self, r): r.sadd("{foo}a", "1", "2", "3") - assert r.sdiff("{foo}a", "{foo}b") == {b"1", b"2", b"3"} + assert set(r.sdiff("{foo}a", "{foo}b")) == {b"1", b"2", b"3"} r.sadd("{foo}b", "2", "3") - assert r.sdiff("{foo}a", "{foo}b") == {b"1"} + assert r.sdiff("{foo}a", "{foo}b") == [b"1"] def test_cluster_sdiffstore(self, r): r.sadd("{foo}a", "1", "2", "3") assert r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 3 - assert r.smembers("{foo}c") == {b"1", b"2", b"3"} + assert set(r.smembers("{foo}c")) == {b"1", b"2", b"3"} r.sadd("{foo}b", "2", "3") assert r.sdiffstore("{foo}c", "{foo}a", "{foo}b") == 1 - assert r.smembers("{foo}c") == {b"1"} + assert r.smembers("{foo}c") == [b"1"] def test_cluster_sinter(self, r): r.sadd("{foo}a", "1", "2", "3") - assert r.sinter("{foo}a", "{foo}b") == set() + assert r.sinter("{foo}a", "{foo}b") == [] r.sadd("{foo}b", "2", "3") - assert r.sinter("{foo}a", "{foo}b") == {b"2", b"3"} + assert set(r.sinter("{foo}a", "{foo}b")) == {b"2", b"3"} def test_cluster_sinterstore(self, r): r.sadd("{foo}a", "1", "2", "3") assert r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 0 - assert r.smembers("{foo}c") == set() + assert r.smembers("{foo}c") == [] r.sadd("{foo}b", "2", "3") assert r.sinterstore("{foo}c", "{foo}a", "{foo}b") == 2 - assert r.smembers("{foo}c") == {b"2", b"3"} + assert set(r.smembers("{foo}c")) == {b"2", b"3"} def test_cluster_smove(self, r): r.sadd("{foo}a", "a1", "a2") r.sadd("{foo}b", "b1", "b2") assert r.smove("{foo}a", "{foo}b", "a1") - assert r.smembers("{foo}a") == {b"a2"} - assert r.smembers("{foo}b") == {b"b1", b"b2", b"a1"} + assert r.smembers("{foo}a") == [b"a2"] + assert set(r.smembers("{foo}b")) == {b"b1", b"b2", b"a1"} def test_cluster_sunion(self, r): r.sadd("{foo}a", "1", "2") r.sadd("{foo}b", "2", "3") - assert r.sunion("{foo}a", "{foo}b") == {b"1", b"2", b"3"} + assert set(r.sunion("{foo}a", "{foo}b")) == {b"1", b"2", b"3"} def test_cluster_sunionstore(self, r): r.sadd("{foo}a", "1", "2") r.sadd("{foo}b", "2", "3") assert r.sunionstore("{foo}c", "{foo}a", "{foo}b") == 3 - assert r.smembers("{foo}c") == {b"1", b"2", b"3"} + assert set(r.smembers("{foo}c")) == {b"1", b"2", b"3"} @skip_if_server_version_lt("6.2.0") def test_cluster_zdiff(self, r): diff --git a/tests/test_command_parser.py b/tests/test_command_parser.py index 5c23a7096f..e3b44a147f 100644 --- a/tests/test_command_parser.py +++ b/tests/test_command_parser.py @@ -1,6 +1,5 @@ import pytest from redis._parsers import CommandsParser -from redis.utils import HIREDIS_AVAILABLE from .conftest import ( assert_resp_response, @@ -9,9 +8,6 @@ ) -# The response to COMMAND contains maps inside sets, which are not handled -# by the hiredis-py parser (see https://github.com/redis/hiredis-py/issues/188) -@pytest.mark.skipif(HIREDIS_AVAILABLE, reason="PythonParser only") class TestCommandsParser: def test_init_commands(self, r): commands_parser = CommandsParser(r) diff --git a/tests/test_commands.py b/tests/test_commands.py index 42376b50d8..02afab3c40 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -18,7 +18,6 @@ parse_info, ) from redis.client import EMPTY_RESPONSE, NEVER_DECODE -from redis.utils import HIREDIS_AVAILABLE from .conftest import ( _get_client, @@ -2239,7 +2238,7 @@ def test_zscan_iter(self, r): def test_sadd(self, r): members = {b"1", b"2", b"3"} r.sadd("a", *members) - assert r.smembers("a") == members + assert set(r.smembers("a")) == members def test_scard(self, r): r.sadd("a", "1", "2", "3") @@ -2248,25 +2247,25 @@ def test_scard(self, r): @pytest.mark.onlynoncluster def test_sdiff(self, r): r.sadd("a", "1", "2", "3") - assert r.sdiff("a", "b") == {b"1", b"2", b"3"} + assert set(r.sdiff("a", "b")) == {b"1", b"2", b"3"} r.sadd("b", "2", "3") - assert r.sdiff("a", "b") == {b"1"} + assert r.sdiff("a", "b") == [b"1"] @pytest.mark.onlynoncluster def test_sdiffstore(self, r): r.sadd("a", "1", "2", "3") assert r.sdiffstore("c", "a", "b") == 3 - assert r.smembers("c") == {b"1", b"2", b"3"} + assert set(r.smembers("c")) == {b"1", b"2", b"3"} r.sadd("b", "2", "3") assert r.sdiffstore("c", "a", "b") == 1 - assert r.smembers("c") == {b"1"} + assert r.smembers("c") == [b"1"] @pytest.mark.onlynoncluster def test_sinter(self, r): r.sadd("a", "1", "2", "3") - assert r.sinter("a", "b") == set() + assert r.sinter("a", "b") == [] r.sadd("b", "2", "3") - assert r.sinter("a", "b") == {b"2", b"3"} + assert set(r.sinter("a", "b")) == {b"2", b"3"} @pytest.mark.onlynoncluster @skip_if_server_version_lt("7.0.0") @@ -2281,10 +2280,10 @@ def test_sintercard(self, r): def test_sinterstore(self, r): r.sadd("a", "1", "2", "3") assert r.sinterstore("c", "a", "b") == 0 - assert r.smembers("c") == set() + assert r.smembers("c") == [] r.sadd("b", "2", "3") assert r.sinterstore("c", "a", "b") == 2 - assert r.smembers("c") == {b"2", b"3"} + assert set(r.smembers("c")) == {b"2", b"3"} def test_sismember(self, r): r.sadd("a", "1", "2", "3") @@ -2295,7 +2294,7 @@ def test_sismember(self, r): def test_smembers(self, r): r.sadd("a", "1", "2", "3") - assert r.smembers("a") == {b"1", b"2", b"3"} + assert set(r.smembers("a")) == {b"1", b"2", b"3"} @skip_if_server_version_lt("6.2.0") def test_smismember(self, r): @@ -2309,15 +2308,15 @@ def test_smove(self, r): r.sadd("a", "a1", "a2") r.sadd("b", "b1", "b2") assert r.smove("a", "b", "a1") - assert r.smembers("a") == {b"a2"} - assert r.smembers("b") == {b"b1", b"b2", b"a1"} + assert r.smembers("a") == [b"a2"] + assert set(r.smembers("b")) == {b"b1", b"b2", b"a1"} def test_spop(self, r): s = [b"1", b"2", b"3"] r.sadd("a", *s) value = r.spop("a") assert value in s - assert r.smembers("a") == set(s) - {value} + assert set(r.smembers("a")) == set(s) - {value} @skip_if_server_version_lt("3.2.0") def test_spop_multi_value(self, r): @@ -2328,12 +2327,7 @@ def test_spop_multi_value(self, r): for value in values: assert value in s - assert_resp_response( - r, - r.spop("a", 1), - list(set(s) - set(values)), - set(s) - set(values), - ) + assert set(r.spop("a", 1)) == set(s) - set(values) def test_srandmember(self, r): s = [b"1", b"2", b"3"] @@ -2352,20 +2346,20 @@ def test_srem(self, r): r.sadd("a", "1", "2", "3", "4") assert r.srem("a", "5") == 0 assert r.srem("a", "2", "4") == 2 - assert r.smembers("a") == {b"1", b"3"} + assert set(r.smembers("a")) == {b"1", b"3"} @pytest.mark.onlynoncluster def test_sunion(self, r): r.sadd("a", "1", "2") r.sadd("b", "2", "3") - assert r.sunion("a", "b") == {b"1", b"2", b"3"} + assert set(r.sunion("a", "b")) == {b"1", b"2", b"3"} @pytest.mark.onlynoncluster def test_sunionstore(self, r): r.sadd("a", "1", "2") r.sadd("b", "2", "3") assert r.sunionstore("c", "a", "b") == 3 - assert r.smembers("c") == {b"1", b"2", b"3"} + assert set(r.smembers("c")) == {b"1", b"2", b"3"} @skip_if_server_version_lt("1.0.0") @skip_if_redis_enterprise() @@ -5021,9 +5015,6 @@ def test_command_getkeys(self, r): r, res, ["key1", "key2", "key3"], [b"key1", b"key2", b"key3"] ) - # The response to COMMAND contains maps inside sets, which are not handled - # by the hiredis-py parser (see https://github.com/redis/hiredis-py/issues/188) - @pytest.mark.skipif(HIREDIS_AVAILABLE, reason="PythonParser only") @skip_if_server_version_lt("2.8.13") def test_command(self, r): res = r.command() @@ -5036,18 +5027,11 @@ def test_command(self, r): @skip_if_server_version_lt("7.0.0") @skip_if_redis_enterprise() def test_command_getkeysandflags(self, r: redis.Redis): - assert_resp_response( - r, - r.command_getkeysandflags("LMOVE", "mylist1", "mylist2", "left", "left"), - [ - [b"mylist1", [b"RW", b"access", b"delete"]], - [b"mylist2", [b"RW", b"insert"]], - ], - [ - [b"mylist1", {b"RW", b"access", b"delete"}], - [b"mylist2", {b"RW", b"insert"}], - ], - ) + res = r.command_getkeysandflags("LMOVE", "mylist1", "mylist2", "left", "left") + assert res == [ + [b"mylist1", [b"RW", b"access", b"delete"]], + [b"mylist2", [b"RW", b"insert"]], + ] @pytest.mark.onlynoncluster @skip_if_server_version_lt("4.0.0") diff --git a/tests/test_function.py b/tests/test_function.py index 9d6712ecf7..afb5833d18 100644 --- a/tests/test_function.py +++ b/tests/test_function.py @@ -68,7 +68,7 @@ def test_function_list(self, r): b"library_name": b"mylib", b"engine": b"LUA", b"functions": [ - {b"name": b"myfunc", b"description": None, b"flags": {b"no-writes"}} + {b"name": b"myfunc", b"description": None, b"flags": [b"no-writes"]} ], } ] @@ -98,7 +98,7 @@ def test_function_list_on_cluster(self, r): b"library_name": b"mylib", b"engine": b"LUA", b"functions": [ - {b"name": b"myfunc", b"description": None, b"flags": {b"no-writes"}} + {b"name": b"myfunc", b"description": None, b"flags": [b"no-writes"]} ], } ] diff --git a/tests/test_search.py b/tests/test_search.py index 493171a035..e84f03c0e4 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -27,7 +27,6 @@ from .conftest import ( _get_client, - assert_resp_response, is_resp2_connection, skip_if_redis_enterprise, skip_if_resp_version, @@ -893,7 +892,7 @@ def test_dict_operations(client): # Dump dict and inspect content res = client.ft().dict_dump("custom_dict") - assert_resp_response(client, res, ["item1", "item3"], {"item1", "item3"}) + assert res == ["item1", "item3"] # Remove rest of the items before reload client.ft().dict_del("custom_dict", *res) diff --git a/tests/test_timeseries.py b/tests/test_timeseries.py index 90e627ef6e..fb604d0329 100644 --- a/tests/test_timeseries.py +++ b/tests/test_timeseries.py @@ -988,7 +988,7 @@ def test_query_index(client): client.ts().create(2, labels={"Test": "This", "Taste": "That"}) assert 2 == len(client.ts().queryindex(["Test=This"])) assert 1 == len(client.ts().queryindex(["Taste=That"])) - assert_resp_response(client, client.ts().queryindex(["Taste=That"]), [2], {"2"}) + assert_resp_response(client, client.ts().queryindex(["Taste=That"]), [2], ["2"]) @pytest.mark.redismod