From 4e71ddbdb022438ed9c5d7b54c0ffa93056c6d89 Mon Sep 17 00:00:00 2001
From: Eva Bardou <bardou@teklia.com>
Date: Thu, 25 Jan 2024 16:34:14 +0000
Subject: [PATCH] Allow to set `load_parents` parameter while using
 `list_element_metadata` helper

---
 arkindex_worker/worker/metadata.py          | 12 +++++--
 tests/test_elements_worker/test_metadata.py | 38 +++++++++++++++++----
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/arkindex_worker/worker/metadata.py b/arkindex_worker/worker/metadata.py
index 136da154..75e4d6b7 100644
--- a/arkindex_worker/worker/metadata.py
+++ b/arkindex_worker/worker/metadata.py
@@ -178,16 +178,24 @@ class MetaDataMixin:
         return created_metadata_list
 
     def list_element_metadata(
-        self, element: Element | CachedElement
+        self, element: Element | CachedElement, load_parents: bool | None = None
     ) -> list[dict[str, str]]:
         """
         List all metadata linked to an element.
         This method does not support cache.
 
         :param element: The element to list metadata on.
+        :param load_parents: Also include all metadata from the element's parents in the response.
         """
         assert element and isinstance(
             element, Element | CachedElement
         ), "element shouldn't be null and should be of type Element or CachedElement"
 
-        return self.api_client.paginate("ListElementMetaData", id=element.id)
+        query_params = {}
+        if load_parents is not None:
+            assert isinstance(load_parents, bool), "load_parents should be of type bool"
+            query_params["load_parents"] = load_parents
+
+        return self.api_client.paginate(
+            "ListElementMetaData", id=element.id, **query_params
+        )
diff --git a/tests/test_elements_worker/test_metadata.py b/tests/test_elements_worker/test_metadata.py
index 3cce81f4..b40f9bf0 100644
--- a/tests/test_elements_worker/test_metadata.py
+++ b/tests/test_elements_worker/test_metadata.py
@@ -508,14 +508,23 @@ def test_create_metadatas_api_error(responses, mock_elements_worker):
     ]
 
 
+def test_list_element_metadata_wrong_load_parents(fake_dummy_worker):
+    element = Element({"id": "element_id"})
+    with pytest.raises(AssertionError, match="load_parents should be of type bool"):
+        fake_dummy_worker.list_element_metadata(
+            element=element,
+            load_parents="not bool",
+        )
+
+
 def test_list_element_metadata(fake_dummy_worker):
     element = Element({"id": "element_id"})
     fake_dummy_worker.api_client.add_response(
         "ListElementMetaData",
         id=element.id,
-        response={"id": "metadata_id"},
+        response=[{"id": "metadata_id"}],
     )
-    assert fake_dummy_worker.list_element_metadata(element) == {"id": "metadata_id"}
+    assert fake_dummy_worker.list_element_metadata(element) == [{"id": "metadata_id"}]
 
     assert len(fake_dummy_worker.api_client.history) == 1
     assert len(fake_dummy_worker.api_client.responses) == 0
@@ -527,11 +536,28 @@ def test_list_element_metadata_cached_element(mock_elements_worker_with_cache):
     mock_elements_worker_with_cache.api_client.add_response(
         "ListElementMetaData",
         id="element_id",
-        response={"id": "metadata_id"},
+        response=[{"id": "metadata_id"}],
     )
-    assert mock_elements_worker_with_cache.list_element_metadata(element) == {
-        "id": "metadata_id"
-    }
+    assert mock_elements_worker_with_cache.list_element_metadata(element) == [
+        {"id": "metadata_id"}
+    ]
 
     assert len(mock_elements_worker_with_cache.api_client.history) == 1
     assert len(mock_elements_worker_with_cache.api_client.responses) == 0
+
+
+def test_list_element_metadata_with_load_parents(fake_dummy_worker):
+    element = Element({"id": "element_id"})
+    fake_dummy_worker.api_client.add_response(
+        "ListElementMetaData",
+        id=element.id,
+        load_parents=True,
+        response=[{"id": "metadata_id"}, {"id": "parent_metadata_id"}],
+    )
+    assert fake_dummy_worker.list_element_metadata(element, load_parents=True) == [
+        {"id": "metadata_id"},
+        {"id": "parent_metadata_id"},
+    ]
+
+    assert len(fake_dummy_worker.api_client.history) == 1
+    assert len(fake_dummy_worker.api_client.responses) == 0
-- 
GitLab