From 4ef171a18b0f9cdbce19196042d6677c603e850b Mon Sep 17 00:00:00 2001
From: mlbonhomme <bonhomme@teklia.com>
Date: Tue, 23 Nov 2021 15:32:25 +0000
Subject: [PATCH] add unit test for element dot delete

---
 .../documents/tests/test_destroy_elements.py  | 11 ++++
 .../sql_validation/element_dot_delete.sql     | 61 +++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100644 arkindex/sql_validation/element_dot_delete.sql

diff --git a/arkindex/documents/tests/test_destroy_elements.py b/arkindex/documents/tests/test_destroy_elements.py
index 2dece9f44a..5348e927cd 100644
--- a/arkindex/documents/tests/test_destroy_elements.py
+++ b/arkindex/documents/tests/test_destroy_elements.py
@@ -467,3 +467,14 @@ class TestDestroyElements(FixtureAPITestCase):
             'user_id': self.user.id,
             'description': 'Element deletion',
         })
+
+    def test_element_dot_delete(self):
+        """
+        test Element.delete method
+        """
+        self.maxDiff = None
+        self.client.force_login(self.user)
+        with self.assertExactQueries('element_dot_delete.sql', params={'id': str(self.vol.id)}):
+            self.vol.delete()
+        with self.assertRaises(Element.DoesNotExist):
+            self.vol.refresh_from_db()
diff --git a/arkindex/sql_validation/element_dot_delete.sql b/arkindex/sql_validation/element_dot_delete.sql
new file mode 100644
index 0000000000..cb144dc710
--- /dev/null
+++ b/arkindex/sql_validation/element_dot_delete.sql
@@ -0,0 +1,61 @@
+DELETE FROM documents_transcriptionentity te WHERE transcription_id IN (
+    SELECT t.id FROM documents_transcription t
+    LEFT JOIN documents_elementpath elementpath USING (element_id)
+    WHERE t.element_id = '{id}'::uuid OR elementpath.path && ARRAY['{id}'::uuid]
+) ;
+
+DELETE FROM documents_transcription
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+DELETE FROM documents_classification
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+DELETE FROM documents_metadata
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+ ) ;
+
+DELETE FROM dataimport_dataimportelement
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+UPDATE dataimport_dataimport
+SET element_id = NULL
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+DELETE FROM documents_selection selection
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+DELETE FROM dataimport_workeractivity
+WHERE element_id = '{id}'::uuid
+OR element_id IN (
+    SELECT element_id FROM documents_elementpath WHERE path && ARRAY['{id}'::uuid]
+) ;
+
+WITH children_ids (id) AS (
+    DELETE FROM documents_elementpath
+    WHERE element_id = '{id}'::uuid OR path && ARRAY['{id}'::uuid]
+    RETURNING element_id
+)
+DELETE FROM documents_element element
+USING children_ids
+WHERE element.id = children_ids.id ;
+
+DELETE
+FROM "documents_element"
+WHERE "documents_element"."id" = '{id}'::uuid
\ No newline at end of file
-- 
GitLab