Commit 5 Wordbucket : first simple database used
- แก้ functional_tests.py นอกจาก Ann จะใส่ คำว่า weeb ไปแล้วยังใส่คำว่า pogChamp ด้วย
| | @@ -1,4 +1,6 @@ |
| | from selenium import webdriver |
| | +from selenium.webdriver.common.keys import Keys |
| | +import time |
| | import unittest |
| | |
| | class NewVisitorTest(unittest.TestCase): |
| @@ -9,6 +11,11 @@ def setUp(self): |
| | def tearDown(self): |
| | self.browser.quit() |
| | |
| | + def check_for_row_in_list_table(self, row_text): |
| | + table = self.browser.find_element_by_id('id_list_table') |
| | + rows = table.find_elements_by_tag_name('tr') |
| | + self.assertIn(row_text, [row.text for row in rows]) |
| | + |
| | def test_can_start_a_list_and_retrieve_it_later(self): |
| | # Ann has heard about a cool new online word app. She goes |
| | # to check out its homepage |
| @@ -33,12 +40,19 @@ def test_can_start_a_list_and_retrieve_it_later(self): |
| | # "1: weeb" as an item in a word list table |
| | inputbox.send_keys(Keys.ENTER) |
| | time.sleep(1) |
| | + self.check_for_row_in_list_table('1: weeb') |
| | + |
| | + # There is still a text box inviting her to add another item. She |
| | + # enters "PogChamp" |
| | + inputbox = self.browser.find_element_by_id('id_new_item') |
| | + inputbox.send_keys('PogChamp') |
| | + inputbox.send_keys(Keys.ENTER) |
| | + time.sleep(1) |
| | |
| | - table = self.browser.find_element_by_id('id_list_table') |
| | - rows = table.find_elements_by_tag_name('tr') |
| | - self.assertTrue( |
| | - any(row.text == '1: weeb' for row in rows) |
| | - ) |
| | + # The page updates again, and now shows both items on her list |
| | + self.check_for_row_in_list_table('1: weeb') |
| | + self.check_for_row_in_list_table('2: PogChamp') |
| | + |
| | self.fail('Finish the test!') |
| | |
| | if __name__ == '__main__': |
- ทดสอบใช้ models.py แบบง่ายๆคล้ายๆในหนังสือ
| | @@ -1,3 +1,4 @@ |
| | from django.db import models |
| | |
| | -# Create your models here. |
| | +class Item(models.Model): |
| | + word = models.TextField(default='') |
- update template home ในช่องให้ใส่ add word กับตารางแสดง word ที่ใน database ที่เราสร้าง รับมาแสดงตามที่เราตั้งค่าใน views.py (อธิบายต่อจากนี้)
| | @@ -1,3 +1,18 @@ |
| | <html> |
| | - <title>Word Bucket</title> |
| | + <head> |
| | + <title>Word Bucket</title> |
| | + </head> |
| | + <body> |
| | + <h1>Word Bucket</h1> |
| | + <form method="POST"> |
| | + <input name="item_text" id="id_new_item" placeholder="Add new word" /> |
| | + {% csrf_token %} |
| | + </form> |
| | + |
| | + <table id="id_list_table"> |
| | + {% for item in items %} |
| | + <tr><td>{{ forloop.counter }}: {{ item.word }}</td></tr> |
| | + {% endfor %} |
| | + </table> |
| | + </body> |
| | </html> |
- เพิ่ม unit test ดังนี้
Class
- HomePageTest
- test save post ที่รับมาจาก form ที่เขียนใน template home.html
- test redirect หลังจาก post
- test display word ที่เก็บไว้
- ItemModelTest (ใหม่)
| @@ -4,13 +4,26 @@ |
| | from django.template.loader import render_to_string |
| | |
| | from wordbucket.views import home_page |
| | +from wordbucket.models import Item |
| | |
| | class HomePageTest(TestCase): |
| | |
| | def test_uses_home_template(self): |
| | response = self.client.get('/') |
| | self.assertTemplateUsed(response, 'home.html') |
| | |
| | + def test_can_save_a_POST_request(self): |
| | + 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.word, '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'], '/') |
| | + |
| | def test_home_page_returns_correct_html(self): |
| | response = self.client.get('/') |
| | |
| @@ -20,3 +33,31 @@ def test_home_page_returns_correct_html(self): |
| | self.assertTrue(html.strip().endswith('</html>')) |
| | |
| | self.assertTemplateUsed(response, 'home.html') |
| | + |
| | + def test_displays_all_list_items(self): |
| | + Item.objects.create(word='itemey 1') |
| | + Item.objects.create(word='itemey 2') |
| | + |
| | + response = self.client.get('/') |
| | + |
| | + self.assertIn('itemey 1', response.content.decode()) |
| | + self.assertIn('itemey 2', response.content.decode()) |
| | + |
| | +class ItemModelTest(TestCase): |
| | + |
| | + def test_saving_and_retrieving_items(self): |
| | + first_item = Item() |
| | + first_item.word = 'The first (ever) word item' |
| | + first_item.save() |
| | + |
| | + second_item = Item() |
| | + second_item.word = 'Item the second' |
| | + second_item.save() |
| | + |
| | + saved_items = Item.objects.all() |
| | + self.assertEqual(saved_items.count(), 2) |
| | + |
| | + first_saved_item = saved_items[0] |
| | + second_saved_item = saved_items[1] |
| | + self.assertEqual(first_saved_item.word, 'The first (ever) word item') |
| | + self.assertEqual(second_saved_item.word, 'Item the second') |
- เพิ่ม views.py ให้ items เท่ากับข้อมูล word ที่เก็บใน database ถ้าไม่มีการ post เกิดขึ้น render home.html ุถ้ามีบันทึกลง database แล้ว redirect กลับหน้าเดิม
| | @@ -1,6 +1,10 @@ |
| | -from django.shortcuts import render |
| | -from django.http import HttpResponse |
| | +from django.shortcuts import redirect, render |
| | +from wordbucket.models import Item |
| | |
| | -# Create your views here. |
| | def home_page(request): |
| | - return render(request, 'home.html') |
| | + if request.method == 'POST': |
| | + Item.objects.create(word=request.POST['item_text']) |
| | + return redirect('/') |
| | + |
| | + items = Item.objects.all() |
| | + return render(request, 'home.html', {'items': items}) |
ไม่มีความคิดเห็น:
แสดงความคิดเห็น