Flask Python’s Framework ก็ผมจะเขียนเทสเกี่ยวกับคุ๊กกี้ (cookie) อ่ะ

ช่วงนี้ก็เริ่มจะเขียน python บ่อยขึ้น เว็บแอพก็ง่ายนะ framework เบาๆ มีให้ใช้หลายตัวอยู่เหมือนกัน ส่วนตัวแล้วก็ชอบใช้ Flask แล้วก็มี bottle อยู่นิดหน่อย สิ่งที่หนีไม่พ้นในการเขียนเว็บแอพคือ มันต้องมีการใช้งานคุ๊กกี้กันบ้างล่ะ จริงไหม ^^ ในบทความนี้จะเกี่ยวกับการเขียนเทสข้อมูลในคุ๊กกี้ด้วย

ใน Flask framework จะมีฟังก์ชัน test_client() ที่จะสร้าง instance ของคลาส werkzeug.test.Client ขึ้นมาเพื่อใช้เทสเว็บแอพของเรา ก่อนอื่นก็ติดตั้ง package ที่เราต้องการก่อนนั่นก็คือ Flask

pip install flask

เริ่มด้วยการสร้างไฟล์ hello_test.py เพื่อเขียนเทสเรียกไปที่ /hello/{name} สิ่งที่เราอยากเห็นเมื่อเข้าไปที่ลิงค์นี้คือ Hello, {name}

import unittest
import hello

class HelloTest(unittest.TestCase):
  def setUp(self):
    self.app = hello.app.test_client()

  def test_hello_name(self):
    response = self.app.get('/hello/Flask')
    self.assertEqual('Hello, Flask', response.data)

จากนั้นก็ลองรัน unittest ครับ แน่นอนว่าตั้ง fail แน่เพราะยังไม่ได้สร้างอะไรเลย ^^

Run unittest fail

เราก็ไปสร้างไฟล์ชื่อ hello.py และสร้าง Flask app ไว้ตามเทสที่เราเขียนไว้ครับ

import flask
app = flask.Flask(__name__)

@app.route('/hello/<name>')
def hello(name):
  return "Hello, %s" % name

if __name__ == '__main__':
  app.run()

จากนั้นก็ลองรัน unitttest อีกทีครับ คราวนี้น่าจะผ่านแล้วนะ ^^

Run unittest OK
พอ Hello, Name เสร็จแล้ว เกิดอยากเพิ่มลูกเล่นขึ้นมาอีกนิด เอาเป็นว่าถ้าใครที่เคยเข้ามาที่ลิงค์ /hello/{name} แล้ว พอกลับเข้ามาอีกครั้งให้เปลี่ยนจากคำว่า Hello, เป็นครับว่า Welcome back, แทน วิธีที่ผมเลือกใช้ก็คือสร้างคุ๊กกี้ไว้ที่เบราว์เซอร์ของผู้ใช้ตอนเข้ามาครั้งแรก จากนั้น ก่อนที่จะส่งข้อความทักทายออกไปก็ให้ตรวจสอบดูก่อนว่ามีคุ๊กกี้อยู่รีป่าว  ถ้ามีก็ให้ใช้คำว่า Welcome back แทนคำว่า Hello ครับ

วิธีการเซตค่าคุ๊กกี้ให้กับ Test Client นั้นสามารถทำได้ง่ายด้วยฟังก์ชั่น set_cookie ครับ ตัวอย่างนี้ผมจะสร้างคุ๊กกี้ชื่อ visited ให้มีค่าเป็น 1 ก็ทำได้ดังนี้ครับ

def test_revisit_say_welcome_back(self):
     self.app.set_cookie('localhost', 'visited', '1')
     response = self.app.get('/hello/Revisit')
     self.assertEqual('Welcome back, Revisit', response.data)

ส่วนวิธีเช็คว่ามีการสร้างคุ๊กกี้ให้กับผู้ใช้ตอนเข้ามาที่ลิงค์ /hello/{name} รึป่าวนั้น  ก็ใช้วิธีเช็คจาก Headers ที่ทางแอพส่งกลับไปให้กับ client เลยครับ

def test_create_cookie_visited(self):
     response = self.app.get('/hello/Cookie')
     self.assertTrue('visited=1' in response.headers['Set-cookie'])

สามารถเข้าไปดูโค้ดเต็มๆ ได้ที่ github.com/gigkokman/helloflask