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