From 2ce0400ad8e23d9ba649795f54c7eb679baa5d2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?= <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de> Date: Wed, 4 Jan 2023 17:41:10 +0100 Subject: [PATCH] Add further tests to check sending of forms with little overhead --- AKModel/tests.py | 61 +++++++++++++++++++++++++++++++++++++++++-- AKSubmission/tests.py | 9 +++++++ 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/AKModel/tests.py b/AKModel/tests.py index 4249d73b..79b666b3 100644 --- a/AKModel/tests.py +++ b/AKModel/tests.py @@ -5,7 +5,7 @@ from django.contrib.auth.models import User from django.contrib.messages import get_messages from django.contrib.messages.storage.base import Message from django.test import TestCase -from django.urls import reverse_lazy +from django.urls import reverse_lazy, reverse from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKRequirement, AK, Room, AKSlot, AKOrgaMessage, \ ConstraintViolation, DefaultSlot @@ -15,6 +15,7 @@ class BasicViewTests: VIEWS = [] APP_NAME = '' VIEWS_STAFF_ONLY = [] + EDIT_TESTCASES = [] def setUp(self): self.staff_user = User.objects.create( @@ -40,7 +41,7 @@ class BasicViewTests: :rtype: str, str """ view_name_with_prefix = f"{self.APP_NAME}:{view_name[0]}" if self.APP_NAME != "" else view_name[0] - url = reverse_lazy(view_name_with_prefix, kwargs=view_name[1]) + url = reverse(view_name_with_prefix, kwargs=view_name[1]) return view_name_with_prefix, url def _assert_message(self, response, expected_message, msg_prefix=""): @@ -90,6 +91,58 @@ class BasicViewTests: self.assertEqual(response.status_code, 302, msg=f"{view_name_with_prefix} ({url}) still accessible for deactivated user") + def _to_sendable_value(self, v): + """ + Create representation sendable via POST from form data + + :param v: value to prepare + :type v: any + :return: prepared value (normally either raw value or primary key of complex object) + """ + if type(v) == list: + return [e.pk for e in v] + if type(v) == "RelatedManager": + return [e.pk for e in v.all()] + return v + + def test_submit_edit_form(self): + """ + Test edit forms in the most simple way (sending them again unchanged) + """ + for testcase in self.EDIT_TESTCASES: + self._test_submit_edit_form(testcase) + + def _test_submit_edit_form(self, testcase): + name, url = self._name_and_url((testcase["view"], testcase["kwargs"])) + form_name = testcase.get("form_name", "form") + expected_code = testcase.get("expected_code", 302) + if "target_view" in testcase.keys(): + kwargs = testcase.get("target_kwargs", testcase["kwargs"]) + _, target_url = self._name_and_url((testcase["target_view"], kwargs)) + else: + target_url = url + expected_message = testcase.get("expected_message", "") + admin_user = testcase.get("admin", False) + + if admin_user: + self.client.force_login(self.admin_user) + else: + self.client.logout() + + response = self.client.get(url) + self.assertEqual(response.status_code, 200, msg=f"{name}: Could not load edit form via GET ({url})") + + form = response.context[form_name] + data = {k:self._to_sendable_value(v) for k,v in form.initial.items()} + + response = self.client.post(url, data=data) + if expected_code == 200: + self.assertEqual(response.status_code, 200, msg=f"{name}: Did not return 200 ({url}") + elif expected_code == 302: + self.assertRedirects(response, target_url, msg_prefix=f"{name}: Did not redirect ({url} -> {target_url}") + if expected_message != "": + self._assert_message(response, expected_message, msg_prefix=f"{name}") + class ModelViewTests(BasicViewTests, TestCase): fixtures = ['model.json'] @@ -114,6 +167,10 @@ class ModelViewTests(BasicViewTests, TestCase): ('admin:new_event_wizard_start', {}), ] + EDIT_TESTCASES = [ + {'view': 'admin:default-slots-editor', 'kwargs': {'event_slug': 'kif42'}, "admin": True}, + ] + def test_admin(self): self.client.force_login(self.admin_user) for model in self.ADMIN_MODELS: diff --git a/AKSubmission/tests.py b/AKSubmission/tests.py index fe474aad..54ff20a0 100644 --- a/AKSubmission/tests.py +++ b/AKSubmission/tests.py @@ -32,6 +32,15 @@ class ModelViewTests(BasicViewTests, TestCase): APP_NAME = 'submit' + EDIT_TESTCASES = [ + {'view': 'ak_edit', 'target_view': 'ak_detail', 'kwargs': {'event_slug': 'kif42', 'pk': 1}, + 'expected_message': "AK successfully updated"}, + {'view': 'akslot_edit', 'target_view': 'ak_detail', 'kwargs': {'event_slug': 'kif42', 'pk': 5}, + 'target_kwargs': {'event_slug': 'kif42', 'pk': 1}, 'expected_message': "AK Slot successfully updated"}, + {'view': 'akowner_edit', 'target_view': 'submission_overview', 'kwargs': {'event_slug': 'kif42', 'slug': 'a'}, + 'target_kwargs': {'event_slug': 'kif42'}, 'expected_message': "Person Info successfully updated"}, + ] + def test_akslot_edit_delete_prevention(self): """ Slots planned already may not be modified or deleted in front end -- GitLab