У меня есть проблема рабочие модульные тесты на авторизацию в приложении Опор. Появляется, как будто определенные настройки куки в тестовом сценарии не могут быть правильно записаны или проанализированы. 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'
Сессия, кажется, создается, и cookie передаются обратно. Браузер перенаправляется к корню, не входу в систему, который также указывает на успешный вход в систему. Если я ступаю мимо следования (), я добираюсь:
> /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 был скопирован в окружение от заголовков, но 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)
Это - a webtest.TestApp
, между прочим.
Кодирование cookie сделано в webtest. TestApp с помощью Cookie:
>>> from Cookie import _quote
>>> _quote('"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!"')
'"\\"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!\\""'
Я полагаю, что это корректно.
Мое предположение - то, что что-то на стороне ответа неправильно анализирует cookie-данные в cookies
в запросе серверной стороны. Но что? Какие-либо идеи?
Эта проблема исчезла после понижения версии WebTest с 1.2.1 до 1.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'))