1111if TYPE_CHECKING :
1212 from typing import Any
1313
14- from zarr .abc .store import ByteRequest
1514 from zarr .core .buffer .core import BufferPrototype
1615
1716import pytest
2221 RangeByteRequest ,
2322 Store ,
2423 SuffixByteRequest ,
24+ SupportsDeleteSync ,
25+ SupportsGetSync ,
26+ SupportsSetSync ,
2527)
2628from zarr .core .buffer import Buffer , default_buffer_prototype
2729from zarr .core .sync import _collect_aiterator , sync
@@ -39,6 +41,27 @@ class StoreTests(Generic[S, B]):
3941 store_cls : type [S ]
4042 buffer_cls : type [B ]
4143
44+ @staticmethod
45+ def _require_get_sync (store : S ) -> SupportsGetSync :
46+ """Skip unless *store* implements :class:`SupportsGetSync`."""
47+ if not isinstance (store , SupportsGetSync ):
48+ pytest .skip ("store does not implement SupportsGetSync" )
49+ return store # type: ignore[unreachable]
50+
51+ @staticmethod
52+ def _require_set_sync (store : S ) -> SupportsSetSync :
53+ """Skip unless *store* implements :class:`SupportsSetSync`."""
54+ if not isinstance (store , SupportsSetSync ):
55+ pytest .skip ("store does not implement SupportsSetSync" )
56+ return store # type: ignore[unreachable]
57+
58+ @staticmethod
59+ def _require_delete_sync (store : S ) -> SupportsDeleteSync :
60+ """Skip unless *store* implements :class:`SupportsDeleteSync`."""
61+ if not isinstance (store , SupportsDeleteSync ):
62+ pytest .skip ("store does not implement SupportsDeleteSync" )
63+ return store # type: ignore[unreachable]
64+
4265 @abstractmethod
4366 async def set (self , store : S , key : str , value : Buffer ) -> None :
4467 """
@@ -579,6 +602,52 @@ def test_get_json_sync(self, store: S) -> None:
579602 sync (self .set (store , key , self .buffer_cls .from_bytes (data_bytes )))
580603 assert store ._get_json_sync (key , prototype = default_buffer_prototype ()) == data
581604
605+ # -------------------------------------------------------------------
606+ # Synchronous store methods (SupportsSyncStore protocol)
607+ # -------------------------------------------------------------------
608+
609+ def test_get_sync (self , store : S ) -> None :
610+ getter = self ._require_get_sync (store )
611+ data_buf = self .buffer_cls .from_bytes (b"\x01 \x02 \x03 \x04 " )
612+ key = "sync_get"
613+ sync (self .set (store , key , data_buf ))
614+ result = getter .get_sync (key )
615+ assert result is not None
616+ assert_bytes_equal (result , data_buf )
617+
618+ def test_get_sync_missing (self , store : S ) -> None :
619+ getter = self ._require_get_sync (store )
620+ result = getter .get_sync ("nonexistent" )
621+ assert result is None
622+
623+ def test_set_sync (self , store : S ) -> None :
624+ setter = self ._require_set_sync (store )
625+ data_buf = self .buffer_cls .from_bytes (b"\x01 \x02 \x03 \x04 " )
626+ key = "sync_set"
627+ setter .set_sync (key , data_buf )
628+ result = sync (self .get (store , key ))
629+ assert_bytes_equal (result , data_buf )
630+
631+ def test_delete_sync (self , store : S ) -> None :
632+ setter = self ._require_set_sync (store )
633+ deleter = self ._require_delete_sync (store )
634+ getter = self ._require_get_sync (store )
635+ if not store .supports_deletes :
636+ pytest .skip ("store does not support deletes" )
637+ data_buf = self .buffer_cls .from_bytes (b"\x01 \x02 \x03 \x04 " )
638+ key = "sync_delete"
639+ setter .set_sync (key , data_buf )
640+ deleter .delete_sync (key )
641+ result = getter .get_sync (key )
642+ assert result is None
643+
644+ def test_delete_sync_missing (self , store : S ) -> None :
645+ deleter = self ._require_delete_sync (store )
646+ if not store .supports_deletes :
647+ pytest .skip ("store does not support deletes" )
648+ # should not raise
649+ deleter .delete_sync ("nonexistent_sync" )
650+
582651
583652class LatencyStore (WrapperStore [Store ]):
584653 """
0 commit comments