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('')) 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('/', 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('/', data={'item_text': 'A new list item'}) self.assertEqual(response.status_code, 302) self.assertEqual(response['location'], '/lists/the-only-list/') class ListViewTest(TestCase): def test_uses_list_template(self): response = self.client.get('/lists/the-only-list/') self.assertTemplateUsed(response, 'list.html') def test_displays_all_items(self): Item.objects.create(text='itemey 1') Item.objects.create(text='itemey 2') response = self.client.get('/lists/the-only-list/') self.assertContains(response, 'itemey 1') self.assertContains(response, 'itemey 2') class ListAndItemModelsTest(TestCase): def test_save_and_retrieve_items(self): list_ = List() list_.save() item1 = Item() item1.text = 'The first (ever) list item' item1.list = list_ item1.save() item2 = Item() item2.text = 'Item the 2nd' item2.list = 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.list, list_) self.assertEqual(second_item.text, item2.text) self.assertEqual(second_item.list, 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'}) self.assertRedirects(response, '/lists/the-only-list/')