summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-11 22:43:27 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-11 22:43:27 +0000
commitb0a24149ffc4dd3b945b496e5cdb01111c8cf29a (patch)
treeda0d31fa9c46eb4e990c0df3dd116e8fa38dcd5c
parentd69635eb6237055e8b3ccedeeaa7114a7beed057 (diff)
downloadpyramid-b0a24149ffc4dd3b945b496e5cdb01111c8cf29a.tar.gz
pyramid-b0a24149ffc4dd3b945b496e5cdb01111c8cf29a.tar.bz2
pyramid-b0a24149ffc4dd3b945b496e5cdb01111c8cf29a.zip
- Improve test coverage.
- Remove old cold which attempts to recover from trying to unpickle a ``z3c.pt`` template; Chameleon has been the templating engine for a good long time now. Running repoze.bfg against a sandbox that has pickled ``z3c.pt`` templates it will now just fail with an unpickling error, but can be fixed by deleting the template cache files.
-rw-r--r--CHANGES.txt15
-rw-r--r--repoze/bfg/chameleon_genshi.py16
-rw-r--r--repoze/bfg/chameleon_zpt.py15
-rw-r--r--repoze/bfg/path.py1
-rw-r--r--repoze/bfg/security.py3
-rw-r--r--repoze/bfg/templating.py9
-rw-r--r--repoze/bfg/tests/test_location.py22
-rw-r--r--repoze/bfg/tests/test_security.py38
-rw-r--r--repoze/bfg/tests/test_templating.py59
-rw-r--r--repoze/bfg/tests/test_testing.py7
-rw-r--r--repoze/bfg/tests/test_wsgi.py13
-rw-r--r--repoze/bfg/view.py15
12 files changed, 165 insertions, 48 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 2bc8a3ca2..940c8d1cc 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -4,6 +4,21 @@ After 0.6.1
Features
--------
+- Tests can be run with coverage output if you've got ``nose``
+ installed in the interpreter which you use to run tests. Using an
+ interpreter with ``nose`` installed, do ``python setup.py
+ nosetests`` within a checkout of the ``repoze.bfg`` package to see
+ test coverage output.
+
+- Improve test coverage.
+
+- Remove old cold which attempts to recover from trying to unpickle a
+ ``z3c.pt`` template; Chameleon has been the templating engine for a
+ good long time now. Running repoze.bfg against a sandbox that has
+ pickled ``z3c.pt`` templates it will now just fail with an
+ unpickling error, but can be fixed by deleting the template cache
+ files.
+
- Added a ``post`` argument to the ``repoze.bfg.testing:DummyRequest``
constructor.
diff --git a/repoze/bfg/chameleon_genshi.py b/repoze/bfg/chameleon_genshi.py
index f3541ba4b..3d8472203 100644
--- a/repoze/bfg/chameleon_genshi.py
+++ b/repoze/bfg/chameleon_genshi.py
@@ -1,5 +1,3 @@
-import os
-
from webob import Response
from zope.component import queryUtility
@@ -21,19 +19,7 @@ class GenshiTemplateRenderer(object):
implements(ITemplateRenderer)
def __init__(self, path, auto_reload=False):
- try:
- self.template = GenshiTemplateFile(path, auto_reload=auto_reload)
- except ImportError, why:
- why = str(why)
- if 'z3c.pt' in why:
- # unpickling error due to move from z3c.pt -> chameleon
- cachefile = '%s.cache' % path
- if os.path.isfile(cachefile):
- os.remove(cachefile)
- self.template = GenshiTemplateFile(path,
- auto_reload=auto_reload)
- else:
- raise
+ self.template = GenshiTemplateFile(path, auto_reload=auto_reload)
def implementation(self):
return self.template
diff --git a/repoze/bfg/chameleon_zpt.py b/repoze/bfg/chameleon_zpt.py
index c7d1d6949..f7e9edadf 100644
--- a/repoze/bfg/chameleon_zpt.py
+++ b/repoze/bfg/chameleon_zpt.py
@@ -1,5 +1,3 @@
-import os
-
from webob import Response
from zope.component import queryUtility
@@ -21,18 +19,7 @@ class ZPTTemplateRenderer(object):
implements(ITemplateRenderer)
def __init__(self, path, auto_reload=False):
- try:
- self.template = PageTemplateFile(path, auto_reload=auto_reload)
- except ImportError, why:
- why = str(why)
- if 'z3c.pt' in why:
- # unpickling error due to move from z3c.pt -> chameleon
- cachefile = '%s.cache' % path
- if os.path.isfile(cachefile):
- os.remove(cachefile)
- self.template = PageTemplateFile(path, auto_reload=auto_reload)
- else:
- raise
+ self.template = PageTemplateFile(path, auto_reload=auto_reload)
def implementation(self):
return self.template
diff --git a/repoze/bfg/path.py b/repoze/bfg/path.py
index 68fa4ede4..fcd317fba 100644
--- a/repoze/bfg/path.py
+++ b/repoze/bfg/path.py
@@ -9,7 +9,6 @@ def caller_path(path, level=2):
prefix = package_path(package)
path = os.path.join(prefix, path)
return path
- return os.path.normpath(path)
def package_path(package):
return os.path.abspath(os.path.dirname(package.__file__))
diff --git a/repoze/bfg/security.py b/repoze/bfg/security.py
index 860f4a0fd..bdf40d8bc 100644
--- a/repoze/bfg/security.py
+++ b/repoze/bfg/security.py
@@ -305,9 +305,10 @@ class ViewPermission(object):
self.permission_name)
def __repr__(self):
+ view_name = getattr(self.request, 'view_name', None)
return '<Permission at %s named %r for %r>' % (id(self),
self.permission_name,
- self.request.view_name)
+ view_name)
class ViewPermissionFactory(object):
implements(IViewPermissionFactory)
diff --git a/repoze/bfg/templating.py b/repoze/bfg/templating.py
index a8f10ae8f..ce2833415 100644
--- a/repoze/bfg/templating.py
+++ b/repoze/bfg/templating.py
@@ -1,6 +1,5 @@
from zope.component import queryUtility
from repoze.bfg.interfaces import ITemplateRenderer
-from zope.component.interfaces import ComponentLookupError
from zope.component import getSiteManager
from repoze.bfg.path import caller_path
import os
@@ -18,12 +17,8 @@ def renderer_from_cache(path, factory, level=3, **kw):
if not os.path.exists(abspath):
raise ValueError('Missing template file: %s' % abspath)
renderer = factory(abspath, **kw)
- try:
- sm = getSiteManager()
- except ComponentLookupError:
- pass
- else:
- sm.registerUtility(renderer, ITemplateRenderer, name=abspath)
+ sm = getSiteManager()
+ sm.registerUtility(renderer, ITemplateRenderer, name=abspath)
return renderer
diff --git a/repoze/bfg/tests/test_location.py b/repoze/bfg/tests/test_location.py
index fc8f8c621..f297a9d6c 100644
--- a/repoze/bfg/tests/test_location.py
+++ b/repoze/bfg/tests/test_location.py
@@ -75,6 +75,28 @@ class TestLocation(unittest.TestCase):
result = list(lineage(o1))
self.assertEqual(result, [o1])
+class TestClassAndInstanceDescr(unittest.TestCase):
+ def _getTargetClass(self):
+ from repoze.bfg.location import ClassAndInstanceDescr
+ return ClassAndInstanceDescr
+
+ def _makeOne(self, *arg):
+ return self._getTargetClass()(*arg)
+
+ def test__get__noinst(self):
+ def f(ob):
+ return ob
+ ob = self._makeOne(f, f)
+ result = ob.__get__(None, 1)
+ self.assertEqual(result, 1)
+
+ def test__get__withinst(self):
+ def f(ob):
+ return ob
+ ob = self._makeOne(f, f)
+ result = ob.__get__(1, 2)
+ self.assertEqual(result, 1)
+
from repoze.bfg.interfaces import ILocation
from zope.interface import implements
class Location(object):
diff --git a/repoze/bfg/tests/test_security.py b/repoze/bfg/tests/test_security.py
index 5fa554629..449933c7e 100644
--- a/repoze/bfg/tests/test_security.py
+++ b/repoze/bfg/tests/test_security.py
@@ -343,6 +343,13 @@ class TestRemoteUserACLSecurityPolicy(unittest.TestCase, PlacelessSetup):
result = policy.authenticated_userid(request)
self.assertEqual(result, 'fred')
+ def test_authenticated_userid_no_remote_user(self):
+ context = DummyContext()
+ request = DummyRequest({})
+ policy = self._makeOne()
+ result = policy.authenticated_userid(request)
+ self.assertEqual(result, None)
+
def test_effective_principals(self):
context = DummyContext()
request = DummyRequest({'REMOTE_USER':'fred'})
@@ -352,6 +359,13 @@ class TestRemoteUserACLSecurityPolicy(unittest.TestCase, PlacelessSetup):
from repoze.bfg.security import Authenticated
self.assertEqual(result, [Everyone, Authenticated, 'fred'])
+ def test_effective_principals_no_remote_user(self):
+ context = DummyContext()
+ request = DummyRequest({})
+ policy = self._makeOne()
+ result = policy.effective_principals(request)
+ from repoze.bfg.security import Everyone
+ self.assertEqual(result, [Everyone])
class TestRepozeWhoIdentityACLSecurityPolicy(unittest.TestCase, PlacelessSetup):
def _getTargetClass(self):
@@ -381,6 +395,13 @@ class TestRepozeWhoIdentityACLSecurityPolicy(unittest.TestCase, PlacelessSetup):
result = policy.authenticated_userid(request)
self.assertEqual(result, 'fred')
+ def test_authenticated_userid_no_who_ident(self):
+ context = DummyContext()
+ request = DummyRequest({})
+ policy = self._makeOne()
+ result = policy.authenticated_userid(request)
+ self.assertEqual(result, None)
+
def test_effective_principals(self):
context = DummyContext()
identity = {'repoze.who.identity':{'repoze.who.userid':'fred'}}
@@ -391,6 +412,13 @@ class TestRepozeWhoIdentityACLSecurityPolicy(unittest.TestCase, PlacelessSetup):
from repoze.bfg.security import Authenticated
self.assertEqual(result, [Everyone, Authenticated, 'fred'])
+ def test_effective_principals_no_who_ident(self):
+ context = DummyContext()
+ request = DummyRequest({})
+ policy = self._makeOne()
+ result = policy.effective_principals(request)
+ from repoze.bfg.security import Everyone
+ self.assertEqual(result, [Everyone])
class TestAPIFunctions(unittest.TestCase, PlacelessSetup):
def setUp(self):
@@ -472,6 +500,16 @@ class TestViewPermission(unittest.TestCase):
self.assertEqual(result, True)
self.assertEqual(secpol.checked, (context, request, 'repoze.view'))
+ def test_repr(self):
+ context = DummyContext()
+ request = DummyRequest({})
+ request.view_name = 'viewname'
+ secpol = DummySecurityPolicy(True)
+ permission = self._makeOne(context, request, 'repoze.view')
+ result = repr(permission)
+ self.failUnless(result.startswith('<Permission at '))
+ self.failUnless(result.endswith(" named 'repoze.view' for 'viewname'>"))
+
class TestViewPermissionFactory(unittest.TestCase):
def _getTargetClass(self):
from repoze.bfg.security import ViewPermissionFactory
diff --git a/repoze/bfg/tests/test_templating.py b/repoze/bfg/tests/test_templating.py
new file mode 100644
index 000000000..3429b0839
--- /dev/null
+++ b/repoze/bfg/tests/test_templating.py
@@ -0,0 +1,59 @@
+import unittest
+from zope.testing.cleanup import cleanUp
+
+from repoze.bfg import testing
+
+class TestRendererFromCache(unittest.TestCase):
+ def setUp(self):
+ cleanUp()
+
+ def tearDown(self):
+ cleanUp()
+
+ def _callFUT(self, path, factory, level=3, **kw):
+ from repoze.bfg.templating import renderer_from_cache
+ return renderer_from_cache(path, factory, level, **kw)
+
+ def test_relpath_found(self):
+ renderer = {}
+ from repoze.bfg.interfaces import ITemplateRenderer
+ testing.registerUtility(renderer, ITemplateRenderer, name='foo/bar')
+ result = self._callFUT('foo/bar', None)
+ self.failUnless(renderer is result)
+
+ def test_abspath_found(self):
+ import os
+ here = os.path.dirname(__file__)
+ abspath = os.path.join(here, 'foo/bar')
+ from repoze.bfg.interfaces import ITemplateRenderer
+ renderer = {}
+ testing.registerUtility(renderer, ITemplateRenderer, name=abspath)
+ result = self._callFUT('foo/bar', None)
+ self.failUnless(renderer is result)
+
+ def test_notfound_missing(self):
+ import os
+ here = os.path.dirname(__file__)
+ abspath = os.path.join(here, 'foo/bar')
+ renderer = {}
+ self.assertRaises(ValueError, self._callFUT, 'foo/bar', None)
+
+ def test_withfactory(self):
+ renderer = {}
+ factory = DummyFactory(renderer)
+ import os
+ here = os.path.dirname(__file__)
+ abspath = os.path.join(here, 'pp.pt')
+ from repoze.bfg.interfaces import ITemplateRenderer
+ testing.registerUtility(renderer, ITemplateRenderer, name=abspath)
+ result = self._callFUT('pp.pt', factory)
+ self.failUnless(renderer is result)
+
+class DummyFactory:
+ def __init__(self, renderer):
+ self.renderer = renderer
+
+ def __call__(self, path, **kw):
+ self.path = path
+ self.kw = kw
+ return self.renderer
diff --git a/repoze/bfg/tests/test_testing.py b/repoze/bfg/tests/test_testing.py
index 38d41be06..a92e340fc 100644
--- a/repoze/bfg/tests/test_testing.py
+++ b/repoze/bfg/tests/test_testing.py
@@ -311,7 +311,7 @@ class TestDummyModel(unittest.TestCase):
self.assertEqual(clone.__parent__, 'parent2')
self.assertEqual(clone.foo, 1)
- def test_keys_items_values(self):
+ def test_keys_items_values_len(self):
class Dummy:
pass
model = self._makeOne()
@@ -320,6 +320,11 @@ class TestDummyModel(unittest.TestCase):
self.assertEqual(model.values(), model.subs.values())
self.assertEqual(model.items(), model.subs.items())
self.assertEqual(model.keys(), model.subs.keys())
+ self.assertEqual(len(model), 2)
+
+ def test_nonzero(self):
+ model = self._makeOne()
+ self.assertEqual(model.__nonzero__(), True)
class TestDummyRequest(unittest.TestCase):
def _getTargetClass(self):
diff --git a/repoze/bfg/tests/test_wsgi.py b/repoze/bfg/tests/test_wsgi.py
index d905350d6..4c36850b6 100644
--- a/repoze/bfg/tests/test_wsgi.py
+++ b/repoze/bfg/tests/test_wsgi.py
@@ -18,6 +18,19 @@ class WSGIAppTests(unittest.TestCase):
self.assertEqual(response.headerlist, headerlist)
self.assertEqual(response.app_iter, [body])
+ def test_decorator_startresponse_uncalled(self):
+ body = 'Unauthorized'
+ headerlist = [ ('Content-Type', 'text/plain'),
+ ('Content-Length', len(body)) ]
+ status = '401 Unauthorized'
+ def real_wsgiapp(environ, start_response):
+ return [body]
+ from repoze.bfg.wsgi import wsgiapp
+ wrapped = wsgiapp(real_wsgiapp)
+ context = DummyContext()
+ request = DummyRequest({})
+ self.assertRaises(RuntimeError, wrapped, context, request)
+
class DummyContext:
pass
diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py
index abb3997e3..39829af62 100644
--- a/repoze/bfg/view.py
+++ b/repoze/bfg/view.py
@@ -153,13 +153,10 @@ class static(object):
ecopy['PATH_INFO'] = '/' + subpath
ecopy['SCRIPT_NAME'] = ''
body = self.app(ecopy, catch_start_response)
- if caught:
- status, headers, exc_info = caught
- response = Response()
- response.app_iter = body
- response.status = status
- response.headerlist = headers
- return response
- else:
- raise RuntimeError('WSGI start_response not called')
+ status, headers, exc_info = caught
+ response = Response()
+ response.app_iter = body
+ response.status = status
+ response.headerlist = headers
+ return response