2013-08-17 3 views
8

Come posso scrivere un test di unità per un gestore di tornado che autentica un utente tramite un cookie sicuro? Ecco il codice (e il codice sudo) per un test fittizio che mi piacerebbe fare passare. Sto usando Tornado 3.1.Come utilizzare un gestore di test server di tornado che autentica un utente tramite un cookie sicuro

from tornado.web import Application, RequestHandler 
from tornado.escape import to_unicode, json_decode, json_encode 
from tornado.testing import AsyncHTTPTestCase 

class MainHandler(RequestHandler): 
    """ 
    Base handler to authenticate user via a secure cookie. 
    This is used for an API. 
    """ 
    def get(self): 

     user = self.get_secure_cookie('user') 

     if user == 'user_email': 
      self.write('sucess') 
     else: 
      self.write('fail') 

class UserAPITest(AsyncHTTPTestCase): 
    def get_app(self): 
     self.app = Application([('/', MainHandler)], 
        cookie_secret='asdfasdf') 
     return self.app 

    def test_user_profile_annoymous(self): 
     #SUDO CODE (what should go here?) 
     #cookie = make_secure_cookie('user', 'user_email', cookie_secret) 
     #headers = {'Cookie':cookie} 

     response = self.fetch('/', method='GET', headers=headers) 
     self.assertEqual('sucess', to_unicode(response.body)) 

risposta

9

Utilizzando mock:

import mock 

... 

class UserAPITest(AsyncHTTPTestCase): 
    def get_app(self): 
     self.app = Application([('/', MainHandler)], 
        cookie_secret='asdfasdf') 
     return self.app 

    def test_user_profile_annoymous(self): 
     with mock.patch.object(MainHandler, 'get_secure_cookie') as m: 
      m.return_value = 'user_email' 
      response = self.fetch('/', method='GET') 
     self.assertEqual('sucess', to_unicode(response.body)) 
+0

Grazie per il suggerimento finta. Funziona magnificamente. – wroscoe

6

Sembra si può tentare di utilizzare una funzione create_signed_value dal modulo tornado.web:

from tornado.web import create_signed_value 

class UserAPITest(AsyncHTTPTestCase): 

    def get_app(self): 
     self.app = Application([('/', MainHandler)], 
           cookie_secret='asdfasdf') 
     return self.app 

    def test_user_profile_annoymous(self): 
     cookie_name, cookie_value = 'Cookie', 'value' 
     secure_cookie = create_signed_value(
      self.app.settings["cookie_secret"], 
      cookie_name, 
      cookie_value) 
     headers = {'Cookie': '='.join((cookie_name, secure_cookie))} 

     response = self.fetch('/', method='GET', headers=headers) 
     self.assertEqual('success', response.body) 
+1

Grazie. Questo supera il mio test unitario. – wroscoe

Problemi correlati