home · contact · privacy
Extend Days test to behavior of Conditions.
[plomtask] / tests / conditions.py
index fb55e008bdb316669d1fb8abc56304413cd669d2..198df5f70bbf28618558967cdccdd52f8224e007 100644 (file)
@@ -9,7 +9,6 @@ from plomtask.exceptions import HandledException
 class TestsSansDB(TestCaseSansDB):
     """Tests requiring no DB setup."""
     checked_class = Condition
-    do_id_test = True
     versioned_defaults_to_test = {'title': 'UNNAMED', 'description': ''}
 
 
@@ -19,27 +18,9 @@ class TestsWithDB(TestCaseWithDB):
     default_init_kwargs = {'is_active': False}
     test_versioneds = {'title': str, 'description': str}
 
-    def test_from_table_row(self) -> None:
-        """Test .from_table_row() properly reads in class from DB"""
-        super().test_from_table_row()
-        self.check_versioned_from_table_row('title', str)
-        self.check_versioned_from_table_row('description', str)
-
-    def test_Condition_by_id(self) -> None:
-        """Test .by_id(), including creation."""
-        self.check_by_id()
-
-    def test_Condition_all(self) -> None:
-        """Test .all()."""
-        self.check_all()
-
-    def test_Condition_versioned_attributes_singularity(self) -> None:
-        """Test behavior of VersionedAttributes on saving (with .title)."""
-        self.check_versioned_singularity()
-
-    def test_Condition_remove(self) -> None:
+    def test_remove(self) -> None:
         """Test .remove() effects on DB and cache."""
-        self.check_remove()
+        super().test_remove()
         proc = Process(None)
         proc.save(self.db_conn)
         todo = Todo(None, proc, False, '2024-01-01')
@@ -61,54 +42,6 @@ class TestsWithDB(TestCaseWithDB):
 class TestsWithServer(TestCaseWithServer):
     """Module tests against our HTTP server/handler (and database)."""
 
-    @staticmethod
-    def cond_as_dict(id_: int = 1,
-                     is_active: bool = False,
-                     titles: None | list[str] = None,
-                     descriptions: None | list[str] = None
-                     ) -> dict[str, object]:
-        """Return JSON of Condition to expect."""
-        d = {'id': id_,
-             'is_active': is_active,
-             '_versioned': {
-                 'title': {},
-                 'description': {}
-                 }
-             }
-        titles = titles if titles else []
-        descriptions = descriptions if descriptions else []
-        assert isinstance(d['_versioned'], dict)
-        for i, title in enumerate(titles):
-            d['_versioned']['title'][i] = title
-        for i, description in enumerate(descriptions):
-            d['_versioned']['description'][i] = description
-        return d
-
-    @staticmethod
-    def proc_as_dict(id_: int = 1,
-                     title: str = 'A',
-                     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
-                     ) -> dict[str, object]:
-        """Return JSON of Process to expect."""
-        # pylint: disable=too-many-arguments
-        d = {'id': id_,
-             'calendarize': False,
-             'suppressed_steps': [],
-             'explicit_steps': [],
-             '_versioned': {
-                 'title': {0: title},
-                 'description': {0: ''},
-                 'effort': {0: 1.0}
-                 },
-             'conditions': conditions if conditions else [],
-             'disables': disables if disables else [],
-             'enables': enables if enables else [],
-             'blockers': blockers if blockers else []}
-        return d
-
     def test_do_POST_condition(self) -> None:
         """Test POST /condition and its effect on GET /condition[s]."""
         # check empty POST fails
@@ -124,12 +57,14 @@ class TestsWithServer(TestCaseWithServer):
                            'disabled_processes': [],
                            'enabling_processes': [],
                            'disabling_processes': [],
-                           'condition': cond}
+                           'condition': cond['id'],
+                           '_library': {'Condition': self.as_refs([cond])}}
         self.check_json_get('/condition?id=1', expected_single)
         # … full /conditions
         expected_all: dict[str, object]
-        expected_all = {'conditions': [cond],
-                        'sort_by': 'title', 'pattern': ''}
+        expected_all = {'conditions': self.as_id_list([cond]),
+                        'sort_by': 'title', 'pattern': '',
+                        '_library': {'Condition': self.as_refs([cond])}}
         self.check_json_get('/conditions', expected_all)
         # test effect of invalid POST to existing Condition on /condition
         self.check_post({}, '/condition?id=1', 400)
@@ -137,17 +72,20 @@ class TestsWithServer(TestCaseWithServer):
         # test effect of POST changing title and activeness
         post = {'title': 'bar', 'description': 'oof', 'is_active': True}
         self.check_post(post, '/condition?id=1', 302)
-        assert isinstance(expected_single['condition'], dict)
-        expected_single['condition']['_versioned']['title'][1] = 'bar'
-        expected_single['condition']['is_active'] = True
+        assert isinstance(cond['_versioned'], dict)
+        cond['_versioned']['title'][1] = 'bar'
+        cond['is_active'] = True
         self.check_json_get('/condition?id=1', expected_single)
         # test deletion POST's effect on …
         self.check_post({'delete': ''}, '/condition?id=1', 302, '/conditions')
         cond = self.cond_as_dict()
-        expected_single['condition'] = cond
+        assert isinstance(expected_single['_library'], dict)
+        assert isinstance(expected_single['_library']['Condition'], dict)
+        expected_single['_library']['Condition'] = self.as_refs([cond])
         self.check_json_get('/condition?id=1', expected_single)
         # … full /conditions
         expected_all['conditions'] = []
+        expected_all['_library'] = {}
         self.check_json_get('/conditions', expected_all)
 
     def test_do_GET_condition(self) -> None:
@@ -166,25 +104,29 @@ class TestsWithServer(TestCaseWithServer):
         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])
-        expected_single = {'is_new': False,
-                           'enabled_processes': [proc_1],
-                           'disabled_processes': [proc_2],
-                           'enabling_processes': [proc_2],
-                           'disabling_processes': [proc_1],
-                           'condition': cond}
-        self.check_json_get('/condition?id=1', expected_single)
+        expected = {'is_new': False,
+                    'enabled_processes': self.as_id_list([proc_1]),
+                    'disabled_processes': self.as_id_list([proc_2]),
+                    'enabling_processes': self.as_id_list([proc_2]),
+                    'disabling_processes': self.as_id_list([proc_1]),
+                    'condition': cond['id'],
+                    '_library': {'Condition': self.as_refs([cond]),
+                                 'Process': self.as_refs([proc_1, proc_2])}}
+        self.check_json_get('/condition?id=1', expected)
 
     def test_do_GET_conditions(self) -> None:
         """Test GET /conditions."""
         # test empty result on empty DB, default-settings on empty params
         expected_json: dict[str, object] = {'conditions': [],
                                             'sort_by': 'title',
-                                            'pattern': ''}
+                                            'pattern': '',
+                                            '_library': {}}
         self.check_json_get('/conditions', expected_json)
         # test on meaningless non-empty params (incl. entirely un-used key)
         expected_json = {'conditions': [],
                          'sort_by': 'title',  # nonsense "foo" defaulting
-                         'pattern': 'bar'}  # preserved despite zero effect
+                         'pattern': 'bar',  # preserved despite zero effect
+                         '_library': {}}
         self.check_json_get('/conditions?sort_by=foo&pattern=bar&foo=x',
                             expected_json)
         # test non-empty result, automatic (positive) sorting by title
@@ -198,25 +140,32 @@ class TestsWithServer(TestCaseWithServer):
         cond_2 = self.cond_as_dict(2, titles=['bar'], descriptions=['rab'])
         cond_3 = self.cond_as_dict(3, True, ['baz'], ['zab'])
         cons = [cond_2, cond_3, cond_1]
-        expected_json = {'conditions': cons, 'sort_by': 'title', 'pattern': ''}
+        expected_json = {'conditions': self.as_id_list(cons),
+                         'sort_by': 'title',
+                         'pattern': '',
+                         '_library': {'Condition': self.as_refs(cons)}}
         self.check_json_get('/conditions', expected_json)
         # test other sortings
         # (NB: by .is_active has two items of =False, their order currently
         # is not explicitly made predictable, so mail fail until we do)
-        expected_json['conditions'] = [cond_1, cond_3, cond_2]
+        expected_json['conditions'] = self.as_id_list([cond_1, cond_3, cond_2])
         expected_json['sort_by'] = '-title'
         self.check_json_get('/conditions?sort_by=-title', expected_json)
-        expected_json['conditions'] = [cond_1, cond_2, cond_3]
+        expected_json['conditions'] = self.as_id_list([cond_1, cond_2, cond_3])
         expected_json['sort_by'] = 'is_active'
         self.check_json_get('/conditions?sort_by=is_active', expected_json)
-        expected_json['conditions'] = [cond_3, cond_1, cond_2]
+        expected_json['conditions'] = self.as_id_list([cond_3, cond_1, cond_2])
         expected_json['sort_by'] = '-is_active'
         self.check_json_get('/conditions?sort_by=-is_active', expected_json)
         # test pattern matching on title
-        expected_json = {'conditions': [cond_2, cond_3],
-                         'sort_by': 'title', 'pattern': 'ba'}
+        cons = [cond_2, cond_3]
+        expected_json = {'conditions': self.as_id_list(cons),
+                         'sort_by': 'title', 'pattern': 'ba',
+                         '_library': {'Condition': self.as_refs(cons)}}
         self.check_json_get('/conditions?pattern=ba', expected_json)
         # test pattern matching on description
-        expected_json['conditions'] = [cond_1]
+        expected_json['conditions'] = self.as_id_list([cond_1])
+        assert isinstance(expected_json['_library'], dict)
+        expected_json['_library']['Condition'] = self.as_refs([cond_1])
         expected_json['pattern'] = 'oo'
         self.check_json_get('/conditions?pattern=oo', expected_json)