summaryrefslogtreecommitdiff
path: root/repoze/bfg/tests/test_view.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2010-08-08 07:25:28 +0000
committerChris McDonough <chrism@agendaless.com>2010-08-08 07:25:28 +0000
commitd96ff9144f98bb44254f77f56e55967c46b09774 (patch)
tree7cabc160ce28460ebffd70a5e419f1c74178bd96 /repoze/bfg/tests/test_view.py
parent9192964c9ccc4b0c1c2f1948af1b62012a11ef7c (diff)
downloadpyramid-d96ff9144f98bb44254f77f56e55967c46b09774.tar.gz
pyramid-d96ff9144f98bb44254f77f56e55967c46b09774.tar.bz2
pyramid-d96ff9144f98bb44254f77f56e55967c46b09774.zip
- New public interface: ``repoze.bfg.exceptions.IExceptionResponse``.
This interface is provided by all internal exception classes (such as ``repoze.bfg.exceptions.NotFound`` and ``repoze.bfg.exceptions.Forbidden``), instances of which are both exception objects and can behave as WSGI response objects. This interface is made public so that exception classes which are also valid WSGI response factories can be configured to implement them or exception instances which are also or response instances can be configured to provide them. - New API class: ``repoze.bfg.view.AppendSlashNotFoundViewFactory`` (undoes previous custom_notfound_view on request passsed to append_slash_notfound_view). - Previously, two default view functions were registered at Configurator setup (one for ``repoze.bfg.exceptions.NotFound`` named ``default_notfound_view`` and one for ``repoze.bfg.exceptions.Forbidden`` named ``default_forbidden_view``) to render internal exception responses. Those default view functions have been removed, replaced with a generic default view function which is registered at Configurator setup for the ``repoze.bfg.interfaces.IExceptionResponse`` interface that simply returns the exception instance; the ``NotFound` and ``Forbidden`` classes are now still exception factories but they are also response factories which generate instances that implement the new ``repoze.bfg.interfaces.IExceptionResponse`` interface.
Diffstat (limited to 'repoze/bfg/tests/test_view.py')
-rw-r--r--repoze/bfg/tests/test_view.py119
1 files changed, 51 insertions, 68 deletions
diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py
index 27f468c74..18a46a205 100644
--- a/repoze/bfg/tests/test_view.py
+++ b/repoze/bfg/tests/test_view.py
@@ -342,59 +342,7 @@ class TestBFGViewDecorator(unittest.TestCase):
self.assertEqual(settings[0]['renderer'],
'repoze.bfg.tests:fixtures/minimal.pt')
-class TestDefaultView(BaseTest):
- def test_no_registry_on_request(self):
- request = None
- context = Exception()
- response = self._callFUT(context, request)
- self.assertEqual(response.status, self.status)
- self.failUnless('<code></code>' in response.body)
-
- def test_nomessage(self):
- request = self._makeRequest()
- context = Exception()
- response = self._callFUT(context, request)
- self.assertEqual(response.status, self.status)
- self.failUnless('<code></code>' in response.body)
-
- def test_withmessage(self):
- request = self._makeRequest()
- context = Exception('abc&123')
- response = self._callFUT(context, request)
- self.assertEqual(response.status, self.status)
- self.failUnless('<code>abc&amp;123</code>' in response.body)
-
- def test_context_not_exception(self):
- request = self._makeRequest()
- request.exception = Exception('woo')
- context = None
- response = self._callFUT(context, request)
- self.assertEqual(response.status, self.status)
- self.failUnless('<code>woo</code>' in response.body)
-
- def test_msg_exception_raised(self):
- request = self._makeRequest()
- context = None
- response = self._callFUT(context, request)
- self.assertEqual(response.status, self.status)
- self.failUnless('<code></code>' in response.body)
-
-class TestDefaultForbiddenView(TestDefaultView, unittest.TestCase):
- status = '401 Unauthorized'
-
- def _callFUT(self, context, request):
- from repoze.bfg.view import default_forbidden_view
- return default_forbidden_view(context, request)
-
-
-class TestDefaultNotFoundView(TestDefaultView, unittest.TestCase):
- status = '404 Not Found'
-
- def _callFUT(self, context, request):
- from repoze.bfg.view import default_notfound_view
- return default_notfound_view(context, request)
-
-class AppendSlashNotFoundView(BaseTest, unittest.TestCase):
+class Test_append_slash_notfound_view(BaseTest, unittest.TestCase):
def _callFUT(self, context, request):
from repoze.bfg.view import append_slash_notfound_view
return append_slash_notfound_view(context, request)
@@ -417,49 +365,81 @@ class AppendSlashNotFoundView(BaseTest, unittest.TestCase):
def test_context_is_not_exception(self):
request = self._makeRequest(PATH_INFO='/abc')
- request.exception = Exception('halloo')
+ request.exception = ExceptionResponse()
context = DummyContext()
response = self._callFUT(context, request)
self.assertEqual(response.status, '404 Not Found')
- self.failUnless('halloo' in response.body)
+ self.assertEqual(response.app_iter, ['Not Found'])
def test_no_mapper(self):
request = self._makeRequest(PATH_INFO='/abc')
- context = Exception()
+ context = ExceptionResponse()
response = self._callFUT(context, request)
self.assertEqual(response.status, '404 Not Found')
- def test_custom_notfound_view(self):
- request = self._makeRequest(PATH_INFO='/abc')
- def notfound(exc, request):
- return 'abc'
- request.custom_notfound_view = notfound
- context = Exception()
- response = self._callFUT(context, request)
- self.assertEqual(response, 'abc')
-
def test_no_path(self):
request = self._makeRequest()
- context = Exception()
+ context = ExceptionResponse()
self._registerMapper(request.registry, True)
response = self._callFUT(context, request)
self.assertEqual(response.status, '404 Not Found')
def test_mapper_path_already_slash_ending(self):
request = self._makeRequest(PATH_INFO='/abc/')
- context = Exception()
+ context = ExceptionResponse()
self._registerMapper(request.registry, True)
response = self._callFUT(context, request)
self.assertEqual(response.status, '404 Not Found')
def test_matches(self):
request = self._makeRequest(PATH_INFO='/abc')
- context = Exception()
+ context = ExceptionResponse()
self._registerMapper(request.registry, True)
response = self._callFUT(context, request)
self.assertEqual(response.status, '302 Found')
self.assertEqual(response.location, '/abc/')
+class TestAppendSlashNotFoundViewFactory(BaseTest, unittest.TestCase):
+ def _makeOne(self, notfound_view):
+ from repoze.bfg.view import AppendSlashNotFoundViewFactory
+ return AppendSlashNotFoundViewFactory(notfound_view)
+
+ def test_custom_notfound_view(self):
+ request = self._makeRequest(PATH_INFO='/abc')
+ context = ExceptionResponse()
+ def custom_notfound(context, request):
+ return 'OK'
+ view = self._makeOne(custom_notfound)
+ response = view(context, request)
+ self.assertEqual(response, 'OK')
+
+class Test_default_exceptionresponse_view(unittest.TestCase):
+ def _callFUT(self, context, request):
+ from repoze.bfg.view import default_exceptionresponse_view
+ return default_exceptionresponse_view(context, request)
+
+ def test_is_exception(self):
+ context = Exception()
+ result = self._callFUT(context, None)
+ self.failUnless(result is context)
+
+ def test_is_not_exception_no_request_exception(self):
+ context = object()
+ request = DummyRequest()
+ result = self._callFUT(context, request)
+ self.failUnless(result is context)
+
+ def test_is_not_exception_request_exception(self):
+ context = object()
+ request = DummyRequest()
+ request.exception = 'abc'
+ result = self._callFUT(context, request)
+ self.assertEqual(result, 'abc')
+
+class ExceptionResponse(Exception):
+ status = '404 Not Found'
+ app_iter = ['Not Found']
+ headerlist = []
class DummyContext:
pass
@@ -469,6 +449,9 @@ def make_view(response):
return response
return view
+class DummyRequest:
+ pass
+
class DummyResponse:
status = '200 OK'
headerlist = ()