Update Test and Model for Default pub_date Handling

In this commit, I change default field of pub_date into auto_add_now and it change the way pub_date assign work so I need to add several updates to address issues and errors in the code and tests related to the handling of the pub_date attribute in the Question model.

Test Updates
- Modified the create_question function in tests to accept pub_date when necessary and set it explicitly in the tests to match the new model definition.

Ensured the correct ordering of past questions in the index view.

Model Update
- Modified the Question model to use auto_now_add=True for pub_date to set it to the current date and time automatically.
This commit is contained in:
sosokker 2023-09-08 22:36:41 +07:00
parent c54492c418
commit c116a2ff0d
2 changed files with 48 additions and 14 deletions

View File

@ -27,7 +27,7 @@ class Question(models.Model):
""" """
question_text = models.CharField(max_length=200) question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField("date published", default=timezone.now) pub_date = models.DateTimeField("date published", auto_now_add=True)
end_date = models.DateTimeField("date ended", null=True) end_date = models.DateTimeField("date ended", null=True)
def was_published_recently(self): def was_published_recently(self):

View File

@ -26,7 +26,6 @@ class QuestionModelTests(TestCase):
old_question = Question(pub_date=time) old_question = Question(pub_date=time)
self.assertIs(old_question.was_published_recently(), False) self.assertIs(old_question.was_published_recently(), False)
def test_was_published_recently_with_recent_question(self): def test_was_published_recently_with_recent_question(self):
""" """
was_published_recently() returns True for questions whose pub_date was_published_recently() returns True for questions whose pub_date
@ -36,7 +35,6 @@ class QuestionModelTests(TestCase):
recent_question = Question(pub_date=time) recent_question = Question(pub_date=time)
self.assertIs(recent_question.was_published_recently(), True) self.assertIs(recent_question.was_published_recently(), True)
def test_is_published_with_future_question(self): def test_is_published_with_future_question(self):
""" """
is_published() should return False for questions whos pub_date is in the is_published() should return False for questions whos pub_date is in the
@ -46,6 +44,18 @@ class QuestionModelTests(TestCase):
future_question = Question(pub_date=future_date) future_question = Question(pub_date=future_date)
self.assertIs(future_question.is_published(), False) self.assertIs(future_question.is_published(), False)
def test_default_pub_date(self):
"""
Questions with the default pub_date (now) are displayed on the index page.
"""
question = Question.objects.create(question_text="Default pub date question.")
response = self.client.get(reverse("polls:index"))
self.assertQuerySetEqual(
response.context["latest_question_list"],
[question],
)
def test_is_published_with_past_question(self): def test_is_published_with_past_question(self):
""" """
is_published() should return True for questions whose pub_date is in the is_published() should return True for questions whose pub_date is in the
@ -95,13 +105,15 @@ class QuestionModelTests(TestCase):
self.assertIs(question.can_vote(), True) self.assertIs(question.can_vote(), True)
def create_question(question_text, days): def create_question(self, question_text, days, pub_date=None):
""" """
Create a question with the given `question_text` and published the Create a question with the given `question_text` and published the
given number of `days` offset to now (negative for questions published given number of `days` offset to now (negative for questions published
in the past, positive for questions that have yet to be published). in the past, positive for questions that have yet to be published).
""" """
time = timezone.now() + datetime.timedelta(days=days) time = timezone.now() + timezone.timedelta(days=days)
if pub_date is not None:
time = pub_date
return Question.objects.create(question_text=question_text, pub_date=time) return Question.objects.create(question_text=question_text, pub_date=time)
@ -120,7 +132,9 @@ class QuestionIndexViewTests(TestCase):
Questions with a pub_date in the past are displayed on the Questions with a pub_date in the past are displayed on the
index page. index page.
""" """
question = create_question(question_text="Past question.", days=-30) question = Question.objects.create(question_text="Past question.")
question.pub_date = timezone.now() - timezone.timedelta(days=30)
question.save()
response = self.client.get(reverse("polls:index")) response = self.client.get(reverse("polls:index"))
self.assertQuerySetEqual( self.assertQuerySetEqual(
response.context["latest_question_list"], response.context["latest_question_list"],
@ -132,7 +146,9 @@ class QuestionIndexViewTests(TestCase):
Questions with a pub_date in the future aren't displayed on Questions with a pub_date in the future aren't displayed on
the index page. the index page.
""" """
create_question(question_text="Future question.", days=30) future_question = Question.objects.create(question_text="Future question.")
future_question.pub_date = timezone.now() + timezone.timedelta(days=30)
future_question.save()
response = self.client.get(reverse("polls:index")) response = self.client.get(reverse("polls:index"))
self.assertContains(response, "No polls are available.") self.assertContains(response, "No polls are available.")
self.assertQuerySetEqual(response.context["latest_question_list"], []) self.assertQuerySetEqual(response.context["latest_question_list"], [])
@ -142,20 +158,32 @@ class QuestionIndexViewTests(TestCase):
Even if both past and future questions exist, only past questions Even if both past and future questions exist, only past questions
are displayed. are displayed.
""" """
question = create_question(question_text="Past question.", days=-30) past_question = Question.objects.create(question_text="Past question.")
create_question(question_text="Future question.", days=30) past_question.pub_date = timezone.now() - timezone.timedelta(days=30)
past_question.save()
future_question = Question.objects.create(question_text="Future question.")
future_question.pub_date = timezone.now() + timezone.timedelta(days=30)
future_question.save()
response = self.client.get(reverse("polls:index")) response = self.client.get(reverse("polls:index"))
self.assertQuerySetEqual( self.assertQuerySetEqual(
response.context["latest_question_list"], response.context["latest_question_list"],
[question], [past_question],
) )
def test_two_past_questions(self): def test_two_past_questions(self):
""" """
The questions index page may display multiple questions. The questions index page may display multiple questions.
""" """
question1 = create_question(question_text="Past question 1.", days=-30) question1 = Question.objects.create(question_text="Past question 1.")
question2 = create_question(question_text="Past question 2.", days=-5) question1.pub_date = timezone.now() - timezone.timedelta(days=30)
question1.save()
question2 = Question.objects.create(question_text="Past question 2.")
question2.pub_date = timezone.now() - timezone.timedelta(days=5)
question2.save()
response = self.client.get(reverse("polls:index")) response = self.client.get(reverse("polls:index"))
self.assertQuerySetEqual( self.assertQuerySetEqual(
response.context["latest_question_list"], response.context["latest_question_list"],
@ -169,7 +197,10 @@ class QuestionDetailViewTests(TestCase):
The detail view of a question with a pub_date in the future The detail view of a question with a pub_date in the future
returns a 404 not found. returns a 404 not found.
""" """
future_question = create_question(question_text="Future question.", days=5) future_question = Question.objects.create(question_text="Future question.")
future_question.pub_date = timezone.now() + timezone.timedelta(days=5)
future_question.save()
url = reverse("polls:detail", args=(future_question.id,)) url = reverse("polls:detail", args=(future_question.id,))
response = self.client.get(url) response = self.client.get(url)
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
@ -179,7 +210,10 @@ class QuestionDetailViewTests(TestCase):
The detail view of a question with a pub_date in the past The detail view of a question with a pub_date in the past
displays the question's text. displays the question's text.
""" """
past_question = create_question(question_text="Past Question.", days=-5) past_question = Question.objects.create(question_text="Past Question.")
past_question.pub_date = timezone.now() - timezone.timedelta(days=5)
past_question.save()
url = reverse("polls:detail", args=(past_question.id,)) url = reverse("polls:detail", args=(past_question.id,))
response = self.client.get(url) response = self.client.get(url)
self.assertContains(response, past_question.question_text) self.assertContains(response, past_question.question_text)