home · contact · privacy
Turn TodoNode into full class with .as_dict, with result expand Day tests.
authorChristian Heller <c.heller@plomlompom.de>
Thu, 20 Jun 2024 21:03:06 +0000 (23:03 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 20 Jun 2024 21:03:06 +0000 (23:03 +0200)
plomtask/todos.py
tests/days.py
tests/todos.py

index 705bd725e2ff662ab4f9f2e370e61169a413ff03..4d7e393bc49191db242235c1f11092bafce450ed 100644 (file)
@@ -1,6 +1,5 @@
 """Actionables."""
 from __future__ import annotations
 """Actionables."""
 from __future__ import annotations
-from dataclasses import dataclass
 from typing import Any, Set
 from sqlite3 import Row
 from plomtask.db import DatabaseConnection, BaseModel
 from typing import Any, Set
 from sqlite3 import Row
 from plomtask.db import DatabaseConnection, BaseModel
@@ -12,13 +11,28 @@ from plomtask.exceptions import (NotFoundException, BadFormatException,
 from plomtask.dating import valid_date
 
 
 from plomtask.dating import valid_date
 
 
-@dataclass
 class TodoNode:
     """Collects what's useful to know for Todo/Condition tree display."""
 class TodoNode:
     """Collects what's useful to know for Todo/Condition tree display."""
+    # pylint: disable=too-few-public-methods
     todo: Todo
     seen: bool
     children: list[TodoNode]
 
     todo: Todo
     seen: bool
     children: list[TodoNode]
 
+    def __init__(self,
+                 todo: Todo,
+                 seen: bool,
+                 children: list[TodoNode]) -> None:
+        self.todo = todo
+        self.seen = seen
+        self.children = children
+
+    @property
+    def as_dict(self) -> dict[str, object]:
+        """Return self as (json.dumps-coompatible) dict."""
+        return {'todo': self.todo.id_,
+                'seen': self.seen,
+                'children': [c.as_dict for c in self.children]}
+
 
 class Todo(BaseModel[int], ConditionsRelations):
     """Individual actionable."""
 
 class Todo(BaseModel[int], ConditionsRelations):
     """Individual actionable."""
index 079a0ebee54eb8c26558f2b770152f0236d432e5..4e70e097b5d1c53c709d43fb1b42462fe186c248 100644 (file)
@@ -83,8 +83,36 @@ class TestsWithServer(TestCaseWithServer):
         """Return JSON of Process to expect."""
         return {'id': date, 'comment': '', 'todos': []}
 
         """Return JSON of Process to expect."""
         return {'id': date, 'comment': '', 'todos': []}
 
+    @staticmethod
+    def todo_as_dict(id_: int = 1,
+                     process_id: int = 1,
+                     date: str = '2024-01-01',
+                     ) -> dict[str, object]:
+        """Return JSON of Process to expect."""
+        # pylint: disable=too-many-arguments
+        d = {'id': id_,
+             'date': date,
+             'process_id': process_id,
+             'is_done': False,
+             'calendarize': False,
+             'comment': '',
+             'children': [],
+             'parents': [],
+             'effort': None,
+             'conditions': [],
+             'disables': [],
+             'enables': [],
+             'blockers': []}
+        return d
+
+    @staticmethod
+    def todo_node_as_dict(todo_id: int) -> dict[str, object]:
+        """Return JSON of TodoNode to expect."""
+        return {'children': [], 'seen': False, 'todo': todo_id}
+
     def test_do_GET_day(self) -> None:
         """Test GET /day basics."""
     def test_do_GET_day(self) -> None:
         """Test GET /day basics."""
+        # pylint: disable=too-many-statements
         # check undefined day
         date = date_in_n_days(0)
         day = self.day_dict(date)
         # check undefined day
         date = date_in_n_days(0)
         day = self.day_dict(date)
@@ -119,7 +147,7 @@ class TestsWithServer(TestCaseWithServer):
         expected['_library']['Day'] = self.as_refs([day])
         self.check_json_get(f'/day?date={date}', expected)
         # check saved day
         expected['_library']['Day'] = self.as_refs([day])
         self.check_json_get(f'/day?date={date}', expected)
         # check saved day
-        post_day = {'day_comment': 'foo', 'make_type': ''}
+        post_day: dict[str, object] = {'day_comment': 'foo', 'make_type': ''}
         self.check_post(post_day, f'/day?date={date}', 302,
                         f'/day?date={date}&make_type=')
         day['comment'] = post_day['day_comment']
         self.check_post(post_day, f'/day?date={date}', 302,
                         f'/day?date={date}&make_type=')
         day['comment'] = post_day['day_comment']
@@ -131,6 +159,28 @@ class TestsWithServer(TestCaseWithServer):
         self.check_json_get(f'/day?date={date}', expected)
         expected['make_type'] = 'bar'
         self.check_json_get(f'/day?date={date}&make_type=bar', expected)
         self.check_json_get(f'/day?date={date}', expected)
         expected['make_type'] = 'bar'
         self.check_json_get(f'/day?date={date}&make_type=bar', expected)
+        # check GET with two Todos and Processes
+        expected['make_type'] = ''
+        form_data = self.post_process(1)
+        form_data['title'] = 'bar'
+        form_data['description'] = 'rab'
+        form_data['effort'] = 0.9
+        self.post_process(2, form_data)
+        post_day['new_todo'] = [1, 2]
+        self.check_post(post_day, f'/day?date={date}', 302,
+                        f'/day?date={date}&make_type=foo')
+        proc1 = self.proc_as_dict(1, 'foo', 'foo', 1.1)
+        proc2 = self.proc_as_dict(2, 'bar', 'rab', 0.9)
+        expected['_library']['Process'] = self.as_refs([proc1, proc2])
+        expected['processes'] = self.as_id_list([proc1, proc2])
+        t1 = self.todo_as_dict(1, 1, date)
+        t2 = self.todo_as_dict(2, 2, date)
+        expected['_library']['Todo'] = self.as_refs([t1, t2])
+        day['todos'] = self.as_id_list([t1, t2])
+        n1 = self.todo_node_as_dict(1)
+        n2 = self.todo_node_as_dict(2)
+        expected['top_nodes'] = [n1, n2]
+        self.check_json_get(f'/day?date={date}', expected)
 
     def test_do_GET(self) -> None:
         """Test /day and /calendar response codes, and / redirect."""
 
     def test_do_GET(self) -> None:
         """Test /day and /calendar response codes, and / redirect."""
index 4bc1411b74cbddace9cf0a745527c0dcbb971b1d..8b8099f509a70029b45a24cef229cca162985e73 100644 (file)
@@ -125,10 +125,11 @@ class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
         assert isinstance(todo_1.id_, int)
         # test minimum
         node_0 = TodoNode(todo_1, False, [])
         assert isinstance(todo_1.id_, int)
         # test minimum
         node_0 = TodoNode(todo_1, False, [])
-        self.assertEqual(todo_1.get_step_tree(set()), node_0)
+        self.assertEqual(todo_1.get_step_tree(set()).as_dict, node_0.as_dict)
         # test non_emtpy seen_todo does something
         node_0.seen = True
         # test non_emtpy seen_todo does something
         node_0.seen = True
-        self.assertEqual(todo_1.get_step_tree({todo_1.id_}), node_0)
+        self.assertEqual(todo_1.get_step_tree({todo_1.id_}).as_dict,
+                         node_0.as_dict)
         # test child shows up
         todo_2 = Todo(None, self.proc, False, self.date1)
         todo_2.save(self.db_conn)
         # test child shows up
         todo_2 = Todo(None, self.proc, False, self.date1)
         todo_2.save(self.db_conn)
@@ -137,7 +138,7 @@ class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
         node_2 = TodoNode(todo_2, False, [])
         node_0.children = [node_2]
         node_0.seen = False
         node_2 = TodoNode(todo_2, False, [])
         node_0.children = [node_2]
         node_0.seen = False
-        self.assertEqual(todo_1.get_step_tree(set()), node_0)
+        self.assertEqual(todo_1.get_step_tree(set()).as_dict, node_0.as_dict)
         # test child shows up with child
         todo_3 = Todo(None, self.proc, False, self.date1)
         todo_3.save(self.db_conn)
         # test child shows up with child
         todo_3 = Todo(None, self.proc, False, self.date1)
         todo_3.save(self.db_conn)
@@ -145,12 +146,12 @@ class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
         todo_2.add_child(todo_3)
         node_3 = TodoNode(todo_3, False, [])
         node_2.children = [node_3]
         todo_2.add_child(todo_3)
         node_3 = TodoNode(todo_3, False, [])
         node_2.children = [node_3]
-        self.assertEqual(todo_1.get_step_tree(set()), node_0)
+        self.assertEqual(todo_1.get_step_tree(set()).as_dict, node_0.as_dict)
         # test same todo can be child-ed multiple times at different locations
         todo_1.add_child(todo_3)
         node_4 = TodoNode(todo_3, True, [])
         node_0.children += [node_4]
         # test same todo can be child-ed multiple times at different locations
         todo_1.add_child(todo_3)
         node_4 = TodoNode(todo_3, True, [])
         node_0.children += [node_4]
-        self.assertEqual(todo_1.get_step_tree(set()), node_0)
+        self.assertEqual(todo_1.get_step_tree(set()).as_dict, node_0.as_dict)
 
     def test_Todo_create_with_children(self) -> None:
         """Test parenthood guaranteeds of Todo.create_with_children."""
 
     def test_Todo_create_with_children(self) -> None:
         """Test parenthood guaranteeds of Todo.create_with_children."""