diff --git a/src/key_value/aio/_utils/serialization.py b/src/key_value/aio/_utils/serialization.py index 91f6e392..40d46c50 100644 --- a/src/key_value/aio/_utils/serialization.py +++ b/src/key_value/aio/_utils/serialization.py @@ -76,9 +76,9 @@ def load_dict(self, data: dict[str, Any]) -> ManagedEntry: if self._date_format in ("isoformat", "datetime"): expected_type = str if self._date_format == "isoformat" else datetime parser = parse_datetime_str if self._date_format == "isoformat" else (lambda value: value) - if created_at := key_must_be(data, key="created_at", expected_type=expected_type): + if (created_at := key_must_be(data, key="created_at", expected_type=expected_type)) is not None: managed_entry_proto["created_at"] = parser(created_at) - if expires_at := key_must_be(data, key="expires_at", expected_type=expected_type): + if (expires_at := key_must_be(data, key="expires_at", expected_type=expected_type)) is not None: managed_entry_proto["expires_at"] = parser(expires_at) if "value" not in data: diff --git a/tests/utils/test_serialization.py b/tests/utils/test_serialization.py index 2001e849..c789a160 100644 --- a/tests/utils/test_serialization.py +++ b/tests/utils/test_serialization.py @@ -3,6 +3,7 @@ import pytest from inline_snapshot import snapshot +from key_value.aio.errors import DeserializationError from key_value.aio._utils.managed_entry import ManagedEntry from key_value.aio._utils.serialization import BasicSerializationAdapter @@ -80,3 +81,9 @@ def test_entry_two(self, adapter: BasicSerializationAdapter): assert adapter.load_dict(data=adapter.dump_dict(entry=TEST_ENTRY_TWO)) == snapshot(TEST_ENTRY_TWO) assert adapter.load_json(json_str=adapter.dump_json(entry=TEST_ENTRY_TWO)) == snapshot(TEST_ENTRY_TWO) + + @pytest.mark.parametrize("field", ["created_at", "expires_at"]) + def test_rejects_empty_isoformat_datetime(self, adapter: BasicSerializationAdapter, field: str) -> None: + payload = {"value": {"x": 1}, field: ""} + with pytest.raises(DeserializationError): + adapter.load_dict(data=payload)