Skip to content

Commit 0d790a6

Browse files
Add comprehensive test cases for store tests (#101)
Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: William Easton <strawgate@users.noreply.github.com>
1 parent e689f79 commit 0d790a6

File tree

13 files changed

+381
-192
lines changed

13 files changed

+381
-192
lines changed

key-value/key-value-aio/src/key_value/aio/stores/memory/store.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def _memory_cache_ttu(_key: Any, value: MemoryCacheEntry, now: float) -> float:
5555
return float(expiration_epoch)
5656

5757

58-
def _memory_cache_getsizeof(value: MemoryCacheEntry) -> int: # pyright: ignore[reportUnusedParameter] # noqa: ARG001
58+
def _memory_cache_getsizeof(value: MemoryCacheEntry) -> int: # pyright: ignore[reportUnusedParameter]
5959
"""Return size of cache entry (always 1 for entry counting)."""
6060
return 1
6161

key-value/key-value-aio/tests/stores/base.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99
from key_value.shared.code_gen.sleep import asleep
1010
from key_value.shared.errors import InvalidTTLError, SerializationError
1111
from key_value.shared_test.cases import (
12-
LARGE_TEST_DATA_ARGNAMES,
13-
LARGE_TEST_DATA_ARGVALUES,
14-
LARGE_TEST_DATA_IDS,
15-
SIMPLE_TEST_DATA_ARGNAMES,
16-
SIMPLE_TEST_DATA_ARGVALUES,
17-
SIMPLE_TEST_DATA_IDS,
12+
LARGE_DATA_CASES,
13+
NEGATIVE_SIMPLE_CASES,
14+
SIMPLE_CASES,
15+
NegativeCases,
16+
PositiveCases,
1817
)
1918
from pydantic import AnyHttpUrl
2019

@@ -46,7 +45,7 @@ async def test_empty_ttl(self, store: BaseStore):
4645
assert ttl == (None, None)
4746

4847
async def test_put_serialization_errors(self, store: BaseStore):
49-
"""Tests that the put method does not raise an exception when called on a new store."""
48+
"""Tests that the put method raises SerializationError for non-JSON-serializable Pydantic types."""
5049
with pytest.raises(SerializationError):
5150
await store.put(collection="test", key="test", value={"test": AnyHttpUrl("https://test.com")})
5251

@@ -55,15 +54,22 @@ async def test_get_put_get(self, store: BaseStore):
5554
await store.put(collection="test", key="test", value={"test": "test"})
5655
assert await store.get(collection="test", key="test") == {"test": "test"}
5756

58-
@pytest.mark.parametrize(argnames=SIMPLE_TEST_DATA_ARGNAMES, argvalues=SIMPLE_TEST_DATA_ARGVALUES, ids=SIMPLE_TEST_DATA_IDS)
59-
async def test_get_complex_put_get(self, store: BaseStore, data: dict[str, Any], json: str): # pyright: ignore[reportUnusedParameter, reportUnusedParameter] # noqa: ARG002
57+
@PositiveCases.parametrize(cases=SIMPLE_CASES)
58+
async def test_models_put_get(self, store: BaseStore, data: dict[str, Any], json: str, round_trip: dict[str, Any]): # pyright: ignore[reportUnusedParameter, reportUnusedParameter] # noqa: ARG002
6059
await store.put(collection="test", key="test", value=data)
61-
assert await store.get(collection="test", key="test") == data
60+
retrieved_data = await store.get(collection="test", key="test")
61+
assert retrieved_data is not None
62+
assert retrieved_data == round_trip
63+
64+
@NegativeCases.parametrize(cases=NEGATIVE_SIMPLE_CASES)
65+
async def test_negative_models_put_get(self, store: BaseStore, data: dict[str, Any], error: type[Exception]): # pyright: ignore[reportUnusedParameter, reportUnusedParameter]
66+
with pytest.raises(error):
67+
await store.put(collection="test", key="test", value=data)
6268

63-
@pytest.mark.parametrize(argnames=LARGE_TEST_DATA_ARGNAMES, argvalues=LARGE_TEST_DATA_ARGVALUES, ids=LARGE_TEST_DATA_IDS)
64-
async def test_get_large_put_get(self, store: BaseStore, data: dict[str, Any], json: str): # pyright: ignore[reportUnusedParameter, reportUnusedParameter] # noqa: ARG002
69+
@PositiveCases.parametrize(cases=[LARGE_DATA_CASES])
70+
async def test_get_large_put_get(self, store: BaseStore, data: dict[str, Any], json: str, round_trip: dict[str, Any]): # pyright: ignore[reportUnusedParameter, reportUnusedParameter] # noqa: ARG002
6571
await store.put(collection="test", key="test", value=data)
66-
assert await store.get(collection="test", key="test") == data
72+
assert await store.get(collection="test", key="test") == round_trip
6773

6874
async def test_put_many_get(self, store: BaseStore):
6975
await store.put_many(collection="test", keys=["test", "test_2"], values=[{"test": "test"}, {"test": "test_2"}])

key-value/key-value-aio/tests/stores/keyring/test_keyring.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Any
22

33
import pytest
4-
from key_value.shared_test.cases import LARGE_TEST_DATA_ARGNAMES, LARGE_TEST_DATA_ARGVALUES, LARGE_TEST_DATA_IDS
4+
from key_value.shared_test.cases import LARGE_DATA_CASES, PositiveCases
55
from typing_extensions import override
66

77
from key_value.aio.stores.base import BaseStore
@@ -28,7 +28,6 @@ async def test_not_unbounded(self, store: BaseStore): ...
2828

2929
@override
3030
@pytest.mark.skipif(condition=detect_on_windows(), reason="Keyrings do not support large values on Windows")
31-
@pytest.mark.parametrize(argnames=LARGE_TEST_DATA_ARGNAMES, argvalues=LARGE_TEST_DATA_ARGVALUES, ids=LARGE_TEST_DATA_IDS)
32-
async def test_get_large_put_get(self, store: BaseStore, data: dict[str, Any], json: str):
33-
await store.put(collection="test", key="test", value=data)
34-
assert await store.get(collection="test", key="test") == data
31+
@PositiveCases.parametrize(cases=[LARGE_DATA_CASES])
32+
async def test_get_large_put_get(self, store: BaseStore, data: dict[str, Any], json: str, round_trip: dict[str, Any]): # pyright: ignore[reportUnusedParameter]
33+
await super().test_get_large_put_get(store, data, json, round_trip=round_trip)

key-value/key-value-aio/tests/stores/windows_registry/test_windows_registry.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
from typing import TYPE_CHECKING, Any
1+
from typing import TYPE_CHECKING
22

33
import pytest
4-
from key_value.shared_test.cases import LARGE_TEST_DATA_ARGNAMES, LARGE_TEST_DATA_ARGVALUES, LARGE_TEST_DATA_IDS
54
from typing_extensions import override
65

76
from key_value.aio.stores.base import BaseStore
@@ -29,9 +28,3 @@ async def store(self) -> "WindowsRegistryStore":
2928
@override
3029
@pytest.mark.skip(reason="We do not test boundedness of registry stores")
3130
async def test_not_unbounded(self, store: BaseStore): ...
32-
33-
@override
34-
@pytest.mark.parametrize(argnames=LARGE_TEST_DATA_ARGNAMES, argvalues=LARGE_TEST_DATA_ARGVALUES, ids=LARGE_TEST_DATA_IDS)
35-
async def test_get_large_put_get(self, store: BaseStore, data: dict[str, Any], json: str):
36-
await store.put(collection="test", key="test", value=data)
37-
assert await store.get(collection="test", key="test") == data

0 commit comments

Comments
 (0)