diff --git a/pyiceberg/catalog/rest/__init__.py b/pyiceberg/catalog/rest/__init__.py index b617cfa7da..d06fd3885b 100644 --- a/pyiceberg/catalog/rest/__init__.py +++ b/pyiceberg/catalog/rest/__init__.py @@ -337,7 +337,14 @@ class ListNamespaceResponse(IcebergBaseModel): class NamespaceResponse(IcebergBaseModel): namespace: Identifier = Field() - properties: Properties = Field() + properties: Properties = Field(default_factory=dict) + + @field_validator("properties", mode="before") + @classmethod + def replace_none_with_dict(cls, v: Any) -> Properties: + if v is None: + return {} + return v class UpdateNamespacePropertiesResponse(IcebergBaseModel): diff --git a/tests/catalog/test_rest.py b/tests/catalog/test_rest.py index 99d1ef947b..aa9a467381 100644 --- a/tests/catalog/test_rest.py +++ b/tests/catalog/test_rest.py @@ -922,6 +922,39 @@ def test_load_namespace_properties_200(rest_mock: Mocker) -> None: assert RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN).load_namespace_properties(namespace) == {"prop": "yes"} +def test_load_namespace_properties_200_without_properties(rest_mock: Mocker) -> None: + namespace = "leden" + rest_mock.get( + f"{TEST_URI}v1/namespaces/{namespace}", + json={"namespace": ["leden"]}, + status_code=200, + request_headers=TEST_HEADERS, + ) + assert RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN).load_namespace_properties(namespace) == {} + + +def test_load_namespace_properties_200_with_null_properties(rest_mock: Mocker) -> None: + namespace = "leden" + rest_mock.get( + f"{TEST_URI}v1/namespaces/{namespace}", + json={"namespace": ["leden"], "properties": None}, + status_code=200, + request_headers=TEST_HEADERS, + ) + assert RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN).load_namespace_properties(namespace) == {} + + +def test_load_namespace_properties_200_with_empty_properties(rest_mock: Mocker) -> None: + namespace = "leden" + rest_mock.get( + f"{TEST_URI}v1/namespaces/{namespace}", + json={"namespace": ["leden"], "properties": {}}, + status_code=200, + request_headers=TEST_HEADERS, + ) + assert RestCatalog("rest", uri=TEST_URI, token=TEST_TOKEN).load_namespace_properties(namespace) == {} + + def test_load_namespace_properties_404(rest_mock: Mocker) -> None: namespace = "leden" rest_mock.get(