diff --git a/tests/conftest.py b/tests/conftest.py index 3b66adf46c..903e961b46 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -120,10 +120,10 @@ def pytest_addoption(parser): def _get_info(redis_url): client = redis.Redis.from_url(redis_url) info = client.info() - cmds = [command.upper() for command in client.command().keys()] - if "dping" in cmds: + try: + client.execute_command("DPING") info["enterprise"] = True - else: + except redis.ResponseError: info["enterprise"] = False client.connection_pool.disconnect() return info diff --git a/tests/test_cluster.py b/tests/test_cluster.py index ecc8624015..1ee5cdf450 100644 --- a/tests/test_cluster.py +++ b/tests/test_cluster.py @@ -629,6 +629,7 @@ def test_get_node_from_key(self, r): assert replica.server_type == REPLICA assert replica in slot_nodes + @skip_if_redis_enterprise() def test_not_require_full_coverage_cluster_down_error(self, r): """ When require_full_coverage is set to False (default client config) and not @@ -840,11 +841,13 @@ def test_cluster_pubsub_numsub(self, r): channels = [(b"foo", 1), (b"bar", 2), (b"baz", 3)] assert r.pubsub_numsub("foo", "bar", "baz", target_nodes="all") == channels + @skip_if_redis_enterprise() def test_cluster_myid(self, r): node = r.get_random_node() myid = r.cluster_myid(node) assert len(myid) == 40 + @skip_if_redis_enterprise() def test_cluster_slots(self, r): mock_all_nodes_resp(r, default_cluster_slots) cluster_slots = r.cluster_slots() @@ -853,17 +856,20 @@ def test_cluster_slots(self, r): assert cluster_slots.get((0, 8191)) is not None assert cluster_slots.get((0, 8191)).get("primary") == ("127.0.0.1", 7000) + @skip_if_redis_enterprise() def test_cluster_addslots(self, r): node = r.get_random_node() mock_node_resp(node, "OK") assert r.cluster_addslots(node, 1, 2, 3) is True @skip_if_server_version_lt("7.0.0") + @skip_if_redis_enterprise() def test_cluster_addslotsrange(self, r): node = r.get_random_node() mock_node_resp(node, "OK") assert r.cluster_addslotsrange(node, 1, 5) + @skip_if_redis_enterprise() def test_cluster_countkeysinslot(self, r): node = r.nodes_manager.get_node_from_slot(1) mock_node_resp(node, 2) @@ -873,6 +879,7 @@ def test_cluster_count_failure_report(self, r): mock_all_nodes_resp(r, 0) assert r.cluster_count_failure_report("node_0") == 0 + @skip_if_redis_enterprise() def test_cluster_delslots(self): cluster_slots = [ [ @@ -897,12 +904,14 @@ def test_cluster_delslots(self): assert node1.redis_connection.connection.read_response.called @skip_if_server_version_lt("7.0.0") + @skip_if_redis_enterprise() def test_cluster_delslotsrange(self, r): node = r.get_random_node() mock_node_resp(node, "OK") r.cluster_addslots(node, 1, 2, 3, 4, 5) assert r.cluster_delslotsrange(1, 5) + @skip_if_redis_enterprise() def test_cluster_failover(self, r): node = r.get_random_node() mock_node_resp(node, "OK") @@ -912,20 +921,24 @@ def test_cluster_failover(self, r): with pytest.raises(RedisError): r.cluster_failover(node, "FORCT") + @skip_if_redis_enterprise() def test_cluster_info(self, r): info = r.cluster_info() assert isinstance(info, dict) assert info["cluster_state"] == "ok" + @skip_if_redis_enterprise() def test_cluster_keyslot(self, r): mock_all_nodes_resp(r, 12182) assert r.cluster_keyslot("foo") == 12182 + @skip_if_redis_enterprise() def test_cluster_meet(self, r): node = r.get_default_node() mock_node_resp(node, "OK") assert r.cluster_meet("127.0.0.1", 6379) is True + @skip_if_redis_enterprise() def test_cluster_nodes(self, r): response = ( "c8253bae761cb1ecb2b61857d85dfe455a0fec8b 172.17.0.7:7006 " @@ -954,6 +967,7 @@ def test_cluster_nodes(self, r): == "c8253bae761cb1ecb2b61857d85dfe455a0fec8b" ) + @skip_if_redis_enterprise() def test_cluster_replicate(self, r): node = r.get_random_node() all_replicas = r.get_replicas() @@ -966,6 +980,7 @@ def test_cluster_replicate(self, r): else: assert results is True + @skip_if_redis_enterprise() def test_cluster_reset(self, r): mock_all_nodes_resp(r, "OK") assert r.cluster_reset() is True @@ -974,6 +989,7 @@ def test_cluster_reset(self, r): for res in all_results.values(): assert res is True + @skip_if_redis_enterprise() def test_cluster_save_config(self, r): node = r.get_random_node() all_nodes = r.get_nodes() @@ -983,6 +999,7 @@ def test_cluster_save_config(self, r): for res in all_results.values(): assert res is True + @skip_if_redis_enterprise() def test_cluster_get_keys_in_slot(self, r): response = [b"{foo}1", b"{foo}2"] node = r.nodes_manager.get_node_from_slot(12182) @@ -990,6 +1007,7 @@ def test_cluster_get_keys_in_slot(self, r): keys = r.cluster_get_keys_in_slot(12182, 4) assert keys == response + @skip_if_redis_enterprise() def test_cluster_set_config_epoch(self, r): mock_all_nodes_resp(r, "OK") assert r.cluster_set_config_epoch(3) is True @@ -997,6 +1015,7 @@ def test_cluster_set_config_epoch(self, r): for res in all_results.values(): assert res is True + @skip_if_redis_enterprise() def test_cluster_setslot(self, r): node = r.get_random_node() mock_node_resp(node, "OK") @@ -1014,6 +1033,7 @@ def test_cluster_setslot_stable(self, r): assert r.cluster_setslot_stable(12182) is True assert node.redis_connection.connection.read_response.called + @skip_if_redis_enterprise() def test_cluster_replicas(self, r): response = [ b"01eca22229cf3c652b6fca0d09ff6941e0d2e3 " @@ -1045,6 +1065,7 @@ def test_cluster_links(self, r): for i in range(0, len(res) - 1, 2): assert res[i][3] == res[i + 1][3] + @skip_if_redis_enterprise() def test_readonly(self): r = get_mocked_redis_client(host=default_host, port=default_port) mock_all_nodes_resp(r, "OK") @@ -1055,6 +1076,7 @@ def test_readonly(self): for replica in r.get_replicas(): assert replica.redis_connection.connection.read_response.called + @skip_if_redis_enterprise() def test_readwrite(self): r = get_mocked_redis_client(host=default_host, port=default_port) mock_all_nodes_resp(r, "OK") @@ -1065,6 +1087,7 @@ def test_readwrite(self): for replica in r.get_replicas(): assert replica.redis_connection.connection.read_response.called + @skip_if_redis_enterprise() def test_bgsave(self, r): assert r.bgsave() sleep(0.3) @@ -1149,10 +1172,12 @@ def test_memory_usage(self, r): assert isinstance(r.memory_usage("foo"), int) @skip_if_server_version_lt("4.0.0") + @skip_if_redis_enterprise() def test_memory_malloc_stats(self, r): assert r.memory_malloc_stats() @skip_if_server_version_lt("4.0.0") + @skip_if_redis_enterprise() def test_memory_stats(self, r): # put a key into the current db to make sure that "db." # has data @@ -1174,6 +1199,7 @@ def test_memory_doctor(self, r): with pytest.raises(NotImplementedError): r.memory_doctor() + @skip_if_redis_enterprise() def test_lastsave(self, r): node = r.get_primaries()[0] assert isinstance(r.lastsave(target_nodes=node), datetime.datetime) @@ -1216,6 +1242,7 @@ def test_client_pause(self, r): r.client_pause(timeout="not an integer", target_nodes=node) @skip_if_server_version_lt("6.2.0") + @skip_if_redis_enterprise() def test_client_unpause(self, r): assert r.client_unpause() diff --git a/tests/test_command_parser.py b/tests/test_command_parser.py index ab050a74e7..1457e27531 100644 --- a/tests/test_command_parser.py +++ b/tests/test_command_parser.py @@ -2,7 +2,7 @@ from redis.commands import CommandsParser -from .conftest import skip_if_server_version_lt +from .conftest import skip_if_redis_enterprise, skip_if_server_version_lt class TestCommandsParser: @@ -21,6 +21,7 @@ def test_get_keys_predetermined_key_location(self, r): assert commands_parser.get_keys(r, *args3) == ["foo", "bar", "foobar"] @pytest.mark.filterwarnings("ignore:ResponseError") + @skip_if_redis_enterprise() def test_get_moveable_keys(self, r): commands_parser = CommandsParser(r) args1 = [ diff --git a/tests/test_commands.py b/tests/test_commands.py index de6bcead1c..a0d57f0441 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -65,6 +65,7 @@ def test_case_insensitive_command_names(self, r): class TestRedisCommands: + @skip_if_redis_enterprise() def test_auth(self, r, request): username = "redis-py-auth" @@ -104,6 +105,7 @@ def test_acl_cat_with_category(self, r): assert "get" in commands @skip_if_server_version_lt("7.0.0") + @skip_if_redis_enterprise() def test_acl_dryrun(self, r): username = "redis-py-user" r.acl_setuser( @@ -424,6 +426,7 @@ def test_client_id(self, r): @pytest.mark.onlynoncluster @skip_if_server_version_lt("6.2.0") + @skip_if_redis_enterprise() def test_client_trackinginfo(self, r): res = r.client_trackinginfo() assert len(res) > 2 @@ -431,6 +434,7 @@ def test_client_trackinginfo(self, r): @pytest.mark.onlynoncluster @skip_if_server_version_lt("6.0.0") + @skip_if_redis_enterprise() def test_client_tracking(self, r, r2): # simple case @@ -613,6 +617,7 @@ def test_client_pause(self, r): r.client_pause(timeout="not an integer") @skip_if_server_version_lt("6.2.0") + @skip_if_redis_enterprise() def test_client_pause_all(self, r, r2): assert r.client_pause(1, all=False) assert r2.set("foo", "bar") @@ -682,6 +687,7 @@ def test_config_set(self, r): assert r.config_get()["timeout"] == "0" @skip_if_server_version_lt("6.0.0") + @skip_if_redis_enterprise() def test_failover(self, r): with pytest.raises(NotImplementedError): r.failover() @@ -721,6 +727,7 @@ def test_lolwut(self, r): @pytest.mark.onlynoncluster @skip_if_server_version_lt("6.2.0") + @skip_if_redis_enterprise() def test_reset(self, r): assert r.reset() == "RESET" @@ -739,6 +746,7 @@ def test_quit(self, r): assert r.quit() @skip_if_server_version_lt("2.8.12") + @skip_if_redis_enterprise() @pytest.mark.onlynoncluster def test_role(self, r): assert r.role()[0] == b"master" @@ -746,6 +754,7 @@ def test_role(self, r): assert isinstance(r.role()[2], list) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_select(self, r): assert r.select(5) assert r.select(2) @@ -1544,6 +1553,7 @@ def test_setrange(self, r): @skip_if_server_version_lt("6.0.0") @skip_if_server_version_gte("7.0.0") + @skip_if_redis_enterprise() def test_stralgo_lcs(self, r): key1 = "{foo}key1" key2 = "{foo}key2" @@ -1577,6 +1587,7 @@ def test_stralgo_lcs(self, r): @skip_if_server_version_lt("6.0.0") @skip_if_server_version_gte("7.0.0") + @skip_if_redis_enterprise() def test_stralgo_negative(self, r): with pytest.raises(exceptions.DataError): r.stralgo("ISSUB", "value1", "value2") @@ -2057,12 +2068,14 @@ def test_sunionstore(self, r): assert r.smembers("c") == {b"1", b"2", b"3"} @skip_if_server_version_lt("1.0.0") + @skip_if_redis_enterprise() def test_debug_segfault(self, r): with pytest.raises(NotImplementedError): r.debug_segfault() @pytest.mark.onlynoncluster @skip_if_server_version_lt("3.2.0") + @skip_if_redis_enterprise() def test_script_debug(self, r): with pytest.raises(NotImplementedError): r.script_debug() @@ -2928,64 +2941,79 @@ def test_sort_issue_924(self, r): r.execute_command("SORT", "issue#924") @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_addslots(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("ADDSLOTS", 1) is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_count_failure_reports(self, mock_cluster_resp_int): assert isinstance( mock_cluster_resp_int.cluster("COUNT-FAILURE-REPORTS", "node"), int ) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_countkeysinslot(self, mock_cluster_resp_int): assert isinstance(mock_cluster_resp_int.cluster("COUNTKEYSINSLOT", 2), int) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_delslots(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("DELSLOTS", 1) is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_failover(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("FAILOVER", 1) is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_forget(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("FORGET", 1) is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_info(self, mock_cluster_resp_info): assert isinstance(mock_cluster_resp_info.cluster("info"), dict) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_keyslot(self, mock_cluster_resp_int): assert isinstance(mock_cluster_resp_int.cluster("keyslot", "asdf"), int) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_meet(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("meet", "ip", "port", 1) is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_nodes(self, mock_cluster_resp_nodes): assert isinstance(mock_cluster_resp_nodes.cluster("nodes"), dict) @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_replicate(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("replicate", "nodeid") is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_reset(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("reset", "hard") is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_saveconfig(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("saveconfig") is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_setslot(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.cluster("setslot", 1, "IMPORTING", "nodeid") is True @pytest.mark.onlynoncluster + @skip_if_redis_enterprise() def test_cluster_slaves(self, mock_cluster_resp_slaves): assert isinstance(mock_cluster_resp_slaves.cluster("slaves", "nodeid"), dict) @@ -3003,6 +3031,7 @@ def test_readonly_invalid_cluster_state(self, r): @pytest.mark.onlynoncluster @skip_if_server_version_lt("3.0.0") + @skip_if_redis_enterprise() def test_readonly(self, mock_cluster_resp_ok): assert mock_cluster_resp_ok.readonly() is True @@ -4341,6 +4370,7 @@ def test_memory_doctor(self, r): r.memory_doctor() @skip_if_server_version_lt("4.0.0") + @skip_if_redis_enterprise() def test_memory_malloc_stats(self, r): if skip_if_redis_enterprise().args[0] is True: with pytest.raises(redis.exceptions.ResponseError): @@ -4350,6 +4380,7 @@ def test_memory_malloc_stats(self, r): assert r.memory_malloc_stats() @skip_if_server_version_lt("4.0.0") + @skip_if_redis_enterprise() def test_memory_stats(self, r): # put a key into the current db to make sure that "db." # has data @@ -4380,6 +4411,7 @@ def test_module_list(self, r): assert isinstance(x, dict) @skip_if_server_version_lt("2.8.13") + @skip_if_redis_enterprise() def test_command_count(self, r): res = r.command_count() assert isinstance(res, int) @@ -4392,6 +4424,7 @@ def test_command_docs(self, r): @pytest.mark.onlynoncluster @skip_if_server_version_lt("2.8.13") + @skip_if_redis_enterprise() def test_command_getkeys(self, r): res = r.command_getkeys("MSET", "a", "b", "c", "d", "e", "f") assert res == ["a", "c", "e"] @@ -4483,6 +4516,7 @@ def test_replicaof(self, r): @pytest.mark.replica @skip_if_server_version_lt("2.8.0") + @skip_if_redis_enterprise() def test_sync(self, r): r2 = redis.Redis(port=6380, decode_responses=False) res = r2.sync() @@ -4490,6 +4524,7 @@ def test_sync(self, r): @pytest.mark.replica @skip_if_server_version_lt("2.8.0") + @skip_if_redis_enterprise() def test_psync(self, r): r2 = redis.Redis(port=6380, decode_responses=False) res = r2.psync(r2.client_id(), 1) diff --git a/tests/test_lock.py b/tests/test_lock.py index 01ecb880b8..0a63f1e06c 100644 --- a/tests/test_lock.py +++ b/tests/test_lock.py @@ -100,7 +100,7 @@ def test_float_timeout(self, r): def test_blocking_timeout(self, r): lock1 = self.get_lock(r, "foo") assert lock1.acquire(blocking=False) - bt = 0.2 + bt = 0.4 sleep = 0.05 lock2 = self.get_lock(r, "foo", sleep=sleep, blocking_timeout=bt) start = time.monotonic() diff --git a/tests/test_scripting.py b/tests/test_scripting.py index 8f6a24cdae..1ccd99a003 100644 --- a/tests/test_scripting.py +++ b/tests/test_scripting.py @@ -3,7 +3,7 @@ import redis from redis import exceptions from redis.commands.core import Script -from tests.conftest import skip_if_server_version_lt +from tests.conftest import skip_if_redis_enterprise, skip_if_server_version_lt multiply_script = """ local value = redis.call('GET', KEYS[1]) @@ -66,6 +66,7 @@ def test_eval_multiply(self, r): assert r.eval(multiply_script, 1, "a", 3) == 6 @skip_if_server_version_lt("7.0.0") + @skip_if_redis_enterprise() @pytest.mark.onlynoncluster def test_eval_ro(self, r): r.set("a", "b") @@ -155,6 +156,7 @@ def test_evalsha(self, r): assert r.evalsha(sha, 1, "a", 3) == 6 @skip_if_server_version_lt("7.0.0") + @skip_if_redis_enterprise() @pytest.mark.onlynoncluster def test_evalsha_ro(self, r): r.set("a", "b") diff --git a/tests/test_search.py b/tests/test_search.py index 7f27fdb6ed..343ac0d540 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -24,7 +24,7 @@ from redis.commands.search.result import Result from redis.commands.search.suggestion import Suggestion -from .conftest import skip_ifmodversion_lt +from .conftest import skip_if_redis_enterprise, skip_ifmodversion_lt WILL_PLAY_TEXT = os.path.abspath( os.path.join(os.path.dirname(__file__), "testdata", "will_play_text.csv.bz2") @@ -389,6 +389,7 @@ def test_example(client): @pytest.mark.redismod +@skip_if_redis_enterprise() def test_auto_complete(client): n = 0 with open(TITLES_CSV) as f: @@ -948,7 +949,8 @@ def test_aggregations_groupby(client): res = client.ft().aggregate(req).rows[0] assert res[1] == "redis" - assert res[3] == "7" # (10+3+8)/3 + index = res.index("__generated_aliasavgrandom_num") + assert res[index + 1] == "7" # (10+3+8)/3 req = aggregations.AggregateRequest("redis").group_by( "@parent", @@ -1158,6 +1160,7 @@ def test_index_definition(client): @pytest.mark.redismod @pytest.mark.onlynoncluster +@skip_if_redis_enterprise() def testExpire(client): client.ft().create_index((TextField("txt", sortable=True),), temporary=4) ttl = client.execute_command("ft.debug", "TTL", "idx") @@ -1478,6 +1481,7 @@ def test_json_with_jsonpath(client): @pytest.mark.redismod @pytest.mark.onlynoncluster +@skip_if_redis_enterprise() def test_profile(client): client.ft().create_index((TextField("t"),)) client.ft().client.hset("1", "t", "hello") @@ -1529,6 +1533,7 @@ def test_profile_limited(client): @pytest.mark.redismod +@skip_ifmodversion_lt("2.4.3", "search") def test_vector_field(modclient): modclient.flushdb() modclient.ft().create_index( @@ -1551,6 +1556,7 @@ def test_vector_field(modclient): @pytest.mark.redismod +@skip_ifmodversion_lt("2.4.3", "search") def test_vector_field_error(modclient): modclient.flushdb() @@ -1564,6 +1570,7 @@ def test_vector_field_error(modclient): @pytest.mark.redismod +@skip_ifmodversion_lt("2.4.3", "search") def test_text_params(modclient): modclient.flushdb() modclient.ft().create_index((TextField("name"),)) @@ -1581,6 +1588,7 @@ def test_text_params(modclient): @pytest.mark.redismod +@skip_ifmodversion_lt("2.4.3", "search") def test_numeric_params(modclient): modclient.flushdb() modclient.ft().create_index((NumericField("numval"),)) @@ -1599,6 +1607,7 @@ def test_numeric_params(modclient): @pytest.mark.redismod +@skip_ifmodversion_lt("2.4.3", "search") def test_geo_params(modclient): modclient.flushdb() @@ -1617,6 +1626,7 @@ def test_geo_params(modclient): @pytest.mark.redismod +@skip_if_redis_enterprise() def test_search_commands_in_pipeline(client): p = client.ft().pipeline() p.create_index((TextField("txt"),)) diff --git a/tox.ini b/tox.ini index 1a3450bdaa..9ea8706f32 100644 --- a/tox.ini +++ b/tox.ini @@ -8,6 +8,7 @@ markers = ssl: marker for only the ssl tests replica: replica tests experimental: run only experimental tests + asyncio: marker for async tests [tox] minversion = 3.2.0