From aa32fb3ee39a5d494024ed74f8d984087a6027cb Mon Sep 17 00:00:00 2001 From: Josh Flatt Date: Sat, 22 Nov 2025 21:29:40 -0600 Subject: [PATCH] added more tests --- polls/tests.py | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++ polls/views.py | 10 ++++++-- 2 files changed, 78 insertions(+), 2 deletions(-) diff --git a/polls/tests.py b/polls/tests.py index d5da4b0..7192b14 100644 --- a/polls/tests.py +++ b/polls/tests.py @@ -1,6 +1,7 @@ import datetime from django.test import TestCase +from django.urls import reverse from django.utils import timezone from .models import Question @@ -33,3 +34,72 @@ class QuestionModelTests(TestCase): time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59) recent_question = Question(pub_date=time) self.assertIs(recent_question.was_published_recently(), True) + + +def create_question(question_text, days): + """ + Create a question with the given `question_text` and published the + given number of `days` offset to now (negative for questions published + in the past, positive for questions that have yet to be published). + """ + time = timezone.now() + datetime.timedelta(days=days) + + + return Question.objects.create(question_text=question_text, pub_date=time) + +class QuestionIndexViewTests(TestCase): + def test_no_questions(self): + """ + If no questions exist, an appropriate message is displayed. + """ + response = self.client.get(reverse("polls:index")) + self.assertEqual(response.status_code, 200) + self.assertContains(response, "No polls are available.") + self.assertQuerySetEqual(response.context["latest_question_list"], []) + + def test_past_question(self): + """ + Questions with a pub_date in the past are displayed on the + index page. + """ + question = create_question(question_text="Past question.", days=-30) + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question], + ) + + def test_future_question(self): + """ + Questions with a pub_date in the future aren't displayed on + the index page. + """ + create_question(question_text="Future question.", days=30) + response = self.client.get(reverse("polls:index")) + self.assertContains(response, "No polls are available.") + self.assertQuerySetEqual(response.context["latest_question_list"], []) + + def test_future_question_and_past_question(self): + """ + Even if both past and future questions exist, only past questions + are displayed. + """ + question = create_question(question_text="Past question.", days=-30) + create_question(question_text="Future question.", days=30) + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question], + ) + + def test_two_past_questions(self): + """ + The questions index page may display multiple questions. + """ + question1 = create_question(question_text="Past question 1.", days=-30) + question2 = create_question(question_text="Past question 2.", days=-5) + response = self.client.get(reverse("polls:index")) + self.assertQuerySetEqual( + response.context["latest_question_list"], + [question2, question1], + ) \ No newline at end of file diff --git a/polls/views.py b/polls/views.py index 5372446..9150aed 100644 --- a/polls/views.py +++ b/polls/views.py @@ -2,6 +2,7 @@ from django.db.models import F from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.urls import reverse +from django.utils import timezone from django.views import generic from .models import Choice, Question @@ -14,8 +15,13 @@ class IndexView(generic.ListView): context_object_name = "latest_question_list" def get_queryset(self): - """Return the last five published questions.""" - return Question.objects.order_by("-pub_date")[:5] + """ + Return the last five published questions (not including those set to be + published in the future). + """ + return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[ + :5 + ] class DetailView(generic.DetailView):