Abyss-lord commented on code in PR #10554:
URL: https://github.com/apache/gravitino/pull/10554#discussion_r3013979832
##########
clients/client-python/tests/unittests/mock_base.py:
##########
@@ -154,3 +191,113 @@ class Wrapper(cls):
def mock_name_identifier_json(name, namespace):
return json.dumps({"name": name, "namespace": namespace}).encode("utf-8")
+
+
+class MockTagRepo:
+ def __init__(self) -> None:
+ self.tag_store = {
+ "tagA": build_tag_dto("tagA", "mock tag A"),
+ "tagB": build_tag_dto("tagB", "mock tag B"),
+ }
+
+ def mock_list_tags(self) -> list[str]:
+ return list(self.tag_store.keys())
+
+ def mock_list_tags_info(self) -> list[TagDTO]:
+ return list(self.tag_store.values())
+
+ def mock_get_tag(self, tag_name: str) -> TagDTO:
+ if tag_name not in self.tag_store:
+ raise ValueError(f"Tag {tag_name} does not exist")
+ return self.tag_store[tag_name]
+
+ def mock_create_tag(
+ self,
+ tag_name: str,
+ comment: str = "",
+ properties=None,
+ ) -> TagDTO:
+ if tag_name in self.tag_store:
+ raise ValueError(f"Tag {tag_name} already exists")
+ self.tag_store[tag_name] = build_tag_dto(tag_name, comment, properties)
+ return self.tag_store[tag_name]
+
+ def mock_alter_tag(self, tag_name: str, *changes) -> TagDTO:
+ if tag_name not in self.tag_store:
+ raise ValueError(f"Tag {tag_name} does not exist")
+
+ for change in changes:
+ current_tag_obj = self.tag_store[tag_name]
+
+ if isinstance(change, TagChange.RenameTag):
+ self.tag_store[change.new_name] = build_tag_dto(
+ change.new_name,
+ current_tag_obj.comment(),
+ dict(current_tag_obj.properties()),
+ )
+ del self.tag_store[tag_name]
+ tag_name = change.new_name
+
+ elif isinstance(change, TagChange.UpdateTagComment):
+ self.tag_store[tag_name] = build_tag_dto(
+ current_tag_obj.name(),
+ change.new_comment,
+ dict(current_tag_obj.properties()),
+ )
+
+ elif isinstance(change, TagChange.RemoveProperty):
+ new_properties = dict(current_tag_obj.properties())
+ new_properties.pop(change.removed_property, None)
+
+ self.tag_store[tag_name] = build_tag_dto(
+ current_tag_obj.name(),
+ current_tag_obj.comment(),
+ new_properties,
+ )
+
+ elif isinstance(change, TagChange.SetProperty):
+ new_properties = dict(current_tag_obj.properties())
+ new_properties[change.name] = change.value
+
+ self.tag_store[tag_name] = build_tag_dto(
+ current_tag_obj.name(),
+ current_tag_obj.comment(),
+ new_properties,
+ )
+
+ else:
+ raise ValueError(f"Unknown tag change type: {change}")
+
+ return self.tag_store[tag_name]
+
+ def mock_delete_tag(self, tag_name: str) -> bool:
+ if tag_name not in self.tag_store:
+ return False
+ del self.tag_store[tag_name]
+ return True
+
+
+@contextmanager
+def mock_tag_methods():
+ repo = MockTagRepo()
+
+ with patch.multiple(
+ GravitinoMetalake,
+ list_tags=MagicMock(side_effect=repo.mock_list_tags),
+ list_tags_info=MagicMock(side_effect=repo.mock_list_tags_info),
+ get_tag=MagicMock(side_effect=repo.mock_get_tag),
+ create_tag=MagicMock(side_effect=repo.mock_create_tag),
+ alter_tag=MagicMock(side_effect=repo.mock_alter_tag),
+ delete_tag=MagicMock(side_effect=repo.mock_delete_tag),
+ ) as mocks:
+ yield mocks, repo
+
+
+def mock_http_response(json_str: str) -> Response:
+ mock_http_resp = Mock(HTTPResponse)
+ mock_http_resp.getcode.return_value = 200
+ mock_http_resp.read.return_value = json_str
+ mock_http_resp.info.return_value = None
+ mock_http_resp.url = None
+ mock_resp = Response(mock_http_resp)
+ return mock_resp
Review Comment:
fix
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]