From 49827e4ad476ced8feb0f4da095706ff95562583 Mon Sep 17 00:00:00 2001 From: Radomir Mijovic Date: Fri, 21 Mar 2025 14:54:48 +0000 Subject: [PATCH 1/3] test: add test for api/events --- lego/apps/events/tests/test_events_api.py | 70 +++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/lego/apps/events/tests/test_events_api.py b/lego/apps/events/tests/test_events_api.py index 5e2d3c675..f37323286 100644 --- a/lego/apps/events/tests/test_events_api.py +++ b/lego/apps/events/tests/test_events_api.py @@ -226,6 +226,14 @@ }, ] +_test_payload_error_messages = { + "required_field": "This field is required.", + "not_blank_field": "This field may not be blank.", + "not_null_field": "This field may not be null.", + "valid_choice": "is not valid choice.", + "wrong_format": "Datetime has wrong format.", +} + _test_registration_data = {"user": 1} webhook_secret = getattr(settings, "STRIPE_WEBHOOK_SECRET", None) @@ -509,6 +517,15 @@ class CreateEventsTestCase(BaseAPITestCase): "test_users.yaml", "test_events.yaml", ] + PAYLOAD_FIELDS = [ + "title", + "description", + "text", + "event_type", + "location", + "start_time", + "end_time", + ] def setUp(self): self.abakus_user = User.objects.all().first() @@ -518,6 +535,59 @@ def setUp(self): self.assertEqual(self.event_response.status_code, status.HTTP_201_CREATED) self.event_id = self.event_response.json().pop("id", None) + def test_fields_required_on_create(self) -> None: + response = self.client.post(_get_list_url(), {}) + for field in self.PAYLOAD_FIELDS: + self.assertEqual( + response.data.get(field)[0], _test_payload_error_messages["required_field"] + ) + def test_fields_required_on_update(self) -> None: + response = self.client.put(_get_detail_url(self.event_id), {}) + for field in self.PAYLOAD_FIELDS: + self.assertEqual( + response.data.get(field)[0], _test_payload_error_messages["required_field"] + ) + + def test_empty_fields_in_payload( + self, test_data = [ + {"method": "post", "is_detail": False}, + {"method": "put", "is_detail": True}, + + ] + ) -> None: + _nul_fields = [ "title", "text" , "location"] + _date_fields = ["start_time", "end_time"] + + for data in test_data: + with self.subTest(): + url = _get_detail_url(self.event_id) if data["is_detail"] else _get_list_url() + response = getattr(self.client, data["method"])( + url, + { + "title": "", + "desciption": "", + "text": "", + "event_type": "", + "location": "", + "start_time": "", + "end_time": "", + } + ) + for field in _nul_fields: + self.assertEqual( + response.data.get(field)[0], + _test_payload_error_messages["not_blank_field"] + ) + for field in _date_fields: + self.assertIn( + _test_payload_error_messages["wrong_format"], + response.data.get(field)[0], + ) + self.assertEqual( + response.data.get("description")[0], + _test_payload_error_messages["required_field"] + ) + def test_event_creation(self): """Test event creation with pools""" self.assertIsNotNone(self.event_id) From 6c1c818bfe2d0c385c4eec41058b831b0919716d Mon Sep 17 00:00:00 2001 From: Radomir Mijovic Date: Fri, 21 Mar 2025 15:10:57 +0000 Subject: [PATCH 2/3] style: applied black, isort and flake8 --- lego/apps/events/tests/test_events_api.py | 28 ++++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lego/apps/events/tests/test_events_api.py b/lego/apps/events/tests/test_events_api.py index f37323286..a2b252696 100644 --- a/lego/apps/events/tests/test_events_api.py +++ b/lego/apps/events/tests/test_events_api.py @@ -539,28 +539,34 @@ def test_fields_required_on_create(self) -> None: response = self.client.post(_get_list_url(), {}) for field in self.PAYLOAD_FIELDS: self.assertEqual( - response.data.get(field)[0], _test_payload_error_messages["required_field"] + response.data.get(field)[0], + _test_payload_error_messages["required_field"], ) + def test_fields_required_on_update(self) -> None: response = self.client.put(_get_detail_url(self.event_id), {}) for field in self.PAYLOAD_FIELDS: self.assertEqual( - response.data.get(field)[0], _test_payload_error_messages["required_field"] + response.data.get(field)[0], + _test_payload_error_messages["required_field"], ) - def test_empty_fields_in_payload( - self, test_data = [ + def test_empty_fields_in_payload(self) -> None: + test_data = [ {"method": "post", "is_detail": False}, {"method": "put", "is_detail": True}, - ] - ) -> None: - _nul_fields = [ "title", "text" , "location"] + + _nul_fields = ["title", "text", "location"] _date_fields = ["start_time", "end_time"] for data in test_data: with self.subTest(): - url = _get_detail_url(self.event_id) if data["is_detail"] else _get_list_url() + url = ( + _get_detail_url(self.event_id) + if data["is_detail"] + else _get_list_url() + ) response = getattr(self.client, data["method"])( url, { @@ -571,12 +577,12 @@ def test_empty_fields_in_payload( "location": "", "start_time": "", "end_time": "", - } + }, ) for field in _nul_fields: self.assertEqual( response.data.get(field)[0], - _test_payload_error_messages["not_blank_field"] + _test_payload_error_messages["not_blank_field"], ) for field in _date_fields: self.assertIn( @@ -585,7 +591,7 @@ def test_empty_fields_in_payload( ) self.assertEqual( response.data.get("description")[0], - _test_payload_error_messages["required_field"] + _test_payload_error_messages["required_field"], ) def test_event_creation(self): From 75ec06f882fadab28538e093cf34d9db30600381 Mon Sep 17 00:00:00 2001 From: Radomir Mijovic Date: Fri, 21 Mar 2025 15:20:03 +0000 Subject: [PATCH 3/3] Well-defined list of required fields for better test structure --- lego/apps/events/tests/test_events_api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lego/apps/events/tests/test_events_api.py b/lego/apps/events/tests/test_events_api.py index a2b252696..3d2655fa9 100644 --- a/lego/apps/events/tests/test_events_api.py +++ b/lego/apps/events/tests/test_events_api.py @@ -1,3 +1,4 @@ +import typing from copy import deepcopy from datetime import timedelta from unittest import mock, skipIf @@ -517,7 +518,7 @@ class CreateEventsTestCase(BaseAPITestCase): "test_users.yaml", "test_events.yaml", ] - PAYLOAD_FIELDS = [ + PAYLOAD_FIELDS: typing.ClassVar[list[str]] = [ "title", "description", "text",