From 4675bb44a54accc78f1279202e0f174e913cb3b8 Mon Sep 17 00:00:00 2001
From: Noah Jonah Gente <fu2662cw@mi.fu-berlin.de>
Date: Wed, 2 Jun 2021 14:54:06 +0200
Subject: [PATCH] Add model and tests for KnowledgeSnack

---
 unisportomat/quiz/apps.py                     |   7 +-
 .../0001_refactor_sport_and_add_criteria.py   | 280 +++++++++++++++---
 .../migrations/0004_auto_20210602_1247.py     |  34 +++
 unisportomat/quiz/models.py                   |   9 +
 unisportomat/quiz/tests.py                    |  52 +++-
 5 files changed, 328 insertions(+), 54 deletions(-)
 create mode 100644 unisportomat/quiz/migrations/0004_auto_20210602_1247.py

diff --git a/unisportomat/quiz/apps.py b/unisportomat/quiz/apps.py
index 81351a5..1b9381b 100644
--- a/unisportomat/quiz/apps.py
+++ b/unisportomat/quiz/apps.py
@@ -4,6 +4,7 @@ from django.apps import AppConfig
 
 
 class QuizConfig(AppConfig):
-    """Application Config for the quiz app """
-    default_auto_field = 'django.db.models.BigAutoField'
-    name = 'quiz'
+    """Application Config for the quiz app"""
+
+    default_auto_field = "django.db.models.BigAutoField"
+    name = "quiz"
diff --git a/unisportomat/quiz/migrations/0001_refactor_sport_and_add_criteria.py b/unisportomat/quiz/migrations/0001_refactor_sport_and_add_criteria.py
index 31b6613..1ce88d6 100644
--- a/unisportomat/quiz/migrations/0001_refactor_sport_and_add_criteria.py
+++ b/unisportomat/quiz/migrations/0001_refactor_sport_and_add_criteria.py
@@ -7,86 +7,280 @@ import django.db.models.deletion
 
 class Migration(migrations.Migration):
 
-    replaces = [('quiz', '0001_initial'), ('quiz', '0002_wissensnack_text'), ('quiz', '0003_auto_20210517_1437'), ('quiz', '0004_criterion'), ('quiz', '0005_auto_20210517_1520'), ('quiz', '0006_rename_criterion_ratings_sport_criteria_ratings'), ('quiz', '0007_auto_20210518_1521'), ('quiz', '0008_alter_sport_url')]
+    replaces = [
+        ("quiz", "0001_initial"),
+        ("quiz", "0002_wissensnack_text"),
+        ("quiz", "0003_auto_20210517_1437"),
+        ("quiz", "0004_criterion"),
+        ("quiz", "0005_auto_20210517_1520"),
+        ("quiz", "0006_rename_criterion_ratings_sport_criteria_ratings"),
+        ("quiz", "0007_auto_20210518_1521"),
+        ("quiz", "0008_alter_sport_url"),
+    ]
 
     initial = True
 
-    dependencies = [
-    ]
+    dependencies = []
 
     operations = [
         migrations.CreateModel(
-            name='Sport',
+            name="Sport",
             fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.TextField(choices=[('After Work Fitness', 'After Work Fitness'), ('Ballett', 'Ballett'), ('Basketball', 'Basketball'), ('Beachvolleyball', 'Beachvolleyball'), ('Bouldern', 'Bouldern'), ('Drachenfliegen', 'Drachenfliegen'), ('Functional Fitness', 'Functional Fitness'), ('Gerätturnen', 'Gerätturnen'), ('HIIT', 'HIIT'), ('Karate', 'Karate'), ('Kickboxen', 'Kickboxen'), ('Laufen', 'Laufen'), ('Pilates', 'Pilates'), ('Qigong', 'Qigong'), ('Rückenfit', 'Rückenfit'), ('Segeln Sportbootführerschein', 'Segeln Sportbootführerschein'), ('Skilanglauf & Schneeschuhwandern', 'Skilanglauf & Schneeschuhwandern'), ('Sweat & Relax', 'Sweat & Relax'), ('Tennis', 'Tennis'), ('Ultimate Frisbee', 'Ultimate Frisbee'), ('Yoga', 'Yoga')])),
-                ('field', models.CharField(choices=[('indoor', 'indoor'), ('outdoor', 'outdoor')], default='outdoor', max_length=50)),
-                ('einzelsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('mannschaftssport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('ausdauer', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('kraft', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('kampfsport', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('technischakrobatisch', models.IntegerField(choices=[(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10)], default=1)),
-                ('url', models.TextField()),
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "name",
+                    models.TextField(
+                        choices=[
+                            ("After Work Fitness", "After Work Fitness"),
+                            ("Ballett", "Ballett"),
+                            ("Basketball", "Basketball"),
+                            ("Beachvolleyball", "Beachvolleyball"),
+                            ("Bouldern", "Bouldern"),
+                            ("Drachenfliegen", "Drachenfliegen"),
+                            ("Functional Fitness", "Functional Fitness"),
+                            ("Gerätturnen", "Gerätturnen"),
+                            ("HIIT", "HIIT"),
+                            ("Karate", "Karate"),
+                            ("Kickboxen", "Kickboxen"),
+                            ("Laufen", "Laufen"),
+                            ("Pilates", "Pilates"),
+                            ("Qigong", "Qigong"),
+                            ("Rückenfit", "Rückenfit"),
+                            (
+                                "Segeln Sportbootführerschein",
+                                "Segeln Sportbootführerschein",
+                            ),
+                            (
+                                "Skilanglauf & Schneeschuhwandern",
+                                "Skilanglauf & Schneeschuhwandern",
+                            ),
+                            ("Sweat & Relax", "Sweat & Relax"),
+                            ("Tennis", "Tennis"),
+                            ("Ultimate Frisbee", "Ultimate Frisbee"),
+                            ("Yoga", "Yoga"),
+                        ]
+                    ),
+                ),
+                (
+                    "field",
+                    models.CharField(
+                        choices=[("indoor", "indoor"), ("outdoor", "outdoor")],
+                        default="outdoor",
+                        max_length=50,
+                    ),
+                ),
+                (
+                    "einzelsport",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                (
+                    "mannschaftssport",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                (
+                    "ausdauer",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                (
+                    "kraft",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                (
+                    "kampfsport",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                (
+                    "technischakrobatisch",
+                    models.IntegerField(
+                        choices=[
+                            (1, 1),
+                            (2, 2),
+                            (3, 3),
+                            (4, 4),
+                            (5, 5),
+                            (6, 6),
+                            (7, 7),
+                            (8, 8),
+                            (9, 9),
+                            (10, 10),
+                        ],
+                        default=1,
+                    ),
+                ),
+                ("url", models.TextField()),
             ],
         ),
         migrations.CreateModel(
-            name='Criterion',
+            name="Criterion",
             fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('name', models.TextField()),
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("name", models.TextField()),
             ],
         ),
         migrations.CreateModel(
-            name='CriterionRating',
+            name="CriterionRating",
             fields=[
-                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('rating', models.IntegerField(validators=[django.core.validators.MaxValueValidator(10), django.core.validators.MinValueValidator(0)])),
-                ('criterion', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.criterion')),
-                ('sport', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='quiz.sport')),
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                (
+                    "rating",
+                    models.IntegerField(
+                        validators=[
+                            django.core.validators.MaxValueValidator(10),
+                            django.core.validators.MinValueValidator(0),
+                        ]
+                    ),
+                ),
+                (
+                    "criterion",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE, to="quiz.criterion"
+                    ),
+                ),
+                (
+                    "sport",
+                    models.ForeignKey(
+                        on_delete=django.db.models.deletion.CASCADE, to="quiz.sport"
+                    ),
+                ),
             ],
         ),
         migrations.AddField(
-            model_name='sport',
-            name='criteria_ratings',
-            field=models.ManyToManyField(through='quiz.CriterionRating', to='quiz.Criterion'),
+            model_name="sport",
+            name="criteria_ratings",
+            field=models.ManyToManyField(
+                through="quiz.CriterionRating", to="quiz.Criterion"
+            ),
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='ausdauer',
+            model_name="sport",
+            name="ausdauer",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='einzelsport',
+            model_name="sport",
+            name="einzelsport",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='field',
+            model_name="sport",
+            name="field",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='kampfsport',
+            model_name="sport",
+            name="kampfsport",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='kraft',
+            model_name="sport",
+            name="kraft",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='mannschaftssport',
+            model_name="sport",
+            name="mannschaftssport",
         ),
         migrations.RemoveField(
-            model_name='sport',
-            name='technischakrobatisch',
+            model_name="sport",
+            name="technischakrobatisch",
         ),
         migrations.AlterField(
-            model_name='sport',
-            name='name',
+            model_name="sport",
+            name="name",
             field=models.TextField(),
         ),
         migrations.AlterField(
-            model_name='sport',
-            name='url',
+            model_name="sport",
+            name="url",
             field=models.URLField(),
         ),
     ]
diff --git a/unisportomat/quiz/migrations/0004_auto_20210602_1247.py b/unisportomat/quiz/migrations/0004_auto_20210602_1247.py
new file mode 100644
index 0000000..a78fce6
--- /dev/null
+++ b/unisportomat/quiz/migrations/0004_auto_20210602_1247.py
@@ -0,0 +1,34 @@
+# Generated by Django 3.2 on 2021-06-02 12:47
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("quiz", "0003_auto_20210601_1549"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="KnowledgeSnack",
+            fields=[
+                (
+                    "id",
+                    models.BigAutoField(
+                        auto_created=True,
+                        primary_key=True,
+                        serialize=False,
+                        verbose_name="ID",
+                    ),
+                ),
+                ("text", models.TextField()),
+                ("image", models.ImageField(max_length=200, null=True, upload_to="")),
+            ],
+        ),
+        migrations.AlterField(
+            model_name="calltomove",
+            name="image",
+            field=models.ImageField(max_length=200, null=True, upload_to=""),
+        ),
+    ]
diff --git a/unisportomat/quiz/models.py b/unisportomat/quiz/models.py
index c68fdad..451cecb 100644
--- a/unisportomat/quiz/models.py
+++ b/unisportomat/quiz/models.py
@@ -57,5 +57,14 @@ class Criterion(models.Model):
 
 
 class CallToMove(models.Model):
+    """Defines text and image that are used to show a call to move between questions"""
+
+    text = models.TextField()
+    image = models.ImageField(null=True, max_length=200)
+
+
+class KnowledgeSnack(models.Model):
+    """Defines text and image that are used to show a KnowledgeSnack between questions"""
+
     text = models.TextField()
     image = models.ImageField(null=True, max_length=200)
diff --git a/unisportomat/quiz/tests.py b/unisportomat/quiz/tests.py
index 5f1d5c5..29eb667 100644
--- a/unisportomat/quiz/tests.py
+++ b/unisportomat/quiz/tests.py
@@ -4,11 +4,10 @@ import os
 import shutil
 import tempfile
 
-from django.core.files import File
 from django.core.files.uploadedfile import SimpleUploadedFile
 from django.test import TestCase, override_settings
-from .models import Sport, Criterion, CallToMove
 from django.conf import settings
+from .models import Sport, Criterion, CallToMove, KnowledgeSnack
 
 
 class SportModelTest(TestCase):
@@ -84,12 +83,14 @@ class CriterionModelTest(TestCase):
 
 
 FIXTURE_IMAGES = os.path.join(settings.BASE_DIR, "quiz", "fixtures", "images")
-MEDIA_ROOT = tempfile.mkdtemp(suffix="testing")  # Create a temp directory for files created during tests
+MEDIA_ROOT = tempfile.mkdtemp(
+    suffix="testing"
+)  # Create a temp directory for files created during tests
 
 
 @override_settings(MEDIA_ROOT=MEDIA_ROOT)
-class InfoScreenTest(TestCase):
-    """Tests the Model for the info screen (Call To Move or Knowledge Snack)"""
+class CallToMoveTest(TestCase):
+    """Tests the Model for Call To Move"""
 
     def setUp(self):
         tempfile.mkdtemp(suffix="testing")  # recreate tmp folder before each test
@@ -106,16 +107,51 @@ class InfoScreenTest(TestCase):
         self.call_to_move.save()
 
     def tearDown(self) -> None:
-        """ Delete the temp dir after each test """
+        """Delete the temp dir after each test"""
         shutil.rmtree(MEDIA_ROOT, ignore_errors=True)
 
     def test_can_create_call_to_move(self):
-        """ A call to move can be correctly created """
+        """A call to move can be correctly created"""
         self.assertEqual(self.call_to_move.text, self.text)
         self.assertEqual(self.call_to_move.image.name, self.image.name)
 
     def test_can_save_and_load_call_to_move(self):
-        """ A saved Call to Move can be loaded """
+        """A saved Call to Move can be loaded"""
         call_to_move = CallToMove.objects.first()
         self.assertEqual(call_to_move.text, self.text)
         self.assertEqual(call_to_move.image.name, self.image.name)
+
+
+@override_settings(MEDIA_ROOT=MEDIA_ROOT)
+class KnowledgeSnackTest(TestCase):
+    """Tests the Model for Knowledge Snack"""
+
+    def setUp(self):
+        tempfile.mkdtemp(suffix="testing")  # recreate tmp folder before each test
+
+        self.text = "Dass Treppensteigen fast 5x so viele Kalorien verbrennt," \
+                    "als bei der Nutzung des Aufzuges?"
+        self.image_name = "test_image.png"
+        self.image_path = os.path.join(FIXTURE_IMAGES, self.image_name)
+        self.image = SimpleUploadedFile(
+            name=self.image_name,
+            content=open(self.image_path, "rb").read(),
+            content_type="image/png",
+        )
+        self.knowledge_snack = KnowledgeSnack(text=self.text, image=self.image)
+        self.knowledge_snack.save()
+
+    def tearDown(self) -> None:
+        """Delete the temp dir after each test"""
+        shutil.rmtree(MEDIA_ROOT, ignore_errors=True)
+
+    def test_can_create_knowledge_snack(self):
+        """A knowledge snack can be correctly created"""
+        self.assertEqual(self.knowledge_snack.text, self.text)
+        self.assertEqual(self.knowledge_snack.image.name, self.image.name)
+
+    def test_can_save_and_load_call_to_move(self):
+        """A saved Knowledge Snack can be loaded"""
+        knowledge_snack = KnowledgeSnack.objects.first()
+        self.assertEqual(knowledge_snack.text, self.text)
+        self.assertEqual(knowledge_snack.image.name, self.image.name)
-- 
GitLab