2010-04-28 14 views
6

Ich habe ein Problem mit Unit-Tests zur Autorisierung in einer Pylons-App. Es scheint so, als ob bestimmte Cookies im Testfall nicht korrekt geschrieben oder analysiert werden. Cookies funktionieren gut, wenn Sie die App mit einem Browser aufrufen.Unit Testing Authorization in einer Pylons-App schlägt fehl; Cookies wurden nicht korrekt gesetzt oder aufgezeichnet

Hier ist mein Testfall innerhalb einer pasten erzeugt 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 

Dies, dass ein Login eines bestehenden Kontos leitet den Benutzer auf die Dashboard-Seite testen soll. Stattdessen wird der Benutzer zum Login zurückgeleitet. Der erste POST funktioniert, setzt den Benutzer in der Sitzung und gibt Cookies zurück. Obwohl diese Cookies in der folgenden Anfrage gesendet werden, scheinen sie nicht korrekt geparst zu sein.

Ich beginne mit einem Haltepunkt am Anfang des oben genannten Verfahrens einstellen und sehen, was die Login-Antwort zurückzugibt:

> 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' 

Eine Sitzung erscheint wieder erstellt und ein Cookie gesendet werden. Der Browser wird zum Root weitergeleitet, nicht zum Login, was ebenfalls auf eine erfolgreiche Anmeldung hinweist. Wenn ich über die Folge Schritt(), erhalte ich:

> /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> 

Dies zeigt mir, dass das Cookie wurde auf Antrag übergeben, wenn auch mit fragwürdigen Entkommen. Die Umgebung scheint ohne die auf der vorherigen Anforderung erstellte Sitzung zu sein. Der Cookie wurde von den Headern in die Umgebung kopiert, aber die Cookies in der Anfrage scheinen falsch gesetzt zu sein. Schließlich wird der Benutzer zur Anmeldeseite umgeleitet, die anzeigt, dass der Benutzer nicht angemeldet ist.

Die Autorisierung in der App erfolgt über repoze.who und repoze.who.plugins.ldap mit repoze.who_friendlyform, die die Herausforderung durchführt . Ich verwende den Bestand tests.TestController von Paste erstellt:

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) 

dass ein webtest.TestApp ist, nebenbei bemerkt.

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

Ich vertraue darauf, dass das richtig ist:

Die Codierung des Cookie wird in webtest.TestApp mit Plätzchen getan.

Meine Vermutung ist, dass etwas auf der Antwortseite die Cookie-Daten in cookies in der serverseitigen Anforderung falsch analysiert. Aber was? Irgendwelche Ideen?

+0

Es gibt einen Patch in Paste's Trac, der das Angeben/Aufheben von Cookie-Werten, die "quoted-strings" anstelle von einfachen "token" sind, behebt. Stellen Sie sicher, dass Sie den Patch auch in den Kommentaren erhalten (der erste Patch hat nicht alles repariert): http: //trac.pythonpaste.org/pythonpaste/ticket/387 –

Antwort

5

Dieses Problem ist nach dem Herunterstufen von WebTest von 1.2.1 auf 1.2 verschwunden.

+1

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

2

Das Problem erschien unabhängig von der Version von WebTest für mich ständig. Nach viel Mucking bemerkte ich jedoch, dass beim ersten Setzen des Cookies 127.0.0.1 als REMOTE_ADDR-Wert verwendet wurde, bei der zweiten Anforderung jedoch als 0.0.0.0.

Wenn ich die Get-Anfrage und die REMOTE_ADDR auf 127.0.0.1 gesetzt hatte, war alles gut!