Unidad de prueba de autorización en una aplicación falla Torres de alta tensión; Las cookies no se han establecido o registrados correctamente
Pregunta
Estoy teniendo un problema de ejecutar las pruebas unitarias de autorización en una aplicación de los pilones. Parece como si determinadas cookies creadas en el caso de prueba no pueden ser escritos o analizan correctamente. Las cookies funcionan bien cuando se golpea la aplicación con un navegador.
Esta es mi caso de prueba dentro de un TestController generada pastosa:
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
Esto se supone que prueba que un inicio de sesión de una cuenta existente hacia delante al usuario a la página de panel. En su lugar, lo que sucede es que el usuario es redirigido de nuevo a la entrada. El primer mensaje funciona, establece el usuario en la sesión y devuelve las cookies. A pesar de esas galletas son enviados en la solicitud de seguimiento, no parece que hacer para ser analizada correctamente.
Para empezar, establezca un punto de interrupción al principio del método anterior y ver lo que los rendimientos de respuesta de inicio de sesión:
> 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'
Una sesión parece ser creado y enviado de vuelta una cookie. El navegador es redirigido a la raíz, no el inicio de sesión, lo que también indica un inicio de sesión correcto. Si me paso más allá del seguimiento (), me sale:
> /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>
Esto me indica que la cookie se aprobó en la solicitud, aunque con escape dudosa. El Environ parece ser sin la sesión creada en la solicitud anterior. La cookie se ha copiado en el Environ de las cabeceras, pero las cookies en la solicitud parece mal ajustado. Por último, el usuario es redirigido a la página de inicio de sesión, lo que indica que el usuario no está conectado.
Autorización de la aplicación se realiza a través repoze.who y repoze.who.plugins.ldap con repoze.who_friendlyform realizar el desafío. Estoy usando el tests.TestController
Stock creado por pegar:
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)
Eso es un webtest.TestApp
, por cierto.
La codificación de la cookie se realiza en webtest.TestApp usando Cookie:
>>> from Cookie import _quote
>>> _quote('"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!"')
'"\\"84533cf9f661f97239208fb844a09a6d4bd8552d4bd8550c3d19ad8339000000!\\""'
Confío en que eso es correcto.
Mi conjetura es que algo en el lado respuesta es analizar incorrectamente los datos de las cookies en cookies
en la solicitud del lado del servidor. ¿Pero que? Algunas ideas?
Solución
Este problema desapareció después de degradar WebTest de 1.2.1 a 1.2.
Otros consejos
El número apareció continuamente para mí, independientemente de la versión de WebTest. Sin embargo, después de mucho al rededor me di cuenta de que cuando la cookie era primer conjunto que estaba usando 127.0.0.1 como el valor REMOTE_ADDR pero en la segunda petición se cambió a 0.0.0.0.
Si lo hiciera la solicitud de obtener y establecer el REMOTE_ADDR a 127.0.0.1 todo estaba bien!
response = response.goto(url('home'), extra_environ=dict(REMOTE_ADDR='127.0.0.1'))