home · contact · privacy
Use higher resolution for VersionedAttribute.history timestamps, avoid conflicts...
[plomtask] / tests / processes.py
index 9413822291a87439aafda0cd39459c93b3905661..3d861b752a92ae88888039764fdbb7351decd3a6 100644 (file)
@@ -3,6 +3,7 @@ from unittest import TestCase
 from tests.utils import TestCaseWithDB, TestCaseWithServer
 from plomtask.processes import Process, ProcessStep, ProcessStepsNode
 from plomtask.conditions import Condition
 from tests.utils import TestCaseWithDB, TestCaseWithServer
 from plomtask.processes import Process, ProcessStep, ProcessStepsNode
 from plomtask.conditions import Condition
+from plomtask.todos import Todo
 from plomtask.exceptions import NotFoundException, HandledException
 
 
 from plomtask.exceptions import NotFoundException, HandledException
 
 
@@ -135,12 +136,20 @@ class TestsWithDB(TestCaseWithDB):
         self.assertEqual(step.parent_step_id, step_retrieved.parent_step_id)
 
     def test_Process_singularity(self) -> None:
         self.assertEqual(step.parent_step_id, step_retrieved.parent_step_id)
 
     def test_Process_singularity(self) -> None:
-        """Test pointers made for single object keep pointing to it."""
+        """Test pointers made for single object keep pointing to it, and
+        subsequent retrievals don't overload relations."""
         assert isinstance(self.proc1.id_, int)
         assert isinstance(self.proc2.id_, int)
         assert isinstance(self.proc1.id_, int)
         assert isinstance(self.proc2.id_, int)
+        c1 = Condition(None, False)
+        c1.save(self.db_conn)
+        assert isinstance(c1.id_, int)
+        self.proc1.set_conditions(self.db_conn, [c1.id_])
         self.proc1.set_steps(self.db_conn, [(None, self.proc2.id_, None)])
         self.proc1.set_steps(self.db_conn, [(None, self.proc2.id_, None)])
+        self.proc1.save(self.db_conn)
         p_retrieved = Process.by_id(self.db_conn, self.proc1.id_)
         self.assertEqual(self.proc1.explicit_steps, p_retrieved.explicit_steps)
         p_retrieved = Process.by_id(self.db_conn, self.proc1.id_)
         self.assertEqual(self.proc1.explicit_steps, p_retrieved.explicit_steps)
+        self.assertEqual(self.proc1.conditions, p_retrieved.conditions)
+        self.proc1.save(self.db_conn)
 
     def test_Process_versioned_attributes_singularity(self) -> None:
         """Test behavior of VersionedAttributes on saving (with .title)."""
 
     def test_Process_versioned_attributes_singularity(self) -> None:
         """Test behavior of VersionedAttributes on saving (with .title)."""
@@ -149,6 +158,30 @@ class TestsWithDB(TestCaseWithDB):
         p_loaded = Process.by_id(self.db_conn, self.proc1.id_)
         self.assertEqual(self.proc1.title.history, p_loaded.title.history)
 
         p_loaded = Process.by_id(self.db_conn, self.proc1.id_)
         self.assertEqual(self.proc1.title.history, p_loaded.title.history)
 
+    def test_Process_removal(self) -> None:
+        """Test removal of Processes and ProcessSteps."""
+        assert isinstance(self.proc3.id_, int)
+        self.proc1.remove(self.db_conn)
+        self.assertEqual({self.proc2.id_, self.proc3.id_},
+                         set(p.id_ for p in Process.all(self.db_conn)))
+        self.proc2.set_steps(self.db_conn, [(None, self.proc3.id_, None)])
+        with self.assertRaises(HandledException):
+            self.proc3.remove(self.db_conn)
+        self.proc2.explicit_steps[0].remove(self.db_conn)
+        retrieved = Process.by_id(self.db_conn, self.proc2.id_)
+        self.assertEqual(retrieved.explicit_steps, [])
+        self.proc2.set_steps(self.db_conn, [(None, self.proc3.id_, None)])
+        step = retrieved.explicit_steps[0]
+        self.proc2.remove(self.db_conn)
+        with self.assertRaises(NotFoundException):
+            ProcessStep.by_id(self.db_conn, step.id_)
+        todo = Todo(None, self.proc3, False, '2024-01-01')
+        todo.save(self.db_conn)
+        with self.assertRaises(HandledException):
+            self.proc3.remove(self.db_conn)
+        todo.remove(self.db_conn)
+        self.proc3.remove(self.db_conn)
+
 
 class TestsWithServer(TestCaseWithServer):
     """Module tests against our HTTP server/handler (and database)."""
 
 class TestsWithServer(TestCaseWithServer):
     """Module tests against our HTTP server/handler (and database)."""
@@ -156,37 +189,31 @@ class TestsWithServer(TestCaseWithServer):
     def test_do_POST_process(self) -> None:
         """Test POST /process and its effect on the database."""
         self.assertEqual(0, len(Process.all(self.db_conn)))
     def test_do_POST_process(self) -> None:
         """Test POST /process and its effect on the database."""
         self.assertEqual(0, len(Process.all(self.db_conn)))
-        form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.1}
-        self.check_post(form_data, '/process?id=', 302, '/')
+        form_data = self.post_process()
         self.assertEqual(1, len(Process.all(self.db_conn)))
         self.check_post(form_data, '/process?id=FOO', 400)
         self.assertEqual(1, len(Process.all(self.db_conn)))
         self.check_post(form_data, '/process?id=FOO', 400)
-        form_data['effort'] = 'foo'
-        self.check_post(form_data, '/process?id=', 400)
+        self.check_post(form_data | {'effort': 'foo'}, '/process?id=', 400)
         self.check_post({}, '/process?id=', 400)
         self.check_post({}, '/process?id=', 400)
-        form_data = {'title': '', 'description': ''}
-        self.check_post(form_data, '/process?id=', 400)
-        form_data = {'title': '', 'effort': 1.1}
-        self.check_post(form_data, '/process?id=', 400)
-        form_data = {'description': '', 'effort': 1.0}
-        self.check_post(form_data, '/process?id=', 400)
+        self.check_post({'title': '', 'description': ''}, '/process?id=', 400)
+        self.check_post({'title': '', 'effort': 1.1}, '/process?id=', 400)
+        self.check_post({'description': '', 'effort': 1.0},
+                        '/process?id=', 400)
         self.assertEqual(1, len(Process.all(self.db_conn)))
         self.assertEqual(1, len(Process.all(self.db_conn)))
-        form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.0,
-                     'condition': []}
-        self.check_post(form_data, '/process?id=', 302, '/')
-        form_data['condition'] = [1]
+        form_data = {'title': 'foo', 'description': 'foo', 'effort': 1.0}
+        self.post_process(2, form_data | {'condition': []})
+        self.check_post(form_data | {'condition': [1]}, '/process?id=', 404)
+        self.check_post({'title': 'foo', 'description': 'foo'},
+                        '/condition', 302, '/condition?id=1')
+        self.post_process(3, form_data | {'condition': [1]})
+        self.post_process(4, form_data | {'disables': [1]})
+        self.post_process(5, form_data | {'enables': [1]})
+        form_data['delete'] = ''
         self.check_post(form_data, '/process?id=', 404)
         self.check_post(form_data, '/process?id=', 404)
-        form_data_cond = {'title': 'foo', 'description': 'foo'}
-        self.check_post(form_data_cond, '/condition', 302, '/')
-        self.check_post(form_data, '/process?id=', 302, '/')
-        form_data['disables'] = [1]
-        self.check_post(form_data, '/process?id=', 302, '/')
-        form_data['enables'] = [1]
-        self.check_post(form_data, '/process?id=', 302, '/')
+        self.check_post(form_data, '/process?id=6', 404)
+        self.check_post(form_data, '/process?id=5', 302, '/processes')
 
     def test_do_GET(self) -> None:
         """Test /process and /processes response codes."""
 
     def test_do_GET(self) -> None:
         """Test /process and /processes response codes."""
-        self.check_get('/process', 200)
-        self.check_get('/process?id=', 200)
-        self.check_get('/process?id=0', 500)
-        self.check_get('/process?id=FOO', 400)
+        self.post_process()
+        self.check_get_defaults('/process')
         self.check_get('/processes', 200)
         self.check_get('/processes', 200)