Skip to content
Snippets Groups Projects
Commit 39694d1e authored by Chaza Abdelwahab's avatar Chaza Abdelwahab Committed by Yoann Schneider
Browse files

Support CachedElements on metadata endpoints

parent 97707d7e
No related branches found
No related tags found
1 merge request!230Support CachedElements on metadata endpoints
Pipeline #79686 passed
......@@ -7,6 +7,7 @@ from enum import Enum
from typing import Dict, List, Optional, Union
from arkindex_worker import logger
from arkindex_worker.cache import CachedElement
from arkindex_worker.models import Element
......@@ -59,7 +60,7 @@ class MetaType(Enum):
class MetaDataMixin(object):
def create_metadata(
self,
element: Element,
element: Union[Element, CachedElement],
type: MetaType,
name: str,
value: str,
......@@ -76,8 +77,8 @@ class MetaDataMixin(object):
:returns: UUID of the created metadata.
"""
assert element and isinstance(
element, Element
), "element shouldn't be null and should be of type Element"
element, (Element, CachedElement)
), "element shouldn't be null and should be of type Element or CachedElement"
assert type and isinstance(
type, MetaType
), "type shouldn't be null and should be of type MetaType"
......@@ -110,7 +111,7 @@ class MetaDataMixin(object):
def create_metadatas(
self,
element: Element,
element: Union[Element, CachedElement],
metadatas: List[
Dict[
str, Union[MetaType, str, Union[str, Union[int, float]], Optional[str]]
......@@ -129,8 +130,8 @@ class MetaDataMixin(object):
- entity_id : Union[str, None]
"""
assert element and isinstance(
element, Element
), "element shouldn't be null and should be of type Element"
element, (Element, CachedElement)
), "element shouldn't be null and should be of type Element or CachedElement"
assert metadatas and isinstance(
metadatas, list
......@@ -186,7 +187,9 @@ class MetaDataMixin(object):
return created_metadatas
def list_element_metadata(self, element: Element) -> List[Dict[str, str]]:
def list_element_metadata(
self, element: Union[Element, CachedElement]
) -> List[Dict[str, str]]:
"""
List all metadata linked to an element.
This method does not support cache.
......@@ -194,7 +197,7 @@ class MetaDataMixin(object):
:param element: The element to list metadata on.
"""
assert element and isinstance(
element, Element
), "element shouldn't be null and should be of type Element"
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)
......@@ -4,6 +4,8 @@ import json
import pytest
from apistar.exceptions import ErrorResponse
from arkindex.mock import MockApiClient
from arkindex_worker.cache import CachedElement
from arkindex_worker.models import Element
from arkindex_worker.worker import MetaType
......@@ -18,7 +20,10 @@ def test_create_metadata_wrong_element(mock_elements_worker):
name="Teklia",
value="La Turbine, Grenoble 38000",
)
assert str(e.value) == "element shouldn't be null and should be of type Element"
assert (
str(e.value)
== "element shouldn't be null and should be of type Element or CachedElement"
)
with pytest.raises(AssertionError) as e:
mock_elements_worker.create_metadata(
......@@ -27,7 +32,10 @@ def test_create_metadata_wrong_element(mock_elements_worker):
name="Teklia",
value="La Turbine, Grenoble 38000",
)
assert str(e.value) == "element shouldn't be null and should be of type Element"
assert (
str(e.value)
== "element shouldn't be null and should be of type Element or CachedElement"
)
def test_create_metadata_wrong_type(mock_elements_worker):
......@@ -198,6 +206,41 @@ def test_create_metadata(responses, mock_elements_worker):
assert metadata_id == "12345678-1234-1234-1234-123456789123"
def test_create_metadata_cached_element(responses, mock_elements_worker_with_cache):
elt = CachedElement.create(id="12341234-1234-1234-1234-123412341234", type="thing")
responses.add(
responses.POST,
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
status=200,
json={"id": "12345678-1234-1234-1234-123456789123"},
)
metadata_id = mock_elements_worker_with_cache.create_metadata(
element=elt,
type=MetaType.Location,
name="Teklia",
value="La Turbine, Grenoble 38000",
)
assert len(responses.calls) == len(BASE_API_CALLS) + 1
assert [
(call.request.method, call.request.url) for call in responses.calls
] == BASE_API_CALLS + [
(
"POST",
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/",
),
]
assert json.loads(responses.calls[-1].request.body) == {
"type": "location",
"name": "Teklia",
"value": "La Turbine, Grenoble 38000",
"entity_id": None,
"worker_run_id": "56785678-5678-5678-5678-567856785678",
}
assert metadata_id == "12345678-1234-1234-1234-123456789123"
@pytest.mark.parametrize(
"metadatas",
[
......@@ -266,6 +309,80 @@ def test_create_metadatas(responses, mock_elements_worker, metadatas):
]
@pytest.mark.parametrize(
"metadatas",
[
([{"type": MetaType.Text, "name": "fake_name", "value": "fake_value"}]),
(
[
{
"type": MetaType.Text,
"name": "fake_name",
"value": "fake_value",
"entity_id": "fake_entity_id",
}
]
),
],
)
def test_create_metadatas_cached_element(
responses, mock_elements_worker_with_cache, metadatas
):
element = CachedElement.create(
id="12341234-1234-1234-1234-123412341234", type="thing"
)
responses.add(
responses.POST,
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
status=201,
json={
"worker_run_id": "56785678-5678-5678-5678-567856785678",
"metadata_list": [
{
"id": "fake_metadata_id",
"type": metadatas[0]["type"].value,
"name": metadatas[0]["name"],
"value": metadatas[0]["value"],
"dates": [],
"entity_id": metadatas[0].get("entity_id"),
}
],
},
)
created_metadatas = mock_elements_worker_with_cache.create_metadatas(
element, metadatas
)
assert len(responses.calls) == len(BASE_API_CALLS) + 1
assert [
(call.request.method, call.request.url) for call in responses.calls
] == BASE_API_CALLS + [
(
"POST",
"http://testserver/api/v1/element/12341234-1234-1234-1234-123412341234/metadata/bulk/",
),
]
assert json.loads(responses.calls[-1].request.body)["metadata_list"] == [
{
"type": metadatas[0]["type"].value,
"name": metadatas[0]["name"],
"value": metadatas[0]["value"],
"entity_id": metadatas[0].get("entity_id"),
}
]
assert created_metadatas == [
{
"id": "fake_metadata_id",
"type": metadatas[0]["type"].value,
"name": metadatas[0]["name"],
"value": metadatas[0]["value"],
"dates": [],
"entity_id": metadatas[0].get("entity_id"),
}
]
@pytest.mark.parametrize(
"wrong_element",
[
......@@ -283,7 +400,10 @@ def test_create_metadatas_wrong_element(mock_elements_worker, wrong_element):
mock_elements_worker.create_metadatas(
element=wrong_element, metadatas=wrong_metadatas
)
assert str(e.value) == "element shouldn't be null and should be of type Element"
assert (
str(e.value)
== "element shouldn't be null and should be of type Element or CachedElement"
)
@pytest.mark.parametrize(
......@@ -417,3 +537,19 @@ def test_list_element_metadata(fake_dummy_worker):
assert len(fake_dummy_worker.api_client.history) == 1
assert len(fake_dummy_worker.api_client.responses) == 0
def test_list_element_metadata_cached_element(mock_elements_worker_with_cache):
element = CachedElement.create(id="element_id", type="thing")
mock_elements_worker_with_cache.api_client = MockApiClient()
mock_elements_worker_with_cache.api_client.add_response(
"ListElementMetaData",
id="element_id",
response={"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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment