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