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
-from dataclasses import dataclass
 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
 
 
-@dataclass
 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]
 
+    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."""
index 079a0ebee54eb8c26558f2b770152f0236d432e5..4e70e097b5d1c53c709d43fb1b42462fe186c248 100644 (file)
@@ -83,8 +83,36 @@ class TestsWithServer(TestCaseWithServer):
         """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."""
+        # pylint: disable=too-many-statements
         # 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
-        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']
@@ -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)
+        # 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."""
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, [])
-        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
-        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)
@@ -137,7 +138,7 @@ class TestsWithDB(TestCaseWithDB, TestCaseSansDB):
         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)
@@ -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]
-        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]
-        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."""