diff --git a/AKModel/fixtures/model.json b/AKModel/fixtures/model.json index b75d5093156cead8c107d0493b64ac4515fe641b..b5bdcf01084502a30fce82ccb79d90cc83f46ca8 100644 --- a/AKModel/fixtures/model.json +++ b/AKModel/fixtures/model.json @@ -523,6 +523,19 @@ "updated": "2021-05-04T10:30:59.528Z" } }, +{ + "model": "AKModel.akslot", + "pk": 5, + "fields": { + "ak": 1, + "room": null, + "start": null, + "duration": "2.00", + "fixed": false, + "event": 2, + "updated": "2022-12-02T12:23:11.856Z" + } +}, { "model": "AKModel.constraintviolation", "pk": 1, diff --git a/AKModel/tests.py b/AKModel/tests.py index 2b76348e280a05169f7ba263b9e47223cce92f3c..106de0979c99432f1589ab5be16909fc8d70247d 100644 --- a/AKModel/tests.py +++ b/AKModel/tests.py @@ -1,4 +1,8 @@ +from typing import List + 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 @@ -38,6 +42,20 @@ class BasicViewTests: url = reverse_lazy(view_name_with_prefix, kwargs=view_name[1]) return view_name_with_prefix, url + def _assert_message(self, response, expected_message, msg_prefix=""): + messages:List[Message] = list(get_messages(response.wsgi_request)) + + msg_count = "No message shown to user" + msg_content = "Wrong message, expected '{expected_message}'" + if msg_prefix != "": + msg_count = f"{msg_prefix}: {msg_count}" + msg_content = f"{msg_prefix}: {msg_content}" + + # Check that the last message correctly reports the issue + # (there might be more messages from previous calls that were not already rendered) + self.assertGreater(len(messages), 0, msg=msg_count) + self.assertEqual(messages[-1].message, expected_message, msg=msg_content) + def test_views_for_200(self): for view_name in self.VIEWS: view_name_with_prefix, url = self._name_and_url(view_name) diff --git a/AKSubmission/tests.py b/AKSubmission/tests.py index a39b155ac3ee946fb97efafe6ecbb42f571cd7ad..de0ede7e14060bf0511be644fdf8dc650a26544a 100644 --- a/AKSubmission/tests.py +++ b/AKSubmission/tests.py @@ -1 +1,126 @@ -# Create your tests here. +from django.test import TestCase +from django.urls import reverse_lazy + +from AKModel.models import AK, AKSlot +from AKModel.tests import BasicViewTests + + +class ModelViewTests(BasicViewTests, TestCase): + fixtures = ['model.json'] + + VIEWS = [ + ('submission_overview', {'event_slug': 'kif42'}), + ('ak_detail', {'event_slug': 'kif42', 'pk': 1}), + ('ak_history', {'event_slug': 'kif42', 'pk': 1}), + ('ak_edit', {'event_slug': 'kif42', 'pk': 1}), + ('akslot_add', {'event_slug': 'kif42', 'pk': 1}), + ('akmessage_add', {'event_slug': 'kif42', 'pk': 1}), + ('akslot_edit', {'event_slug': 'kif42', 'pk': 5}), + ('akslot_delete', {'event_slug': 'kif42', 'pk': 5}), + ('ak_list', {'event_slug': 'kif42'}), + ('ak_list_by_category', {'event_slug': 'kif42', 'category_pk': 4}), + ('ak_list_by_track', {'event_slug': 'kif42', 'track_pk': 1}), + ('akowner_create', {'event_slug': 'kif42'}), + ('akowner_edit', {'event_slug': 'kif42', 'slug': 'a'}), + ('submit_ak', {'event_slug': 'kif42', 'owner_slug': 'a'}), + ('submit_ak_wish', {'event_slug': 'kif42'}), + ('error_not_configured', {'event_slug': 'kif42'}), + ] + + APP_NAME = 'submit' + + def test_akslot_edit_delete_prevention(self): + """ + Slots planned already may not be modified or deleted in front end + """ + self.client.logout() + + view_name_with_prefix, url = self._name_and_url(('akslot_edit', {'event_slug': 'kif42', 'pk': 1})) + response = self.client.get(url) + self.assertEqual(response.status_code, 302, + msg=f"AK Slot editing ({url}) possible even though slot was already scheduled") + self._assert_message(response, "You cannot edit a slot that has already been scheduled") + + view_name_with_prefix, url = self._name_and_url(('akslot_delete', {'event_slug': 'kif42', 'pk': 1})) + response = self.client.get(url) + self.assertEqual(response.status_code, 302, + msg=f"AK Slot deletion ({url}) possible even though slot was already scheduled") + self._assert_message(response, "You cannot delete a slot that has already been scheduled") + + def test_slot_creation_deletion(self): + ak_args = {'event_slug': 'kif42', 'pk': 1} + redirect_url = reverse_lazy(f"{self.APP_NAME}:ak_detail", kwargs=ak_args) + + count_slots = AK.objects.get(pk=1).akslot_set.count() + + create_url = reverse_lazy(f"{self.APP_NAME}:akslot_add", kwargs=ak_args) + response = self.client.post(create_url, {'ak': 1, 'event': 2, 'duration': 1.5}) + self.assertRedirects(response, redirect_url, status_code=302, target_status_code=200, + msg_prefix="Did not correctly trigger redirect") + self.assertEqual(AK.objects.get(pk=1).akslot_set.count(), count_slots + 1, + msg="New slot was not correctly saved") + + # Get primary key of newly created Slot + slot_pk = AK.objects.get(pk=1).akslot_set.order_by('pk').last().pk + + edit_url = reverse_lazy(f"{self.APP_NAME}:akslot_edit", kwargs={'event_slug': 'kif42', 'pk': slot_pk}) + response = self.client.get(edit_url) + self.assertEqual(response.status_code, 200, msg=f"Cant open edit view for newly created slot ({edit_url})") + response = self.client.post(edit_url, {'ak': 1, 'event': 2, 'duration': 2}) + self.assertRedirects(response, redirect_url, status_code=302, target_status_code=200, + msg_prefix="Did not correctly trigger redirect") + self.assertEqual(AKSlot.objects.get(pk=slot_pk).duration, 2, + msg="Slot was not correctly changed") + + deletion_url = reverse_lazy(f"{self.APP_NAME}:akslot_delete", kwargs={'event_slug': 'kif42', 'pk': slot_pk}) + response = self.client.get(deletion_url) + self.assertEqual(response.status_code, 200, + msg="Cant open deletion view for newly created slot ({deletion_url})") + response = self.client.post(deletion_url, {}) + self.assertRedirects(response, redirect_url, status_code=302, target_status_code=200, + msg_prefix="Did not correctly trigger redirect") + self.assertFalse(AKSlot.objects.filter(pk=slot_pk).exists(), msg="Slot was not correctly deleted") + self.assertEqual(AK.objects.get(pk=1).akslot_set.count(), count_slots, msg="AK still has to many slots") + + def test_ak_owner_editing(self): + # Test editing of new user + edit_url = reverse_lazy(f"{self.APP_NAME}:akowner_edit_dispatch", kwargs={'event_slug': 'kif42'}) + + base_url = reverse_lazy(f"{self.APP_NAME}:submission_overview", kwargs={'event_slug': 'kif42'}) + response = self.client.post(edit_url, {'owner_id': -1}) + self.assertRedirects(response, base_url, status_code=302, target_status_code=200, + msg_prefix="Did not redirect to start page even though no user was selected") + self._assert_message(response, "No user selected") + + edit_redirect_url = reverse_lazy(f"{self.APP_NAME}:akowner_edit", kwargs={'event_slug': 'kif42', 'slug': 'a'}) + response = self.client.post(edit_url, {'owner_id': 1}) + self.assertRedirects(response, edit_redirect_url, status_code=302, target_status_code=200, + msg_prefix=f"Dispatch redirect failed (should go to {edit_redirect_url})") + + def test_ak_owner_selection(self): + select_url = reverse_lazy(f"{self.APP_NAME}:akowner_select", kwargs={'event_slug': 'kif42'}) + + create_url = reverse_lazy(f"{self.APP_NAME}:akowner_create", kwargs={'event_slug': 'kif42'}) + response = self.client.post(select_url, {'owner_id': -1}) + self.assertRedirects(response, create_url, status_code=302, target_status_code=200, + msg_prefix="Did not redirect to user create view even though no user was specified") + + add_redirect_url = reverse_lazy(f"{self.APP_NAME}:submit_ak", kwargs={'event_slug': 'kif42', 'owner_slug': 'a'}) + response = self.client.post(select_url, {'owner_id': 1}) + self.assertRedirects(response, add_redirect_url, status_code=302, target_status_code=200, + msg_prefix=f"Dispatch redirect to ak submission page failed (should go to {add_redirect_url})") + + def test_orga_message_submission(self): + form_url = reverse_lazy(f"{self.APP_NAME}:akmessage_add", kwargs={'event_slug': 'kif42', 'pk': 1}) + detail_url = reverse_lazy(f"{self.APP_NAME}:ak_detail", kwargs={'event_slug': 'kif42', 'pk': 1}) + + count_messages = AK.objects.get(pk=1).akorgamessage_set.count() + + response = self.client.get(form_url) + self.assertEqual(response.status_code, 200, msg="Could not load message form view") + response = self.client.post(form_url, {'ak': 1, 'event': 2, 'text': 'Test message text'}) + self.assertRedirects(response, detail_url, status_code=302, target_status_code=200, + msg_prefix=f"Did not trigger redirect to ak detail page ({detail_url})") + self._assert_message(response, "Message to organizers successfully saved") + self.assertEqual(AK.objects.get(pk=1).akorgamessage_set.count(), count_messages + 1, + msg="Message was not correctly saved")