[Repoze-checkins] r743 - repoze.pam/trunk/repoze/pam

Chris McDonough chrism at agendaless.com
Tue Feb 26 06:00:45 UTC 2008


Author: Chris McDonough <chrism at agendaless.com>
Date: Tue Feb 26 01:00:44 2008
New Revision: 743

Log:
More middleware tests.

Test start response wrapper & make_registries.


Modified:
   repoze.pam/trunk/repoze/pam/middleware.py
   repoze.pam/trunk/repoze/pam/tests.py

Modified: repoze.pam/trunk/repoze/pam/middleware.py
==============================================================================
--- repoze.pam/trunk/repoze/pam/middleware.py	(original)
+++ repoze.pam/trunk/repoze/pam/middleware.py	Tue Feb 26 01:00:44 2008
@@ -229,13 +229,6 @@
             if hasattr(write, 'close'):
                 write.close()
 
-def flatten(L):
-    result = []
-    for seq in L:
-        for item in seq:
-            result.append(item)
-    return result
-
 def make_middleware(app, global_conf, config_file=None):
     if config_file is None:
         raise ValueError('config_file must be specified')
@@ -335,7 +328,7 @@
                 verify(value, iface)
             except BrokenImplementation, why:
                 why = str(why)
-                raise ValueError(name + ': ' + why)
+                raise ValueError(str(name) + ': ' + why)
             L = interface_registry.setdefault(iface, [])
             L.append(value)
             name_registry[name] = value

Modified: repoze.pam/trunk/repoze/pam/tests.py
==============================================================================
--- repoze.pam/trunk/repoze/pam/tests.py	(original)
+++ repoze.pam/trunk/repoze/pam/tests.py	Tue Feb 26 01:00:44 2008
@@ -238,6 +238,114 @@
         self.assertEqual(creds['password'], 'password')
         self.assertEqual(userid, 'chris_id2')
 
+    def test_challenge_noidentifier_noapp(self):
+        environ = self._makeEnviron()
+        challenger = DummyChallenger()
+        challenger.classifications = None
+        plugins = [ ('challenge', challenger) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        app = mw.challenge(environ, 'match', '401 Unauthorized',
+                               [], None, identity)
+        self.assertEqual(app, None)
+        self.assertEqual(environ['challenged'], app)
+
+    def test_challenge_noidentifier_withapp(self):
+        environ = self._makeEnviron()
+        app = DummyApp()
+        challenger = DummyChallenger(app)
+        challenger.classifications = None
+        plugins = [ ('challenge', challenger) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                               [], None, identity)
+        self.assertEqual(result, app)
+        self.assertEqual(environ['challenged'], app)
+
+    def test_challenge_identifier_noapp(self):
+        environ = self._makeEnviron()
+        challenger = DummyChallenger()
+        challenger.classifications = None
+        identifier = DummyIdentifier()
+        plugins = [ ('challenge', challenger) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                              [], identifier, identity)
+        self.assertEqual(result, None)
+        self.assertEqual(environ['challenged'], None)
+        self.assertEqual(identifier.forgotten, True)
+
+    def test_challenge_identifier_app(self):
+        environ = self._makeEnviron()
+        app = DummyApp()
+        challenger = DummyChallenger(app)
+        challenger.classifications = None
+        identifier = DummyIdentifier()
+        plugins = [ ('challenge', challenger) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                               [], identifier, identity)
+        self.assertEqual(result, app)
+        self.assertEqual(environ['challenged'], app)
+        self.assertEqual(identifier.forgotten, True)
+
+    def test_multi_challenge_firstwins(self):
+        environ = self._makeEnviron()
+        app1 = DummyApp()
+        app2 = DummyApp()
+        challenger1 = DummyChallenger(app1)
+        challenger1.classifications = None
+        challenger2 = DummyChallenger(app2)
+        challenger2.classifications = None
+        identifier = DummyIdentifier()
+        plugins = [ ('challenge1', challenger1), ('challenge2', challenger2) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                              [], identifier, identity)
+        self.assertEqual(result, app1)
+        self.assertEqual(environ['challenged'], app1)
+        self.assertEqual(identifier.forgotten, True)
+
+    def test_multi_challenge_skipnomatch_findimplicit(self):
+        environ = self._makeEnviron()
+        app1 = DummyApp()
+        app2 = DummyApp()
+        challenger1 = DummyChallenger(app1)
+        challenger1.classifications = ['nomatch']
+        challenger2 = DummyChallenger(app2)
+        challenger2.classifications = None
+        identifier = DummyIdentifier()
+        plugins = [ ('challenge1', challenger1), ('challenge2', challenger2) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                               [], identifier, identity)
+        self.assertEqual(result, app2)
+        self.assertEqual(environ['challenged'], app2)
+        self.assertEqual(identifier.forgotten, True)
+
+    def test_multi_challenge_skipnomatch_findexplicit(self):
+        environ = self._makeEnviron()
+        app1 = DummyApp()
+        app2 = DummyApp()
+        challenger1 = DummyChallenger(app1)
+        challenger1.classifications = ['nomatch']
+        challenger2 = DummyChallenger(app2)
+        challenger2.classifications = ['match']
+        identifier = DummyIdentifier()
+        plugins = [ ('challenge1', challenger1), ('challenge2', challenger2) ]
+        mw = self._makeOne(challengers = plugins)
+        identity = {'login':'chris', 'password':'password'}
+        result = mw.challenge(environ, 'match', '401 Unauthorized',
+                               [], identifier, identity)
+        self.assertEqual(result, app2)
+        self.assertEqual(environ['challenged'], app2)
+        self.assertEqual(identifier.forgotten, True)
+
     def test_call_remoteuser_already_set(self):
         environ = self._makeEnviron({'REMOTE_USER':'admin'})
         mw = self._makeOne()
@@ -245,6 +353,52 @@
         self.assertEqual(mw.app.environ, environ)
         self.assertEqual(result, [])
 
+    # XXX need more call tests
+
+class TestStartResponseWrapper(unittest.TestCase):
+    def _getTargetClass(self):
+        from repoze.pam.middleware import StartResponseWrapper
+        return StartResponseWrapper
+
+    def _makeOne(self, *arg, **kw):
+        plugin = self._getTargetClass()(*arg, **kw)
+        return plugin
+
+    def test_ctor(self):
+        wrapper = self._makeOne(None)
+        self.assertEqual(wrapper.start_response, None)
+        self.assertEqual(wrapper.headers, [])
+        self.failUnless(wrapper.buffer)
+    
+    def test_finish_response(self):
+        statuses = []
+        headerses = []
+        datases = []
+        closededs = []
+        from StringIO import StringIO
+        def write(data):
+            datases.append(data)
+        def close():
+            closededs.append(True)
+        write.close = close
+            
+        def start_response(status, headers):
+            statuses.append(status)
+            headerses.append(headers)
+            return write
+            
+        wrapper = self._makeOne(start_response)
+        wrapper.status = '401 Unauthorized'
+        wrapper.headers = [('a', '1')]
+        wrapper.buffer = StringIO('written')
+        extra_headers = [('b', '2')]
+        result = wrapper.finish_response(extra_headers)
+        self.assertEqual(result, None)
+        self.assertEqual(headerses[0], wrapper.headers + extra_headers)
+        self.assertEqual(statuses[0], wrapper.status)
+        self.assertEqual(datases[0], 'written')
+        self.assertEqual(closededs[0], True)
+
 class TestBasicAuthPlugin(Base):
     def _getTargetClass(self):
         from repoze.pam.plugins.basicauth import BasicAuthPlugin
@@ -628,7 +782,45 @@
                                      'REQUEST_METHOD':'GET'})
         result = classifier(environ)
         self.assertEqual(result, 'browser')
-    
+
+class TestMakeRegistries(unittest.TestCase):
+    def _getFUT(self):
+        from repoze.pam.middleware import make_registries
+        return make_registries
+
+    def test_empty(self):
+        fn = self._getFUT()
+        iface_reg, name_reg = fn([], [], [])
+        self.assertEqual(iface_reg, {})
+        self.assertEqual(name_reg, {})
+        
+    def test_brokenimpl(self):
+        fn = self._getFUT()
+        self.assertRaises(ValueError, fn, [(None, DummyApp())], [], [])
+
+    def test_ok(self):
+        fn = self._getFUT()
+        dummy_id1 = DummyIdentifier()
+        dummy_id2 = DummyIdentifier()
+        identifiers = [ ('id1', dummy_id1), ('id2', dummy_id2) ]
+        dummy_auth = DummyAuthenticator(None)
+        authenticators = [ ('auth', dummy_auth) ]
+        dummy_challenger = DummyChallenger(None)
+        challengers = [ ('challenger', dummy_challenger) ]
+        iface_reg, name_reg = fn(identifiers, authenticators, challengers)
+        from repoze.pam.interfaces import IIdentifier
+        from repoze.pam.interfaces import IAuthenticator
+        from repoze.pam.interfaces import IChallenger
+        self.assertEqual(iface_reg[IIdentifier], [dummy_id1, dummy_id2])
+        self.assertEqual(iface_reg[IAuthenticator], [dummy_auth])
+        self.assertEqual(iface_reg[IChallenger], [dummy_challenger])
+        self.assertEqual(name_reg['id1'], dummy_id1)
+        self.assertEqual(name_reg['id2'], dummy_id2)
+        self.assertEqual(name_reg['auth'], dummy_auth)
+        self.assertEqual(name_reg['challenger'], dummy_challenger)
+
+# XXX need make_middleware tests
+
 class DummyApp:
     def __call__(self, environ, start_response):
         self.environ = environ
@@ -679,8 +871,11 @@
         return None
 
 class DummyChallenger:
+    def __init__(self, app=None):
+        self.app = app
     def challenge(self, environ, status, app_headers, forget_headers):
-        environ['challenged'] = True
+        environ['challenged'] = self.app
+        return self.app
 
 class DummyChallengeDecider:
     def __call__(self, environ, status, headers):


More information about the Repoze-checkins mailing list