| @ -1,3 +1,102 @@ | |||
| import datetime | |||
| from django.test import TestCase | |||
| from django.utils import timezone | |||
| from django.urls import reverse | |||
| from .models import Question | |||
| 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 QuestionModelTests(TestCase): | |||
| def test_was_published_recently_with_future_question(self): | |||
| """ | |||
| was_published_recently() returns False for questions whose pub_date | |||
| is in the future. | |||
| """ | |||
| time = timezone.now() + datetime.timedelta(days=30) | |||
| future_question = Question(pub_date=time) | |||
| self.assertIs(future_question.was_published_recently(), False) | |||
| def test_was_published_recently_with_old_question(self): | |||
| """ | |||
| was_published_recently() returns False for questions whose pub_date | |||
| is older than 1 day. | |||
| """ | |||
| time = timezone.now() - datetime.timedelta(days=1, seconds=1) | |||
| old_question = Question(pub_date=time) | |||
| self.assertIs(old_question.was_published_recently(), False) | |||
| def test_was_published_recently_with_recent_question(self): | |||
| """ | |||
| was_published_recently() returns True for questions whose pub_date | |||
| is within the last day. | |||
| """ | |||
| 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) | |||
| 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_future_question(self): | |||
| """ | |||
| The detail view of a question with a pub_date in the future | |||
| returns a 404 not found. | |||
| """ | |||
| future_question = create_question(question_text="Future question.", days=5) | |||
| url = reverse("polls:detail", args=(future_question.id,)) | |||
| response = self.client.get(url) | |||
| self.assertEqual(response.status_code, 404) | |||
| def test_past_question(self): | |||
| """ | |||
| The detail view of a question with a pub_date in the past | |||
| displays the question's text. | |||
| """ | |||
| past_question = create_question(question_text="Past Question.", days=-5) | |||
| url = reverse("polls:detail", args=(past_question.id,)) | |||
| response = self.client.get(url) | |||
| self.assertContains(response, past_question.question_text) | |||
| 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], | |||
| ) | |||
| # Create your tests here. | |||
| 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], | |||
| ) | |||