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

StackOverflow https://stackoverflow.com/questions/2731907

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?

¿Fue útil?

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'))
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top