diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-11 22:43:27 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-11 22:43:27 +0000 |
| commit | b0a24149ffc4dd3b945b496e5cdb01111c8cf29a (patch) | |
| tree | da0d31fa9c46eb4e990c0df3dd116e8fa38dcd5c | |
| parent | d69635eb6237055e8b3ccedeeaa7114a7beed057 (diff) | |
| download | pyramid-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.txt | 15 | ||||
| -rw-r--r-- | repoze/bfg/chameleon_genshi.py | 16 | ||||
| -rw-r--r-- | repoze/bfg/chameleon_zpt.py | 15 | ||||
| -rw-r--r-- | repoze/bfg/path.py | 1 | ||||
| -rw-r--r-- | repoze/bfg/security.py | 3 | ||||
| -rw-r--r-- | repoze/bfg/templating.py | 9 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_location.py | 22 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_security.py | 38 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_templating.py | 59 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_testing.py | 7 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_wsgi.py | 13 | ||||
| -rw-r--r-- | repoze/bfg/view.py | 15 |
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 |
