+
+ def test_fail_POST_day(self) -> None:
+ """Test malformed/illegal POST /day requests."""
+ # check payloads lacking minimum expecteds
+ url = '/day?date=2024-01-01'
+ self.check_post({}, url, 400)
+ self.check_post({'day_comment': ''}, url, 400)
+ self.check_post({'make_type': ''}, url, 400)
+ # to next check illegal new_todo values, we need an actual Process
+ self.post_process(1)
+ # check illegal new_todo values
+ post: dict[str, object]
+ post = {'make_type': '', 'day_comment': '', 'new_todo': ['foo']}
+ self.check_post(post, url, 400)
+ post['new_todo'] = [1, 2] # no Process of .id_=2 exists
+ # to next check illegal old_todo inputs, we need to first post Todo
+ post['new_todo'] = [1]
+ self.check_post(post, url, 302, '/day?date=2024-01-01&make_type=')
+ # check illegal old_todo inputs (equal list lengths though)
+ post = {'make_type': '', 'day_comment': '', 'comment': ['foo'],
+ 'effort': [3.3], 'done': [], 'todo_id': [1]}
+ self.check_post(post, url, 302, '/day?date=2024-01-01&make_type=')
+ post['todo_id'] = [2] # reference to non-existant Process
+ self.check_post(post, url, 404)
+ post['todo_id'] = ['a']
+ self.check_post(post, url, 400)
+ post['todo_id'] = [1]
+ post['done'] = ['foo']
+ self.check_post(post, url, 400)
+ post['done'] = [2] # reference to non-posted todo_id
+ self.check_post(post, url, 400)
+ post['done'] = []
+ post['effort'] = ['foo']
+ self.check_post(post, url, 400)
+ post['effort'] = [None]
+ self.check_post(post, url, 400)
+ post['effort'] = [3.3]
+ # check illegal old_todo inputs: unequal list lengths
+ post['comment'] = []
+ self.check_post(post, url, 400)
+ post['comment'] = ['foo', 'foo']
+ self.check_post(post, url, 400)
+ post['comment'] = ['foo']
+ post['effort'] = []
+ self.check_post(post, url, 400)
+ post['effort'] = [3.3, 3.3]
+ self.check_post(post, url, 400)
+ post['effort'] = [3.3]
+ post['todo_id'] = [1, 1]
+ self.check_post(post, url, 400)
+ post['todo_id'] = [1]
+ # # check valid POST payload on bad paths
+ self.check_post(post, '/day', 400)
+ self.check_post(post, '/day?date=', 400)
+ self.check_post(post, '/day?date=foo', 400)
+
+ def test_basic_POST_day(self) -> None:
+ """Test basic (no Todos) POST /day.
+
+ Check POST (& GET!) requests properly parse 'today', 'tomorrow',
+ 'yesterday', and actual date strings;
+ preserve 'make_type' setting in redirect even if nonsensical;
+ and store 'day_comment'
+ """
+ for name, dist, test_str in [('2024-01-01', None, 'a'),
+ ('today', 0, 'b'),
+ ('yesterday', -1, 'c'),
+ ('tomorrow', +1, 'd')]:
+ date = name if dist is None else date_in_n_days(dist)
+ post = {'day_comment': test_str, 'make_type': f'x:{test_str}'}
+ post_url = f'/day?date={name}'
+ redir_url = f'{post_url}&make_type={post["make_type"]}'
+ self.check_post(post, post_url, 302, redir_url)
+ expected = self.GET_day_dict(date)
+ assert isinstance(expected['_library'], dict)
+ expected['_library']['Day'][date]['comment'] = test_str
+ self.check_json_get(post_url, expected)
+
+ def test_GET_day_with_processes_and_todos(self) -> None:
+ """Test GET /day displaying Processes and Todos (no trees)."""
+ date = '2024-01-01'
+ # check Processes get displayed in ['processes'] and ['_library']
+ 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)
+ expected = self.GET_day_dict(date)
+ assert isinstance(expected['_library'], dict)
+ expected['processes'] = self.as_id_list(procs_expected)
+ expected['_library']['Process'] = self.as_refs(procs_expected)
+ self._post_day(f'date={date}')
+ self.check_json_get(f'/day?date={date}', expected)
+ # post Todos of either process and check their display
+ post_day: dict[str, object]
+ post_day = {'day_comment': '', 'make_type': '', 'new_todo': [1, 2]}
+ todos = [self._todo_as_dict(1, 1, date),
+ self._todo_as_dict(2, 2, date)]
+ expected['_library']['Todo'] = self.as_refs(todos)
+ expected['_library']['Day'][date]['todos'] = self.as_id_list(todos)
+ nodes = [self._todo_node_as_dict(1), self._todo_node_as_dict(2)]
+ expected['top_nodes'] = nodes
+ self._post_day(f'date={date}', post_day)
+ self.check_json_get(f'/day?date={date}', expected)
+ # add a comment to one Todo and set the other's doneness and effort
+ post_day = {'day_comment': '', 'make_type': '', 'new_todo': [],
+ 'todo_id': [1, 2], 'done': [2], 'comment': ['FOO', ''],
+ 'effort': [2.3, '']}
+ expected['_library']['Todo']['1']['comment'] = 'FOO'
+ expected['_library']['Todo']['1']['effort'] = 2.3
+ expected['_library']['Todo']['2']['is_done'] = True
+ self._post_day(f'date={date}', post_day)