home · contact · privacy
More tests refactoring.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 21 Jun 2024 02:35:22 +0000 (04:35 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 21 Jun 2024 02:35:22 +0000 (04:35 +0200)
tests/conditions.py
tests/days.py
tests/utils.py

index 8f86854f16f0c47aa676b7b9b3ce07b49660c107..e488f34e7507b013234740eab6e1b59c87c52781 100644 (file)
@@ -102,8 +102,12 @@ class TestsWithServer(TestCaseWithServer):
                        'enables': [1], 'blockers': [1]}
         self.post_process(2, proc_2_post)
         cond = self.cond_as_dict(titles=['foo'], descriptions=['oof'])
-        proc_1 = self.proc_as_dict(conditions=[cond], disables=[cond])
-        proc_2 = self.proc_as_dict(2, 'B', blockers=[cond], enables=[cond])
+        assert isinstance(cond['id'], int)
+        proc_1 = self.proc_as_dict(conditions=[cond['id']],
+                                   disables=[cond['id']])
+        proc_2 = self.proc_as_dict(2, 'B',
+                                   blockers=[cond['id']],
+                                   enables=[cond['id']])
         expected = {'is_new': False,
                     'enabled_processes': self.as_id_list([proc_1]),
                     'disabled_processes': self.as_id_list([proc_2]),
index 856ce9978dc1d12cb0f8fc1040f02257b21ddedb..bfec21af29d977190222e5a2ce1a6ce18820d61f 100644 (file)
@@ -1,6 +1,7 @@
 """Test Days module."""
 from unittest import TestCase
 from datetime import datetime
+from typing import Callable
 from tests.utils import TestCaseWithDB, TestCaseWithServer
 from plomtask.dating import date_in_n_days
 from plomtask.days import Day
@@ -174,23 +175,43 @@ class TestsWithServer(TestCaseWithServer):
         self.post_day(f'date={date}', post)
         self.check_json_get(f'/day?date={date}', expected)
 
+    @staticmethod
+    def post_batch(list_of_args: list[list[object]],
+                   names_of_simples: list[str],
+                   names_of_versioneds: list[str],
+                   f_as_dict: Callable[..., dict[str, object]],
+                   f_to_post: Callable[..., None | dict[str, object]]
+                   ) -> list[dict[str, object]]:
+        """Post expected=f_as_dict(*args) as input to f_to_post, for many."""
+        expecteds = []
+        for args in list_of_args:
+            expecteds += [f_as_dict(*args)]
+        for expected in expecteds:
+            assert isinstance(expected['_versioned'], dict)
+            post = {}
+            for name in names_of_simples:
+                post[name] = expected[name]
+            for name in names_of_versioneds:
+                post[name] = expected['_versioned'][name][0]
+            f_to_post(expected['id'], post)
+        return expecteds
+
+    def post_cond(self, id_: int, form_data: dict[str, object]) -> None:
+        """POST Condition of id_ with form_data."""
+        self.check_post(form_data, f'/condition?id={id_}', 302)
+
     def test_do_GET_day_with_processes_and_todos(self) -> None:
         """Test GET /day displaying Processes and Todos."""
         date = '2024-01-01'
         # check Processes get displayed in ['processes'] and ['_library']
-        procs_expected = [self.proc_as_dict(1, 'foo', 'oof', 1.1),
-                          self.proc_as_dict(2, 'bar', 'rab', 0.9)]
-        for proc in procs_expected:
-            post = {}
-            assert isinstance(proc['_versioned'], dict)
-            for k in ('title', 'description', 'effort'):
-                post[k] = proc['_versioned'][k][0]
-            assert isinstance(proc['id'], int)
-            self.post_process(proc['id'], post)
+        procs_data = [[1, 'foo', 'oof', 1.1], [2, 'bar', 'rab', 0.9]]
+        procs_expected = self.post_batch(procs_data, [],
+                                         ['title', 'description', 'effort'],
+                                         self.proc_as_dict, self.post_process)
         self.post_day(f'date={date}')
         expected = self.get_day_dict(date)
-        expected['processes'] = self.as_id_list(procs_expected)
         assert isinstance(expected['_library'], dict)
+        expected['processes'] = self.as_id_list(procs_expected)
         expected['_library']['Process'] = self.as_refs(procs_expected)
         self.check_json_get(f'/day?date={date}', expected)
         # post Todos of either process and check their display
@@ -218,32 +239,20 @@ class TestsWithServer(TestCaseWithServer):
     def test_do_GET_day_with_conditions(self) -> None:
         """Test GET /day displaying Conditions and their relations."""
         # add Process with Conditions and their Todos, check display
-        # pylint: disable=too-many-locals
-        conds_expected = [self.cond_as_dict(1, False, ['A'], ['a']),
-                          self.cond_as_dict(2, True, ['B'], ['b'])]
-        for i, cond in enumerate(conds_expected):
-            post = {'is_active': cond['is_active']}
-            assert isinstance(cond['_versioned'], dict)
-            for k in ('title', 'description'):
-                post[k] = cond['_versioned'][k][0]
-            self.check_post(post, f'/condition?id={i+1}', 302)
-        procs_expected = [self.proc_as_dict(1, 'foo', 'oof', 1.1),
-                          self.proc_as_dict(2, 'bar', 'rab', 0.9)]
-        cond_names = ('conditions', 'disables', 'blockers', 'enables')
-        cond_vals = ((1, 1, 2, 2), (2, 2, 1, 1))
-        for i, proc in enumerate(procs_expected):
-            post = {}
-            assert isinstance(proc['_versioned'], dict)
-            for k in ('title', 'description', 'effort'):
-                post[k] = proc['_versioned'][k][0]
-            for j, cond_name in enumerate(cond_names):
-                post[cond_name] = proc[cond_name] = [cond_vals[i][j]]
-            assert isinstance(proc['id'], int)
-            self.post_process(proc['id'], post)
+        conds_data = [[1, False, ['A'], ['a']], [2, True, ['B'], ['b']]]
+        conds_expected = self.post_batch(conds_data, ['is_active'],
+                                         ['title', 'description'],
+                                         self.cond_as_dict, self.post_cond)
+        cond_names = ['conditions', 'disables', 'blockers', 'enables']
+        procs_data = [[1, 'foo', 'oof', 1.1, [1], [1], [2], [2]],
+                      [2, 'bar', 'rab', 0.9, [2], [2], [1], [1]]]
+        procs_expected = self.post_batch(procs_data, cond_names,
+                                         ['title', 'description', 'effort'],
+                                         self.proc_as_dict, self.post_process)
         date = '2024-01-01'
         expected = self.get_day_dict(date)
-        expected['processes'] = self.as_id_list(procs_expected)
         assert isinstance(expected['_library'], dict)
+        expected['processes'] = self.as_id_list(procs_expected)
         expected['_library']['Process'] = self.as_refs(procs_expected)
         expected['_library']['Condition'] = self.as_refs(conds_expected)
         self.post_day(f'date={date}')
index e0b4e5f2f7c144bffe5120040e3b85a36c91258e..665436873c27af704a13827715d3c795e04e1fe1 100644 (file)
@@ -371,14 +371,13 @@ class TestCaseWithServer(TestCaseWithDB):
                      title: str = 'A',
                      description: str = '',
                      effort: float = 1.0,
-                     enables: None | list[dict[str, object]] = None,
-                     disables: None | list[dict[str, object]] = None,
-                     conditions: None | list[dict[str, object]] = None,
-                     blockers: None | list[dict[str, object]] = None
+                     conditions: None | list[int] = None,
+                     disables: None | list[int] = None,
+                     blockers: None | list[int] = None,
+                     enables: None | list[int] = None
                      ) -> dict[str, object]:
         """Return JSON of Process to expect."""
         # pylint: disable=too-many-arguments
-        as_id_list = TestCaseWithServer.as_id_list
         d = {'id': id_,
              'calendarize': False,
              'suppressed_steps': [],
@@ -387,10 +386,10 @@ class TestCaseWithServer(TestCaseWithDB):
                  'title': {0: title},
                  'description': {0: description},
                  'effort': {0: effort}},
-             'conditions': as_id_list(conditions) if conditions else [],
-             'disables': as_id_list(disables) if disables else [],
-             'enables': as_id_list(enables) if enables else [],
-             'blockers': as_id_list(blockers) if blockers else []}
+             'conditions': conditions if conditions else [],
+             'disables': disables if disables else [],
+             'enables': enables if enables else [],
+             'blockers': blockers if blockers else []}
         return d
 
     def check_redirect(self, target: str) -> None: