2010-04-28 4 views
6

У меня возникла проблема с модульными тестами для авторизации в приложении Pylons. Похоже, что определенные файлы cookie, установленные в тестовом примере, могут быть неправильно написаны или проанализированы. Файлы cookie прекрасно работают при удалении приложения с помощью браузера.Ошибка авторизации устройства в приложении Pylons; файлы cookie не были правильно установлены или записаны

Вот мой тест внутри пасты сгенерированных TestController:

def test_good_login(self): 
    r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password}) 
    r = r.follow() # Should only be one redirect to root 
    assert 'http://localhost/' == r.request.url 
    assert 'Dashboard' in r 

Это должно проверить, что Войти в существующую учетную запись форвардов пользователя на странице приборной панели. Вместо этого происходит то, что пользователь перенаправляется обратно на логин. Первый POST работает, устанавливает пользователя в сеанс и возвращает файлы cookie. Хотя эти файлы cookie отправляются в следующем запросе, они, похоже, не обрабатываются правильно.

Я начинаю, установив точку останова в начале описанного выше способа и увидеть, что ответ Войти возвращает:

> nosetests --pdb --pdb-failure -s foo.tests.functional.test_account:TestMainController.test_good_login 
Running setup_config() from foo.websetup 
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(33)test_good_login() 
-> r = self.app.post('/dologin', params={'login': self.user['username'], 'password': self.password}) 
(Pdb) n 
> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(34)test_good_login() 
-> r = r.follow() # Should only be one redirect to root 
(Pdb) p r.cookies_set 
{'auth_tkt': '"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!"'} 
(Pdb) p r.request.environ['REMOTE_USER'] 
'4bd871833d19ad8a79000000' 
(Pdb) p r.headers['Location'] 
'http://localhost/?__logins=0' 

Сеанс, как представляется, будет создан и печенье отправляется обратно. Браузер перенаправляется на корень, а не на вход в систему, что также указывает на успешный вход в систему. Если бы я пройти мимо последующих(), я получаю:

> /Users/istevens/dev/foo/foo/tests/functional/test_account.py(35)test_good_login() 
-> assert 'http://localhost/' == r.request.url 
(Pdb) p r.request.headers 
{'Host': 'localhost:80', 'Cookie': 'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; '} 
(Pdb) p r.request.environ['REMOTE_USER'] 
*** KeyError: KeyError('REMOTE_USER',) 
(Pdb) p r.request.environ['HTTP_COOKIE'] 
'auth_tkt=""\\"4c898eb72f7ad38551eb11e1936303374bd871934bd871833d19ad8a79000000!\\"""; ' 
(Pdb) p r.request.cookies 
{'auth_tkt': ''} 
(Pdb) p r 
<302 Found text/html location: http://localhost/login?__logins=1&came_from=http%3A%2F%2Flocalhost%2F body='302 Found...y. '/149> 

Это указывает мне, что печенье было передано в по просьбе, хотя и с сомнительной побега. Похоже, что среда не имеет сеанса, созданного по предыдущему запросу. Файл cookie был скопирован в окружение из заголовков, но файлы cookie в запросе кажутся неправильно установленными. Наконец, пользователь перенаправляется на страницу входа в систему, указывая, что пользователь не вошел в систему.

Авторизация в приложении выполняется через repoze.who и repoze.who.plugins.ldap с repoze.who_friendlyform, выполняющим вызов , Я использую запас tests.TestController созданный пасте:

class TestController(TestCase): 

    def __init__(self, *args, **kwargs): 
     if pylons.test.pylonsapp: 
      wsgiapp = pylons.test.pylonsapp 
     else: 
      wsgiapp = loadapp('config:%s' % config['__file__']) 
     self.app = TestApp(wsgiapp) 
     url._push_object(URLGenerator(config['routes.map'], environ)) 
     TestCase.__init__(self, *args, **kwargs) 

Это webtest.TestApp, кстати.

Кодирование печенья осуществляется в webtest.TestApp с помощью Cookie:

>>> from Cookie import _quote 
>>> _quote('"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!"') 
'"\\"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!\\""' 

Я уверен, что это правильно.

Я полагаю, что что-то на стороне ответа неправильно анализирует данные cookie на cookies в запросе на стороне сервера. Но что? Есть идеи?

+0

В патче Trac есть патч, в котором фиксируются/игнорируются значения cookie, которые являются «кавычками» вместо простых «токенов». Убедитесь, что вы также получили патч в комментариях (первый патч не исправил все): http: //trac.pythonpaste.org/pythonpaste/ticket/387 –

ответ

5

Эта проблема исчезла после понижения WebTest с 1.2.1 до 1.2.

+1

howto downgrade using pip: $ pip install webtest == 1.2 –

2

Вопрос постоянно появлялся для меня независимо от версии WebTest. Однако после многократного разговора я заметил, что когда cookie был впервые установлен, он использовал 127.0.0.1 в качестве значения REMOTE_ADDR, а во втором запросе он изменился на 0.0.0.0.

Если я сделал запрос на получение и установил REMOTE_ADDR на 127.0.0.1, все было хорошо!

response = response.goto(url('home'), extra_environ=dict(REMOTE_ADDR='127.0.0.1'))