From 57364f285cc2d26f3f3984f0d71e76af4e79e3d3 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Fri, 21 Jun 2024 23:31:35 +0200 Subject: [PATCH] Greatly expand GET /calendar tests. --- tests/days.py | 135 +++++++++++++++++++++++++++++++------------------- 1 file changed, 85 insertions(+), 50 deletions(-) diff --git a/tests/days.py b/tests/days.py index 396fe05..8e3768c 100644 --- a/tests/days.py +++ b/tests/days.py @@ -79,16 +79,43 @@ class TestsWithDB(TestCaseWithDB): class TestsWithServer(TestCaseWithServer): """Tests against our HTTP server/handler (and database).""" + @classmethod + def GET_day_dict(cls, date: str) -> dict[str, object]: + """Return JSON of GET /day to expect.""" + # day: dict[str, object] = {'id': date, 'comment': '', 'todos': []} + day = cls._day_as_dict(date) + d: dict[str, object] = {'day': date, + 'top_nodes': [], + 'make_type': '', + 'enablers_for': {}, + 'disablers_for': {}, + 'conditions_present': [], + 'processes': [], + '_library': {'Day': cls.as_refs([day])}} + return d + + @classmethod + def GET_calendar_dict(cls, start: int, end: int) -> dict[str, object]: + """Return JSON of GET /calendar to expect.""" + today_date = date_in_n_days(0) + start_date = date_in_n_days(start) + end_date = date_in_n_days(end) + dates = [date_in_n_days(i) for i in range(start, end+1)] + days = [cls._day_as_dict(d) for d in dates] + library = {'Day': cls.as_refs(days)} if len(days) > 0 else {} + return {'today': today_date, 'start': start_date, 'end': end_date, + 'days': dates, '_library': library} + @staticmethod - def todo_as_dict(id_: int = 1, - process_id: int = 1, - date: str = '2024-01-01', - conditions: None | list[int] = None, - disables: None | list[int] = None, - blockers: None | list[int] = None, - enables: None | list[int] = None - ) -> dict[str, object]: - """Return JSON of Process to expect.""" + def _todo_as_dict(id_: int = 1, + process_id: int = 1, + date: str = '2024-01-01', + conditions: None | list[int] = None, + disables: None | list[int] = None, + blockers: None | list[int] = None, + enables: None | list[int] = None + ) -> dict[str, object]: + """Return JSON of Todo to expect.""" # pylint: disable=too-many-arguments d = {'id': id_, 'date': date, @@ -110,32 +137,9 @@ class TestsWithServer(TestCaseWithServer): """Return JSON of TodoNode to expect.""" return {'children': [], 'seen': False, 'todo': todo_id} - @classmethod - def GET_day_dict(cls, date: str) -> dict[str, object]: - """Return JSON of GET /day to expect.""" - day: dict[str, object] = {'id': date, 'comment': '', 'todos': []} - d: dict[str, object] = {'day': date, - 'top_nodes': [], - 'make_type': '', - 'enablers_for': {}, - 'disablers_for': {}, - 'conditions_present': [], - 'processes': [], - '_library': {'Day': cls.as_refs([day])}} - return d - - def _post_day(self, params: str = '', - form_data: None | dict[str, object] = None, - redir_to: str = '', - status: int = 302, - ) -> None: - """POST /day?{params} with form_data.""" - if not form_data: - form_data = {'day_comment': '', 'make_type': ''} - target = f'/day?{params}' - if not redir_to: - redir_to = f'{target}&make_type={form_data["make_type"]}' - self.check_post(form_data, target, status, redir_to) + @staticmethod + def _day_as_dict(date: str) -> dict[str, object]: + return {'id': date, 'comment': '', 'todos': []} @staticmethod def _post_batch(list_of_args: list[list[object]], @@ -158,21 +162,24 @@ class TestsWithServer(TestCaseWithServer): f_to_post(expected['id'], post) return expecteds - def test_do_GET_calendar(self) -> None: - """Test /calendar response codes, and / redirect.""" - self.check_get('/calendar', 200) - self.check_get('/calendar?start=&end=', 200) - self.check_get('/calendar?start=today&end=today', 200) - self.check_get('/calendar?start=2024-01-01&end=2025-01-01', 200) - self.check_get('/calendar?start=foo', 400) - - def test_fail_GET_day(self) -> None: - """Test malformed/illegal GET /day requests.""" - self.check_get('/day?date=foo', 400) - self.check_get('/day?date=2024-02-30', 400) + def _post_day(self, params: str = '', + form_data: None | dict[str, object] = None, + redir_to: str = '', + status: int = 302, + ) -> None: + """POST /day?{params} with form_data.""" + if not form_data: + form_data = {'day_comment': '', 'make_type': ''} + target = f'/day?{params}' + if not redir_to: + redir_to = f'{target}&make_type={form_data["make_type"]}' + self.check_post(form_data, target, status, redir_to) def test_basic_GET_day(self) -> None: """Test basic (no Processes/Conditions/Todos) GET /day basics.""" + # check illegal date parameters + self.check_get('/day?date=foo', 400) + self.check_get('/day?date=2024-02-30', 400) # check undefined day date = date_in_n_days(0) expected = self.GET_day_dict(date) @@ -285,7 +292,8 @@ class TestsWithServer(TestCaseWithServer): # 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)] + 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)] @@ -327,8 +335,8 @@ class TestsWithServer(TestCaseWithServer): # add Todos in relation to Conditions, check consequences post_day: dict[str, object] post_day = {'day_comment': '', 'make_type': '', 'new_todo': [1, 2]} - todos = [self.todo_as_dict(1, 1, date, [1], [1], [2], [2]), - self.todo_as_dict(2, 2, date, [2], [2], [1], [1])] + todos = [self._todo_as_dict(1, 1, date, [1], [1], [2], [2]), + self._todo_as_dict(2, 2, date, [2], [2], [1], [1])] 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)] @@ -338,3 +346,30 @@ class TestsWithServer(TestCaseWithServer): expected['conditions_present'] = self.as_id_list(conds_expected) self._post_day(f'date={date}', post_day) self.check_json_get(f'/day?date={date}', expected) + + def test_GET_calendar(self) -> None: + """Test GET /calendar responses based on various inputs, DB states.""" + # check illegal date range delimiters + self.check_get('/calendar?start=foo', 400) + self.check_get('/calendar?end=foo', 400) + # check default range without saved days + expected = self.GET_calendar_dict(-1, 366) + self.check_json_get('/calendar', expected) + self.check_json_get('/calendar?start=&end=', expected) + # check named days as delimiters + expected = self.GET_calendar_dict(-1, +1) + self.check_json_get('/calendar?start=yesterday&end=tomorrow', expected) + # check zero-element range + expected = self.GET_calendar_dict(+1, 0) + self.check_json_get('/calendar?start=tomorrow&end=today', expected) + # check saved day shows up in results with proven by its comment + post_day: dict[str, object] = {'day_comment': 'foo', 'make_type': ''} + date1 = date_in_n_days(-2) + self._post_day(f'date={date1}', post_day) + start_date = date_in_n_days(-5) + end_date = date_in_n_days(+5) + url = f'/calendar?start={start_date}&end={end_date}' + expected = self.GET_calendar_dict(-5, +5) + assert isinstance(expected['_library'], dict) + expected['_library']['Day'][date1]['comment'] = post_day['day_comment'] + self.check_json_get(url, expected) -- 2.30.2