| from django.test import TestCase | |
| from django.urls import reverse | |
| from .models import FreeTextAnswer, MultipleChoiceAnswer, Question, Quiz | |
| def create_quiz(): | |
| quiz = Quiz.objects.create(name="Butterflies") | |
| question = Question.objects.create(quiz=quiz, prompt="What plant do Swallowtail caterpillars eat?") | |
| answer = MultipleChoiceAnswer.objects.create( | |
| question=question, correct_answer="Dill", choices=["Thistle", "Milkweed", "Dill"] | |
| ) | |
| return quiz, question, answer | |
| class FreeTextAnswerModelTests(TestCase): | |
| def test_case_insensitive(self): | |
| ans = FreeTextAnswer(correct_answer="Milkweed", case_sensitive=False) | |
| self.assertTrue(ans.is_correct("Milkweed")) | |
| self.assertTrue(ans.is_correct("milkweed")) | |
| self.assertFalse(ans.is_correct("thistle")) | |
| def test_case_sensitive(self): | |
| ans = FreeTextAnswer(correct_answer="Armeria Maritima", case_sensitive=True) | |
| self.assertFalse(ans.is_correct("armeria maritima")) | |
| self.assertTrue(ans.is_correct("Armeria Maritima")) | |
| class MultipleChoiceAnswerModelTests(TestCase): | |
| def test_choices(self): | |
| ans = MultipleChoiceAnswer(correct_answer="Dill", choices=["Milkweed", "Dill", "Thistle"]) | |
| self.assertTrue(ans.is_correct("Dill")) | |
| self.assertFalse(ans.is_correct("dill")) | |
| self.assertFalse(ans.is_correct("Milkweed")) | |
| class QuizModelTests(TestCase): | |
| def test_quiz_relations(self): | |
| quiz = Quiz.objects.create(name="Butterflies") | |
| q1 = Question.objects.create(quiz=quiz, prompt="What plant do Swallowtail caterpillars eat?") | |
| a1 = MultipleChoiceAnswer.objects.create( | |
| question=q1, correct_answer="Dill", choices=["Thistle", "Milkweed", "Dill"] | |
| ) | |
| q2 = Question.objects.create(quiz=quiz, prompt="What plant do Monarch caterpillars eat?") | |
| a2 = FreeTextAnswer.objects.create(question=q2, correct_answer="Milkweed", case_sensitive=False) | |
| self.assertEqual(len(quiz.question_set.all()), 2) | |
| self.assertEqual(q1.multiplechoiceanswer, a1) | |
| self.assertEqual(q2.freetextanswer, a2) | |
| class IndexViewTests(TestCase): | |
| def test_no_quizzes(self): | |
| response = self.client.get(reverse("quizzes:index")) | |
| self.assertEqual(response.status_code, 200) | |
| self.assertContains(response, "No quizzes are available.") | |
| self.assertQuerysetEqual(response.context["quiz_list"], []) | |
| def test_one_quiz(self): | |
| quiz, _, _ = create_quiz() | |
| response = self.client.get(reverse("quizzes:index")) | |
| self.assertQuerysetEqual( | |
| response.context["quiz_list"], | |
| [quiz], | |
| ) | |
| class DisplayQuizViewTests(TestCase): | |
| def test_quiz_404(self): | |
| url = reverse("quizzes:display_quiz", args=(12,)) | |
| response = self.client.get(url) | |
| self.assertEqual(response.status_code, 404) | |
| def test_quiz_redirects(self): | |
| quiz, question, _ = create_quiz() | |
| url = reverse("quizzes:display_quiz", args=(quiz.pk,)) | |
| response = self.client.get(url) | |
| self.assertRedirects(response, reverse("quizzes:display_question", args=(quiz.pk, question.pk))) | |
| class DisplayQuestionViewTests(TestCase): | |
| def test_quiz_404(self): | |
| url = reverse("quizzes:display_question", args=(12, 1)) | |
| response = self.client.get(url) | |
| self.assertEqual(response.status_code, 404) | |
| def test_question_404(self): | |
| quiz, question, _ = create_quiz() | |
| url = reverse("quizzes:display_question", args=(quiz.pk, question.pk + 100)) | |
| response = self.client.get(url) | |
| self.assertContains(response, "that question doesn't exist") | |
| def test_quiz_question_exists(self): | |
| quiz, question, answer = create_quiz() | |
| url = reverse("quizzes:display_question", args=(quiz.pk, question.pk)) | |
| response = self.client.get(url) | |
| self.assertContains(response, quiz.name) | |
| self.assertContains(response, question.prompt) | |
| self.assertContains(response, answer.choices[0]) | |
| class GradeQuestionViewTests(TestCase): | |
| def test_question_404(self): | |
| url = reverse("quizzes:grade_question", args=(12,)) | |
| response = self.client.get(url) | |
| self.assertEqual(response.status_code, 404) | |
| def test_question_correct(self): | |
| _, question, answer = create_quiz() | |
| url = reverse("quizzes:grade_question", args=(question.pk,)) | |
| response = self.client.post(url, {"answer": answer.correct_answer}) | |
| self.assertTrue(response.context["is_correct"]) | |
| self.assertEqual(response.context["correct_answer"], answer.correct_answer) | |