วันเสาร์ที่ 14 เมษายน พ.ศ. 2561

Commit 5 Wordbucket : first simple database used

Assignment1 : Wordbucket GitHub Link

Commit 5 Wordbucket : first simple database used

Commits on Feb 26, 2018
Link GitHub Commit 5 Wordbucket

- แก้ 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 (ใหม่)
    • test save และรับ items
@@ -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})


ไม่มีความคิดเห็น:

แสดงความคิดเห็น