From bdb93117ce0f2b08b7b70cf43ac086afa4689c0f Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 18 Jun 2024 10:40:02 +0200
Subject: [PATCH] Re-factor TestCaseSansDB methods.

---
 tests/conditions.py |  1 -
 tests/days.py       |  2 ++
 tests/processes.py  |  2 --
 tests/todos.py      |  5 ++---
 tests/utils.py      | 40 +++++++++++++++++++++-------------------
 5 files changed, 25 insertions(+), 25 deletions(-)

diff --git a/tests/conditions.py b/tests/conditions.py
index 4ac69a8..468b1e8 100644
--- a/tests/conditions.py
+++ b/tests/conditions.py
@@ -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': ''}
 
 
diff --git a/tests/days.py b/tests/days.py
index 36d0285..f1d13b3 100644
--- a/tests/days.py
+++ b/tests/days.py
@@ -10,6 +10,8 @@ from plomtask.exceptions import BadFormatException
 
 class TestsSansDB(TestCase):
     """Days module tests not requiring DB setup."""
+    legal_ids = ['2024-01-01']
+    illegal_ids = ['foo', '2024-02-30', '2024-02-01 23:00:00']
 
     def test_Day_valid_date(self) -> None:
         """Test Day's date format validation and parsing."""
diff --git a/tests/processes.py b/tests/processes.py
index 481d2d4..5c3e703 100644
--- a/tests/processes.py
+++ b/tests/processes.py
@@ -9,7 +9,6 @@ from plomtask.todos import Todo
 class TestsSansDB(TestCaseSansDB):
     """Module tests not requiring DB setup."""
     checked_class = Process
-    do_id_test = True
     versioned_defaults_to_test = {'title': 'UNNAMED', 'description': '',
                                   'effort': 1.0}
 
@@ -17,7 +16,6 @@ class TestsSansDB(TestCaseSansDB):
 class TestsSansDBProcessStep(TestCaseSansDB):
     """Module tests not requiring DB setup."""
     checked_class = ProcessStep
-    do_id_test = True
     default_init_args = [2, 3, 4]
 
 
diff --git a/tests/todos.py b/tests/todos.py
index 7632f39..51297a8 100644
--- a/tests/todos.py
+++ b/tests/todos.py
@@ -10,8 +10,8 @@ from plomtask.exceptions import (NotFoundException, BadFormatException,
 class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
     """Tests requiring DB, but not server setup.
 
-    NB: We subclass TestCaseSansDB too, to pull in its .test_id_setting, which
-    for Todo wouldn't run without a DB being set up due to the need for
+    NB: We subclass TestCaseSansDB too, to pull in its .test_id_validation,
+    which for Todo wouldn't run without a DB being set up due to the need for
     Processes with set IDs.
     """
     checked_class = Todo
@@ -19,7 +19,6 @@ class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
                            'date': '2024-01-01'}
     # solely used for TestCaseSansDB.test_id_setting
     default_init_args = [None, False, '2024-01-01']
-    do_id_test = True
 
     def setUp(self) -> None:
         super().setUp()
diff --git a/tests/utils.py b/tests/utils.py
index 0925b2d..f473c18 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -17,27 +17,36 @@ from plomtask.todos import Todo
 from plomtask.exceptions import NotFoundException, HandledException
 
 
+def _within_checked_class(f: Callable[..., None]) -> Callable[..., None]:
+    def wrapper(self: TestCase) -> None:
+        if hasattr(self, 'checked_class'):
+            f(self)
+    return wrapper
+
+
 class TestCaseSansDB(TestCase):
     """Tests requiring no DB setup."""
     checked_class: Any
-    do_id_test: bool = False
     default_init_args: list[Any] = []
     versioned_defaults_to_test: dict[str, str | float] = {}
+    legal_ids = [1, 5]
+    illegal_ids = [0]
 
-    def test_id_setting(self) -> None:
-        """Test .id_ being set and its legal range being enforced."""
-        if not self.do_id_test:
-            return
-        with self.assertRaises(HandledException):
-            self.checked_class(0, *self.default_init_args)
-        obj = self.checked_class(5, *self.default_init_args)
-        self.assertEqual(obj.id_, 5)
+    @_within_checked_class
+    def test_id_validation(self) -> None:
+        """Test .id_ validation/setting."""
+        for id_ in self.illegal_ids:
+            with self.assertRaises(HandledException):
+                self.checked_class(id_, *self.default_init_args)
+        for id_ in self.legal_ids:
+            obj = self.checked_class(id_, *self.default_init_args)
+            self.assertEqual(obj.id_, id_)
 
+    @_within_checked_class
     def test_versioned_defaults(self) -> None:
         """Test defaults of VersionedAttributes."""
-        if len(self.versioned_defaults_to_test) == 0:
-            return
-        obj = self.checked_class(1, *self.default_init_args)
+        id_ = self.legal_ids[0]
+        obj = self.checked_class(id_, *self.default_init_args)
         for k, v in self.versioned_defaults_to_test.items():
             self.assertEqual(getattr(obj, k).newest, v)
 
@@ -62,13 +71,6 @@ class TestCaseWithDB(TestCase):
         self.db_conn.close()
         remove_file(self.db_file.path)
 
-    @staticmethod
-    def _within_checked_class(f: Callable[..., None]) -> Callable[..., None]:
-        def wrapper(self: TestCaseWithDB) -> None:
-            if hasattr(self, 'checked_class'):
-                f(self)
-        return wrapper
-
     def _load_from_db(self, id_: int | str) -> list[object]:
         db_found: list[object] = []
         for row in self.db_conn.row_where(self.checked_class.table_name,
-- 
2.30.2