from django.urls import resolve from django.test import TestCase from django.http import HttpRequest from django.template.loader import render_to_string from lists.views import home_page from lists.models import Item, List class HomePageTest(TestCase): def test_root_url_resolves_to_home_page_view(self): found = resolve('/') self.assertEqual(found.func, home_page) def test_uses_home_template(self): response = self.client.get('/') # The Manual Way of doing it: html = response.content.decode('utf8') self.assertTrue(html.startswith('')) #Oops, Django Templating Used not HTML! self.assertIn('To-Do lists', html) self.assertTrue(html.strip().endswith('')) # Using Django's Builtin Testing Client: self.assertTemplateUsed(response, 'home.html') def test_can_save_POST_request(self): response = self.client.post('/lists/new', data={'item_text': 'A new list item'}) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new list item') def test_redirects_after_POST(self): response = self.client.post('/lists/new', data={'item_text': 'A new list item'}) new_list = List.objects.first() self.assertRedirects(response, f'/lists/{new_list.id}/') class ListViewTest(TestCase): def test_uses_list_template(self): list_ = List.objects.create() response = self.client.get(f'/lists/{list_.id}/') self.assertTemplateUsed(response, 'list.html') def test_displays_all_items_for_that_list(self): correct = List.objects.create() Item.objects.create(text='itemey 1', listi=correct) Item.objects.create(text='itemey 2', listi=correct) other = List.objects.create() Item.objects.create(text='other list item 1', listi=other) Item.objects.create(text='other list item 2', listi=other) response = self.client.get(f'/lists/{correct.id}/') self.assertContains(response, 'itemey 1') self.assertContains(response, 'itemey 2') self.assertNotContains(response, 'other list item 1') self.assertNotContains(response, 'other list item 2') def test_passes_correct_list_to_template(self): other_list = List.objects.create() correct_list = List.objects.create() response = self.client.get(f'/lists/{correct_list.id}/') self.assertEqual(response.context['list'], correct_list) class ListAndItemModelsTest(TestCase): def test_save_and_retrieve_items(self): list_ = List() list_.save() item1 = Item() item1.text = 'The first (ever) list item' item1.listi = list_ item1.save() item2 = Item() item2.text = 'Item the 2nd' item2.listi = list_ item2.save() savedL = List.objects.first() self.assertEqual(savedL, list_) savedI = Item.objects.all() self.assertEqual(savedI.count(), 2) first_item = savedI[0] second_item = savedI[1] self.assertEqual(first_item.text, item1.text) self.assertEqual(first_item.listi, list_) self.assertEqual(second_item.text, item2.text) self.assertEqual(second_item.listi, list_) class NewListTest(TestCase): def test_can_save_a_POST_request(self): self.client.post('/lists/new', data={'item_text': 'A new list item'}) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new list item') def test_redirects_after_POST(self): response = self.client.post('/lists/new', data={'item_text': 'A new list item'}) new_list = List.objects.first() self.assertRedirects(response, f'/lists/{new_list.id}/') class NewItemTest(TestCase): def test_can_save_a_POST_request_to_an_existing_list(self): other_list = List.objects.create() correct_list = List.objects.create() self.client.post( f'/lists/{correct_list.id}/add_item', data={'item_text': 'A new item for an existing list'} ) self.assertEqual(Item.objects.count(), 1) new_item = Item.objects.first() self.assertEqual(new_item.text, 'A new item for an existing list') self.assertEqual(new_item.listi, correct_list) def test_redirects_to_list_view(self): other_list = List.objects.create() correct_list = List.objects.create() response = self.client.post( f'/lists/{correct_list.id}/add_item', data={'item_text': 'A new item for an existing list'} ) self.assertRedirects(response, f'/lists/{correct_list.id}/')