tests.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from django.urls import resolve
  2. from django.test import TestCase
  3. from django.http import HttpRequest
  4. from django.template.loader import render_to_string
  5. from lists.views import home_page
  6. from lists.models import Item, List
  7. class HomePageTest(TestCase):
  8. def test_root_url_resolves_to_home_page_view(self):
  9. found = resolve('/')
  10. self.assertEqual(found.func, home_page)
  11. def test_uses_home_template(self):
  12. response = self.client.get('/')
  13. # The Manual Way of doing it:
  14. html = response.content.decode('utf8')
  15. self.assertTrue(html.startswith('<html>')) #Oops, Django Templating Used not HTML!
  16. self.assertIn('<title>To-Do lists</title>', html)
  17. self.assertTrue(html.strip().endswith('</html>'))
  18. # Using Django's Builtin Testing Client:
  19. self.assertTemplateUsed(response, 'home.html')
  20. def test_can_save_POST_request(self):
  21. response = self.client.post('/lists/new', data={'item_text': 'A new list item'})
  22. self.assertEqual(Item.objects.count(), 1)
  23. new_item = Item.objects.first()
  24. self.assertEqual(new_item.text, 'A new list item')
  25. def test_redirects_after_POST(self):
  26. response = self.client.post('/lists/new', data={'item_text': 'A new list item'})
  27. new_list = List.objects.first()
  28. self.assertRedirects(response, f'/lists/{new_list.id}/')
  29. class ListViewTest(TestCase):
  30. def test_uses_list_template(self):
  31. list_ = List.objects.create()
  32. response = self.client.get(f'/lists/{list_.id}/')
  33. self.assertTemplateUsed(response, 'list.html')
  34. def test_displays_all_items_for_that_list(self):
  35. correct = List.objects.create()
  36. Item.objects.create(text='itemey 1', listi=correct)
  37. Item.objects.create(text='itemey 2', listi=correct)
  38. other = List.objects.create()
  39. Item.objects.create(text='other list item 1', listi=other)
  40. Item.objects.create(text='other list item 2', listi=other)
  41. response = self.client.get(f'/lists/{correct.id}/')
  42. self.assertContains(response, 'itemey 1')
  43. self.assertContains(response, 'itemey 2')
  44. self.assertNotContains(response, 'other list item 1')
  45. self.assertNotContains(response, 'other list item 2')
  46. def test_passes_correct_list_to_template(self):
  47. other_list = List.objects.create()
  48. correct_list = List.objects.create()
  49. response = self.client.get(f'/lists/{correct_list.id}/')
  50. self.assertEqual(response.context['list'], correct_list)
  51. class ListAndItemModelsTest(TestCase):
  52. def test_save_and_retrieve_items(self):
  53. list_ = List()
  54. list_.save()
  55. item1 = Item()
  56. item1.text = 'The first (ever) list item'
  57. item1.listi = list_
  58. item1.save()
  59. item2 = Item()
  60. item2.text = 'Item the 2nd'
  61. item2.listi = list_
  62. item2.save()
  63. savedL = List.objects.first()
  64. self.assertEqual(savedL, list_)
  65. savedI = Item.objects.all()
  66. self.assertEqual(savedI.count(), 2)
  67. first_item = savedI[0]
  68. second_item = savedI[1]
  69. self.assertEqual(first_item.text, item1.text)
  70. self.assertEqual(first_item.listi, list_)
  71. self.assertEqual(second_item.text, item2.text)
  72. self.assertEqual(second_item.listi, list_)
  73. class NewListTest(TestCase):
  74. def test_can_save_a_POST_request(self):
  75. self.client.post('/lists/new', data={'item_text': 'A new list item'})
  76. self.assertEqual(Item.objects.count(), 1)
  77. new_item = Item.objects.first()
  78. self.assertEqual(new_item.text, 'A new list item')
  79. def test_redirects_after_POST(self):
  80. response = self.client.post('/lists/new', data={'item_text': 'A new list item'})
  81. new_list = List.objects.first()
  82. self.assertRedirects(response, f'/lists/{new_list.id}/')
  83. class NewItemTest(TestCase):
  84. def test_can_save_a_POST_request_to_an_existing_list(self):
  85. other_list = List.objects.create()
  86. correct_list = List.objects.create()
  87. self.client.post(
  88. f'/lists/{correct_list.id}/add_item',
  89. data={'item_text': 'A new item for an existing list'}
  90. )
  91. self.assertEqual(Item.objects.count(), 1)
  92. new_item = Item.objects.first()
  93. self.assertEqual(new_item.text, 'A new item for an existing list')
  94. self.assertEqual(new_item.listi, correct_list)
  95. def test_redirects_to_list_view(self):
  96. other_list = List.objects.create()
  97. correct_list = List.objects.create()
  98. response = self.client.post(
  99. f'/lists/{correct_list.id}/add_item',
  100. data={'item_text': 'A new item for an existing list'}
  101. )
  102. self.assertRedirects(response, f'/lists/{correct_list.id}/')