mq-quiz / src /quizzes /tests.py
Pamela Fox
Porting to pytest-django
4dec878
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)