Skip to content

Commit 78cb40d

Browse files
committed
fix unit tests
1 parent c557656 commit 78cb40d

File tree

1 file changed

+56
-38
lines changed

1 file changed

+56
-38
lines changed

tests/ut/backends/test_valkey.py

Lines changed: 56 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from unittest.mock import ANY, AsyncMock, create_autospec, patch
1+
from unittest.mock import ANY, AsyncMock, patch
22

33
import pytest
44

5-
from glide import Transaction, Script
5+
from glide import ConditionalChange, ExpirySet, ExpiryType, Transaction, Script
66
from glide.exceptions import RequestError
77

88
from aiocache.backends.valkey import ValkeyBackend, ValkeyCache
@@ -30,20 +30,12 @@ def valkey(valkey_client):
3030
):
3131
setattr(m, method, AsyncMock(return_value=None, spec_set=()))
3232
m.mget = AsyncMock(return_value=[None], spec_set=())
33-
m.set = AsyncMock(return_value=True, spec_set=())
33+
m.set = AsyncMock(return_value="OK", spec_set=())
3434

3535
yield valkey
3636

3737

3838
class TestValkeyBackend:
39-
# async def test_valkey_backend_requires_client_decode_responses(self, valkey_client):
40-
# with pytest.raises(ValueError) as ve:
41-
# ValkeyBackend(client=valkey_client)
42-
#
43-
# assert str(ve.value) == (
44-
# "valkey client must be constructed with decode_responses set to False"
45-
# )
46-
4739
async def test_get(self, valkey):
4840
valkey.client.get.return_value = b"value"
4941
assert await valkey._get(Keys.KEY) == "value"
@@ -62,54 +54,68 @@ async def test_set(self, valkey):
6254
valkey.client.set.assert_called_once
6355

6456
async def test_set_cas_token(self, mocker, valkey):
65-
mocker.spy(valkey, "_cas")
66-
await valkey._set(Keys.KEY, "value", _cas_token="old_value", _conn=valkey.client)
57+
mocker.patch.object(valkey, "_cas")
58+
await valkey._set(
59+
Keys.KEY, "value", _cas_token="old_value", _conn=valkey.client
60+
)
6761
valkey._cas.assert_called_with(
6862
Keys.KEY, "value", "old_value", ttl=None, _conn=valkey.client
6963
)
7064

7165
async def test_cas(self, mocker, valkey):
72-
mocker.spy(valkey, "_script")
66+
mocker.spy(valkey, "_get")
67+
mocker.spy(valkey, "_cas")
7368
await valkey._cas(Keys.KEY, "value", "old_value", ttl=10, _conn=valkey.client)
74-
valkey._script.assert_called_with(
75-
valkey.CAS_SCRIPT,
76-
*[[Keys.KEY], "value", "old_value", "EX", "10"],
77-
)
69+
valkey._get.assert_called_with(Keys.KEY)
70+
assert valkey._cas.spy_return == 0
7871

7972
async def test_cas_float_ttl(self, mocker, valkey):
80-
mocker.spy(valkey, "_script")
73+
spy = mocker.spy(valkey, "_get")
8174
await valkey._cas(Keys.KEY, "value", "old_value", ttl=0.1, _conn=valkey.client)
82-
valkey._script.assert_called_with(
83-
valkey.CAS_SCRIPT,
84-
*[[Keys.KEY], "value", "old_value", "PX", "100"],
85-
)
75+
spy.assert_called_with(Keys.KEY)
76+
mocker.stop(spy)
77+
mock = mocker.patch.object(valkey, "_get", return_value="old_value")
78+
await valkey._cas(Keys.KEY, "value", "old_value", ttl=0.1, _conn=valkey.client)
79+
mock.assert_called_once()
80+
valkey.client.set.assert_called_with(Keys.KEY, "value", expiry=0.1)
8681

8782
async def test_multi_get(self, valkey):
8883
await valkey._multi_get([Keys.KEY, Keys.KEY_1])
89-
valkey.client.mget.assert_called_with(Keys.KEY, Keys.KEY_1)
84+
valkey.client.mget.assert_called_with([Keys.KEY, Keys.KEY_1])
9085

9186
async def test_multi_set(self, valkey):
9287
await valkey._multi_set([(Keys.KEY, "value"), (Keys.KEY_1, "random")])
9388
valkey.client.mset.assert_called_with({Keys.KEY: "value", Keys.KEY_1: "random"})
9489

9590
async def test_multi_set_with_ttl(self, valkey, mocker):
96-
spy_mset = mocker.spy(Transaction, "mset")
97-
spy_expire = mocker.spy(Transaction, "expire")
91+
mock_mset = mocker.patch.object(Transaction, "mset")
92+
mock_expire = mocker.patch.object(Transaction, "expire")
9893
await valkey._multi_set([(Keys.KEY, "value"), (Keys.KEY_1, "random")], ttl=1)
9994

10095
valkey.client.exec.assert_called()
10196

102-
assert spy_mset.call_count == 1
103-
assert spy_expire.call_count == 2
104-
spy_expire.assert_any_call(valkey.client.exec.call_args.args[0], Keys.KEY, 1)
105-
spy_expire.assert_any_call(valkey.client.exec.call_args.args[0], Keys.KEY_1, 1)
97+
assert mock_mset.call_count == 1
98+
assert mock_expire.call_count == 2
99+
mock_expire.assert_any_call(Keys.KEY, 1)
100+
mock_expire.assert_any_call(Keys.KEY_1, 1)
106101

107102
async def test_add(self, valkey):
108103
await valkey._add(Keys.KEY, "value")
109-
valkey.client.set.assert_called_with(Keys.KEY, "value", nx=True, ex=None)
104+
valkey.client.set.assert_called_with(
105+
Keys.KEY, "value", conditional_set=ConditionalChange.ONLY_IF_DOES_NOT_EXIST
106+
)
110107

111108
await valkey._add(Keys.KEY, "value", 1)
112-
valkey.client.set.assert_called_with(Keys.KEY, "value", nx=True, ex=1)
109+
# TODO: change this to `assert_called_with` once ExpirySet support `__eq__`
110+
assert valkey.client.set.call_args.args[0] == Keys.KEY
111+
assert (
112+
valkey.client.set.call_args.kwargs["conditional_set"]
113+
== ConditionalChange.ONLY_IF_DOES_NOT_EXIST
114+
)
115+
assert (
116+
valkey.client.set.call_args.kwargs["expiry"].get_cmd_args()
117+
== ExpirySet(ExpiryType.SEC, 1).get_cmd_args()
118+
)
113119

114120
async def test_add_existing(self, valkey):
115121
valkey.client.set.return_value = False
@@ -118,7 +124,15 @@ async def test_add_existing(self, valkey):
118124

119125
async def test_add_float_ttl(self, valkey):
120126
await valkey._add(Keys.KEY, "value", 0.1)
121-
valkey.client.set.assert_called_with(Keys.KEY, "value", nx=True, px=100)
127+
assert valkey.client.set.call_args.args[0] == Keys.KEY
128+
assert (
129+
valkey.client.set.call_args.kwargs["conditional_set"]
130+
== ConditionalChange.ONLY_IF_DOES_NOT_EXIST
131+
)
132+
assert (
133+
valkey.client.set.call_args.kwargs["expiry"].get_cmd_args()
134+
== ExpirySet(ExpiryType.MILLSEC, 100).get_cmd_args()
135+
)
122136

123137
async def test_exists(self, valkey):
124138
valkey.client.exists.return_value = 1
@@ -151,7 +165,7 @@ async def test_delete(self, valkey):
151165
async def test_clear(self, valkey):
152166
valkey.client.scan.return_value = [b"0", ["nm:a", "nm:b"]]
153167
await valkey._clear("nm")
154-
valkey.client.delete.assert_called_with("nm:a", "nm:b")
168+
valkey.client.delete.assert_called_with(["nm:a", "nm:b"])
155169

156170
async def test_clear_no_keys(self, valkey):
157171
valkey.client.scan.return_value = [b"0", []]
@@ -168,9 +182,10 @@ async def test_script(self, valkey):
168182
valkey.client.invoke_script.assert_called_with(script, Keys.KEY, ())
169183

170184
async def test_redlock_release(self, mocker, valkey):
171-
mocker.spy(valkey, "_script")
185+
mocker.patch.object(valkey, "_get", return_value="random")
172186
await valkey._redlock_release(Keys.KEY, "random")
173-
valkey._script.assert_called_with(valkey.RELEASE_SCRIPT, Keys.KEY, "random")
187+
valkey._get.assert_called_once_with(Keys.KEY)
188+
valkey.client.delete.assert_called_once_with([Keys.KEY])
174189

175190

176191
class TestValkeyCache:
@@ -190,7 +205,8 @@ def test_default_serializer(self, valkey_client):
190205
assert isinstance(ValkeyCache(client=valkey_client).serializer, JsonSerializer)
191206

192207
@pytest.mark.parametrize(
193-
"path,expected", [("", {}), ("/", {}), ("/1", {"db": "1"}), ("/1/2/3", {"db": "1"})]
208+
"path,expected",
209+
[("", {}), ("/", {}), ("/1", {"db": "1"}), ("/1/2/3", {"db": "1"})],
194210
)
195211
def test_parse_uri_path(self, path, expected, valkey_client):
196212
assert ValkeyCache(client=valkey_client).parse_uri_path(path) == expected
@@ -203,7 +219,9 @@ def test_parse_uri_path(self, path, expected, valkey_client):
203219
["my_ns", "my_ns:" + ensure_key(Keys.KEY)],
204220
), # noqa: B950
205221
)
206-
def test_build_key_double_dot(self, set_test_namespace, valkey_cache, namespace, expected):
222+
def test_build_key_double_dot(
223+
self, set_test_namespace, valkey_cache, namespace, expected
224+
):
207225
assert valkey_cache.build_key(Keys.KEY, namespace) == expected
208226

209227
def test_build_key_no_namespace(self, valkey_cache):

0 commit comments

Comments
 (0)