From 7b07ce6501c68546862af2cc22052d2e8fed2a69 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 2 May 2021 18:23:40 +0200
Subject: [PATCH 1/3] Implement three basic testcases for AKDashboard

---
 AKDashboard/tests.py | 53 +++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 52 insertions(+), 1 deletion(-)

diff --git a/AKDashboard/tests.py b/AKDashboard/tests.py
index a39b155a..7d695f03 100644
--- a/AKDashboard/tests.py
+++ b/AKDashboard/tests.py
@@ -1 +1,52 @@
-# Create your tests here.
+import pytz
+from django.test import TestCase
+from django.urls import reverse
+from django.utils.timezone import now
+
+from AKModel.models import Event, AK, AKCategory
+
+
+class DashboardTests(TestCase):
+    @classmethod
+    def setUpTestData(cls):
+        super().setUpTestData()
+        cls.event = Event.objects.create(
+            name="Test Event",
+            slug="test",
+            timezone=pytz.utc,
+            start=now(),
+            end=now(),
+            active=True,
+        )
+        cls.default_category = AKCategory.objects.create(
+            name="Test Category",
+            event=cls.event,
+        )
+
+    def test_dashboard_view(self):
+        url = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, 200)
+
+    def test_nonexistent_dashboard_view(self):
+        url = reverse('dashboard:dashboard_event', kwargs={"slug": "nonexistent-event"})
+        response = self.client.get(url)
+        self.assertEqual(response.status_code, 404)
+
+    def test_history(self):
+        url = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+
+        # History should be empty
+        response = self.client.get(url)
+        self.assertQuerysetEqual(response.context["recent_changes"], [])
+
+        AK.objects.create(
+            name="Test AK",
+            category=self.default_category,
+            event=self.event,
+        )
+
+        # History should now contain one AK (Test AK)
+        response = self.client.get(url)
+        self.assertEqual(len(response.context["recent_changes"]), 1)
+        self.assertEqual(response.context["recent_changes"][0]['text'], "New AK: Test AK.")
-- 
GitLab


From 0041dbc7dd087314634eb0145f0f285656d4ff5a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Sun, 2 May 2021 18:30:11 +0200
Subject: [PATCH 2/3] Adapt CI pipeline for automated tests

---
 .gitlab-ci.yml            | 2 +-
 AKPlanning/settings_ci.py | 5 ++++-
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 219f6834..5be29911 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -24,4 +24,4 @@ before_script:
 test:
   script:
     - source venv/bin/activate
-    - python manage.py test --settings AKPlanning.settings_ci
+    - python manage.py test --settings AKPlanning.settings_ci --keepdb
diff --git a/AKPlanning/settings_ci.py b/AKPlanning/settings_ci.py
index 6c098569..84a135c5 100644
--- a/AKPlanning/settings_ci.py
+++ b/AKPlanning/settings_ci.py
@@ -16,6 +16,9 @@ DATABASES = {
         'PASSWORD': 'mysql',
         'OPTIONS': {
             'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"
-        }
+        },
+        'TEST' : {
+            'NAME': 'test',
+        },
     }
 }
-- 
GitLab


From 8b83f47b9e1e5a8a6ccd439eab53748b289b6564 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Benjamin=20H=C3=A4ttasch?=
 <benjamin.haettasch@fachschaft.informatik.tu-darmstadt.de>
Date: Tue, 4 May 2021 11:53:48 +0200
Subject: [PATCH 3/3] Add further dashboard tests (and improve existing ones)

---
 AKDashboard/tests.py | 82 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 79 insertions(+), 3 deletions(-)

diff --git a/AKDashboard/tests.py b/AKDashboard/tests.py
index 7d695f03..f4fbff87 100644
--- a/AKDashboard/tests.py
+++ b/AKDashboard/tests.py
@@ -1,8 +1,10 @@
 import pytz
-from django.test import TestCase
+from django.apps import apps
+from django.test import TestCase, override_settings
 from django.urls import reverse
 from django.utils.timezone import now
 
+from AKDashboard.models import DashboardButton
 from AKModel.models import Event, AK, AKCategory
 
 
@@ -11,12 +13,13 @@ class DashboardTests(TestCase):
     def setUpTestData(cls):
         super().setUpTestData()
         cls.event = Event.objects.create(
-            name="Test Event",
-            slug="test",
+            name="Dashboard Test Event",
+            slug="dashboardtest",
             timezone=pytz.utc,
             start=now(),
             end=now(),
             active=True,
+            plan_hidden=False,
         )
         cls.default_category = AKCategory.objects.create(
             name="Test Category",
@@ -33,6 +36,7 @@ class DashboardTests(TestCase):
         response = self.client.get(url)
         self.assertEqual(response.status_code, 404)
 
+    @override_settings(DASHBOARD_SHOW_RECENT=True)
     def test_history(self):
         url = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
 
@@ -50,3 +54,75 @@ class DashboardTests(TestCase):
         response = self.client.get(url)
         self.assertEqual(len(response.context["recent_changes"]), 1)
         self.assertEqual(response.context["recent_changes"][0]['text'], "New AK: Test AK.")
+
+    def test_public(self):
+        url_dashboard_index = reverse('dashboard:dashboard')
+        url_event_dashboard = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+
+        # Non-Public event (should not be part of the global dashboard
+        # but should have an individual dashboard page for those knowing the url)
+        self.event.public = False
+        self.event.save()
+        response = self.client.get(url_dashboard_index)
+        print(response)
+        self.assertEqual(response.status_code, 200)
+        self.assertFalse(self.event in response.context["events"])
+        response = self.client.get(url_event_dashboard)
+        self.assertEqual(response.status_code, 200)
+        self.assertEqual(response.context["event"], self.event)
+
+        # Public event -- should be part of the global dashboard
+        self.event.public = True
+        self.event.save()
+        response = self.client.get(url_dashboard_index)
+        self.assertEqual(response.status_code, 200)
+        self.assertTrue(self.event in response.context["events"])
+
+    def test_active(self):
+        url_event_dashboard = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+
+        if apps.is_installed('AKSubmission'):
+            # Non-active event -> No submission
+            self.event.active = False
+            self.event.save()
+            response = self.client.get(url_event_dashboard)
+            self.assertNotContains(response, "AK Submission")
+
+            # Active event -> Submission should be open
+            self.event.active = True
+            self.event.save()
+            response = self.client.get(url_event_dashboard)
+            self.assertContains(response, "AK Submission")
+
+    def test_plan_hidden(self):
+        url_event_dashboard = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+
+        if apps.is_installed('AKPlan'):
+            # Plan hidden? No buttons should show up
+            self.event.plan_hidden = True
+            self.event.save()
+            response = self.client.get(url_event_dashboard)
+            self.assertNotContains(response, "Current AKs")
+            self.assertNotContains(response, "AK Wall")
+
+            # Plan not hidden?
+            # Buttons for current AKs and AK Wall should be on the page
+            self.event.plan_hidden = False
+            self.event.save()
+            response = self.client.get(url_event_dashboard)
+            self.assertContains(response, "Current AKs")
+            self.assertContains(response, "AK Wall")
+
+    def test_dashboard_buttons(self):
+        url_event_dashboard = reverse('dashboard:dashboard_event', kwargs={"slug": self.event.slug})
+
+        response = self.client.get(url_event_dashboard)
+        self.assertNotContains(response, "Dashboard Button Test")
+
+        DashboardButton.objects.create(
+            text="Dashboard Button Test",
+            event=self.event
+        )
+
+        response = self.client.get(url_event_dashboard)
+        self.assertContains(response, "Dashboard Button Test")
-- 
GitLab