From e23c86a54e640cc409c3bea41ce983d7ff293dce Mon Sep 17 00:00:00 2001
From: Yoann Schneider <yschneider@teklia.com>
Date: Fri, 15 Sep 2023 18:06:56 +0200
Subject: [PATCH] Check before updating image, better tests

---
 arkindex_worker/worker/element.py           |  3 +-
 tests/test_elements_worker/test_elements.py | 48 +++++++++++++++++----
 2 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/arkindex_worker/worker/element.py b/arkindex_worker/worker/element.py
index 30c443ac..d02b7c02 100644
--- a/arkindex_worker/worker/element.py
+++ b/arkindex_worker/worker/element.py
@@ -343,7 +343,8 @@ class ElementMixin(object):
                 payload["polygon"] = str(payload["polygon"])
 
             # Retrieve the right image
-            payload["image"] = CachedImage.get_by_id(payload["image"])
+            if "image" in payload:
+                payload["image"] = CachedImage.get_by_id(payload["image"])
 
             CachedElement.update(**payload).where(
                 CachedElement.id == element.id
diff --git a/tests/test_elements_worker/test_elements.py b/tests/test_elements_worker/test_elements.py
index 7f80bd45..e86bdcf5 100644
--- a/tests/test_elements_worker/test_elements.py
+++ b/tests/test_elements_worker/test_elements.py
@@ -1306,8 +1306,37 @@ def test_update_element_api_error(responses, mock_elements_worker):
     ]
 
 
+@pytest.mark.parametrize(
+    "payload",
+    (
+        (
+            {
+                "polygon": [[10, 10], [20, 20], [20, 10], [10, 20]],
+                "confidence": None,
+            }
+        ),
+        (
+            {
+                "rotation_angle": 45,
+                "mirrored": False,
+            }
+        ),
+        (
+            {
+                "polygon": [[10, 10], [20, 20], [20, 10], [10, 20]],
+                "confidence": None,
+                "rotation_angle": 45,
+                "mirrored": False,
+            }
+        ),
+    ),
+)
 def test_update_element(
-    responses, mock_elements_worker_with_cache, mock_cached_elements, mock_cached_images
+    responses,
+    mock_elements_worker_with_cache,
+    mock_cached_elements,
+    mock_cached_images,
+    payload,
 ):
     elt = CachedElement.select().first()
     new_image = CachedImage.select().first()
@@ -1315,11 +1344,8 @@ def test_update_element(
     elt_response = {
         "type": "new type",
         "name": "new name",
-        "polygon": [[10, 10], [20, 20], [20, 10], [10, 20]],
-        "confidence": None,
-        "rotation_angle": 45,
-        "mirrored": False,
         "image": str(new_image.id),
+        **payload,
     }
     responses.add(
         responses.PUT,
@@ -1347,12 +1373,16 @@ def test_update_element(
     assert element_update_response == elt_response
 
     cached_element = CachedElement.get(CachedElement.id == elt.id)
+    # Always present in payload
     assert cached_element.type == elt_response["type"]
-    assert cached_element.polygon == str(elt_response["polygon"])
-    assert cached_element.confidence == elt_response["confidence"]
-    assert cached_element.rotation_angle == elt_response["rotation_angle"]
-    assert cached_element.mirrored == elt_response["mirrored"]
     assert str(cached_element.image_id) == elt_response["image"]
+    # Optional params
+    if "polygon" in payload:
+        # Cast to string as this is the only difference compared to model
+        elt_response["polygon"] = str(elt_response["polygon"])
+
+    for param in payload:
+        assert getattr(cached_element, param) == elt_response[param]
 
 
 def test_update_element_confidence(
-- 
GitLab