diff options
Diffstat (limited to 'pyramid/tests/test_config.py')
| -rw-r--r-- | pyramid/tests/test_config.py | 738 |
1 files changed, 552 insertions, 186 deletions
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py index 9a92cd052..5f5bbdc53 100644 --- a/pyramid/tests/test_config.py +++ b/pyramid/tests/test_config.py @@ -10,7 +10,8 @@ except: class ConfiguratorTests(unittest.TestCase): def _makeOne(self, *arg, **kw): from pyramid.config import Configurator - return Configurator(*arg, **kw) + config = Configurator(*arg, **kw) + return config def _registerRenderer(self, config, name='.txt'): from pyramid.interfaces import IRendererFactory @@ -152,7 +153,7 @@ class ConfiguratorTests(unittest.TestCase): from pyramid.interfaces import IDebugLogger config = self._makeOne() logger = config.registry.getUtility(IDebugLogger) - self.assertEqual(logger.name, 'pyramid.debug') + self.assertEqual(logger.name, 'pyramid.tests') def test_ctor_noreg_debug_logger_non_None(self): from pyramid.interfaces import IDebugLogger @@ -211,7 +212,7 @@ class ConfiguratorTests(unittest.TestCase): view = self._getViewCallable(config, ctx_iface=IExceptionResponse, request_iface=IRequest) - self.assertTrue(view is default_exceptionresponse_view) + self.assertTrue(view.__wraps__ is default_exceptionresponse_view) def test_ctor_exceptionresponse_view_None(self): from pyramid.interfaces import IExceptionResponse @@ -230,7 +231,7 @@ class ConfiguratorTests(unittest.TestCase): view = self._getViewCallable(config, ctx_iface=IExceptionResponse, request_iface=IRequest) - self.assertTrue(view is exceptionresponse_view) + self.assertTrue(view.__wraps__ is exceptionresponse_view) def test_with_package_module(self): from pyramid.tests import test_configuration @@ -336,6 +337,7 @@ class ConfiguratorTests(unittest.TestCase): reg = DummyRegistry() config = self._makeOne(reg) config.add_view = lambda *arg, **kw: False + config._add_tween = lambda *arg, **kw: False config.setup_registry() self.assertEqual(reg.has_listeners, True) @@ -347,6 +349,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) views = [] config.add_view = lambda *arg, **kw: views.append((arg, kw)) + config._add_tween = lambda *arg, **kw: False config.setup_registry() self.assertEqual(views[0], ((default_exceptionresponse_view,), {'context':IExceptionResponse})) @@ -363,6 +366,7 @@ class ConfiguratorTests(unittest.TestCase): config.registry.queryAdapter(response, IResponse) is response) def test_setup_registry_explicit_notfound_trumps_iexceptionresponse(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound @@ -372,7 +376,7 @@ class ConfiguratorTests(unittest.TestCase): config.setup_registry() # registers IExceptionResponse default view def myview(context, request): return 'OK' - config.add_view(myview, context=HTTPNotFound) + config.add_view(myview, context=HTTPNotFound, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPNotFound), @@ -400,7 +404,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) config.setup_registry() logger = reg.getUtility(IDebugLogger) - self.assertEqual(logger.name, 'pyramid.debug') + self.assertEqual(logger.name, 'pyramid.tests') def test_setup_registry_debug_logger_non_None(self): from pyramid.registry import Registry @@ -412,15 +416,14 @@ class ConfiguratorTests(unittest.TestCase): result = reg.getUtility(IDebugLogger) self.assertEqual(logger, result) - def test_setup_registry_debug_logger_dottedname(self): + def test_setup_registry_debug_logger_name(self): from pyramid.registry import Registry from pyramid.interfaces import IDebugLogger reg = Registry() config = self._makeOne(reg) - config.setup_registry(debug_logger='pyramid.tests') + config.setup_registry(debug_logger='foo') result = reg.getUtility(IDebugLogger) - import pyramid.tests - self.assertEqual(result, pyramid.tests) + self.assertEqual(result.name, 'foo') def test_setup_registry_authentication_policy(self): from pyramid.registry import Registry @@ -569,6 +572,33 @@ class ConfiguratorTests(unittest.TestCase): config.setup_registry(default_permission='view') self.assertEqual(reg.getUtility(IDefaultPermission), 'view') + def test_setup_registry_includes(self): + from pyramid.registry import Registry + reg = Registry() + config = self._makeOne(reg) + settings = { + 'pyramid.include': """pyramid.tests.test_config.dummy_include +pyramid.tests.test_config.dummy_include2""", + } + config.setup_registry(settings=settings) + self.assert_(reg.included) + self.assert_(reg.also_included) + + def test_setup_registry_tweens(self): + from pyramid.interfaces import ITweens + from pyramid.registry import Registry + reg = Registry() + config = self._makeOne(reg) + settings = { + 'pyramid.tweens': 'pyramid.tests.test_config.dummy_tween_factory' + } + config.setup_registry(settings=settings) + config.commit() + tweens = config.registry.getUtility(ITweens) + self.assertEqual(tweens.explicit, + [('pyramid.tests.test_config.dummy_tween_factory', + dummy_tween_factory)]) + def test_get_settings_nosettings(self): from pyramid.registry import Registry reg = Registry() @@ -600,6 +630,136 @@ class ConfiguratorTests(unittest.TestCase): settings = reg.getUtility(ISettings) self.assertEqual(settings['a'], 1) + def test_add_tweens_names_distinct(self): + from pyramid.interfaces import ITweens + from pyramid.tweens import excview_tween_factory + def factory1(handler, registry): return handler + def factory2(handler, registry): return handler + config = self._makeOne() + config.add_tween(factory1) + config.add_tween(factory2) + config.commit() + tweens = config.registry.queryUtility(ITweens) + implicit = tweens.implicit() + self.assertEqual( + implicit, + [ + ('pyramid.tests.test_config.factory2', factory2), + ('pyramid.tests.test_config.factory1', factory1), + ('pyramid.tweens.excview_tween_factory', excview_tween_factory), + ] + ) + + def test_add_tweens_names_with_underover(self): + from pyramid.interfaces import ITweens + from pyramid.tweens import excview_tween_factory + from pyramid.tweens import MAIN + def factory1(handler, registry): return handler + def factory2(handler, registry): return handler + config = self._makeOne() + config.add_tween(factory1, over=MAIN) + config.add_tween(factory2, over=MAIN, + under='pyramid.tests.test_config.factory1') + config.commit() + tweens = config.registry.queryUtility(ITweens) + implicit = tweens.implicit() + self.assertEqual( + implicit, + [ + ('pyramid.tweens.excview_tween_factory', excview_tween_factory), + ('pyramid.tests.test_config.factory1', factory1), + ('pyramid.tests.test_config.factory2', factory2), + ]) + + def test_add_tween_dottedname(self): + from pyramid.interfaces import ITweens + from pyramid.tweens import excview_tween_factory + config = self._makeOne() + config.add_tween('pyramid.tests.test_config.dummy_tween_factory') + config.commit() + tweens = config.registry.queryUtility(ITweens) + self.assertEqual( + tweens.implicit(), + [ + ('pyramid.tests.test_config.dummy_tween_factory', + dummy_tween_factory), + ('pyramid.tweens.excview_tween_factory', excview_tween_factory), + ]) + + def test_add_tween_instance(self): + from pyramid.interfaces import ITweens + from pyramid.tweens import excview_tween_factory + class ATween(object): pass + atween = ATween() + config = self._makeOne() + config.add_tween(atween) + config.commit() + tweens = config.registry.queryUtility(ITweens) + implicit = tweens.implicit() + self.assertEqual(len(implicit), 2) + self.assertTrue( + implicit[0][0].startswith( + 'pyramid.tests.test_config.ATween.')) + self.assertEqual(implicit[0][1], atween) + self.assertEqual( + implicit[1], + ('pyramid.tweens.excview_tween_factory', excview_tween_factory)) + + def test_add_tween_unsuitable(self): + from pyramid.exceptions import ConfigurationError + import pyramid.tests + config = self._makeOne() + self.assertRaises(ConfigurationError, config.add_tween, pyramid.tests) + + def test_add_tween_alias_ingress(self): + from pyramid.exceptions import ConfigurationError + from pyramid.tweens import INGRESS + config = self._makeOne() + self.assertRaises(ConfigurationError, + config.add_tween, 'pyramid.tests.test_config.dummy_tween_factory', + alias=INGRESS) + + def test_add_tween_alias_main(self): + from pyramid.exceptions import ConfigurationError + from pyramid.tweens import MAIN + config = self._makeOne() + self.assertRaises(ConfigurationError, + config.add_tween, 'pyramid.tests.test_config.dummy_tween_factory', + alias=MAIN) + + def test_add_tweens_conflict(self): + from zope.configuration.config import ConfigurationConflictError + config = self._makeOne() + config.add_tween('pyramid.tests.test_config.dummy_tween_factory') + config.add_tween('pyramid.tests.test_config.dummy_tween_factory') + self.assertRaises(ConfigurationConflictError, config.commit) + + def test_add_tweens_conflict_same_alias(self): + from zope.configuration.config import ConfigurationConflictError + class ATween(object): pass + atween1 = ATween() + atween2 = ATween() + config = self._makeOne() + config.add_tween(atween1, alias='a') + config.add_tween(atween2, alias='a') + self.assertRaises(ConfigurationConflictError, config.commit) + + def test_add_tween_over_ingress(self): + from pyramid.exceptions import ConfigurationError + from pyramid.tweens import INGRESS + config = self._makeOne() + self.assertRaises(ConfigurationError, + config.add_tween, 'pyramid.tests.test_config.dummy_tween_factory', + over=INGRESS) + + def test_add_tween_under_main(self): + from pyramid.exceptions import ConfigurationError + from pyramid.tweens import MAIN + config = self._makeOne() + self.assertRaises(ConfigurationError, + config.add_tween, 'pyramid.tests.test_config.dummy_tween_factory', + under=MAIN) + def test_add_subscriber_defaults(self): from zope.interface import implements from zope.interface import Interface @@ -671,6 +831,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(len(L), 1) def test_make_wsgi_app(self): + import pyramid.config from pyramid.router import Router from pyramid.interfaces import IApplicationCreated manager = DummyThreadLocalManager() @@ -682,8 +843,29 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(manager.pushed['registry'], config.registry) self.assertEqual(manager.pushed['request'], None) self.assertTrue(manager.popped) + self.assertEqual(pyramid.config.global_registries.last, app.registry) self.assertEqual(len(subscriber), 1) self.assertTrue(IApplicationCreated.providedBy(subscriber[0])) + pyramid.config.global_registries.empty() + + def test_global_registries_empty(self): + from pyramid.config import global_registries + self.assertEqual(global_registries.last, None) + + def test_global_registries(self): + from pyramid.config import global_registries + global_registries.empty() + config1 = self._makeOne() + config1.make_wsgi_app() + self.assertEqual(global_registries.last, config1.registry) + config2 = self._makeOne() + config2.make_wsgi_app() + self.assertEqual(global_registries.last, config2.registry) + self.assertEqual(list(global_registries), + [config1.registry, config2.registry]) + global_registries.remove(config2.registry) + self.assertEqual(global_registries.last, config1.registry) + global_registries.empty() def test_include_with_dotted_name(self): from pyramid import tests @@ -767,12 +949,14 @@ class ConfiguratorTests(unittest.TestCase): None, True, True) def test_add_view_with_request_type(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides from pyramid.interfaces import IRequest view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(view=view, - request_type='pyramid.interfaces.IRequest') + request_type='pyramid.interfaces.IRequest', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = DummyRequest() self._assertNotFound(wrapper, None, request) @@ -798,29 +982,34 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper.__doc__, view.__doc__) def test_add_view_view_callable_dottedname(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) - config.add_view(view='pyramid.tests.test_config.dummy_view') + config.add_view(view='pyramid.tests.test_config.dummy_view', + renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_with_function_callable(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_with_function_callable_requestonly(self): + from pyramid.renderers import null_renderer def view(request): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_with_decorator(self): + from pyramid.renderers import null_renderer def view(request): """ ABC """ return 'OK' @@ -829,7 +1018,8 @@ class ConfiguratorTests(unittest.TestCase): return fn(context, request) return inner config = self._makeOne(autocommit=True) - config.add_view(view=view, decorator=view_wrapper) + config.add_view(view=view, decorator=view_wrapper, + renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(wrapper is view) self.assertEqual(wrapper.__doc__, view.__doc__) @@ -858,30 +1048,33 @@ class ConfiguratorTests(unittest.TestCase): assert_similar_datetime(expires, when) def test_add_view_as_instance(self): + from pyramid.renderers import null_renderer class AView: def __call__(self, context, request): """ """ return 'OK' view = AView() config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_as_instance_requestonly(self): + from pyramid.renderers import null_renderer class AView: def __call__(self, request): """ """ return 'OK' view = AView() config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) result = wrapper(None, None) self.assertEqual(result, 'OK') def test_add_view_as_oldstyle_class(self): + from pyramid.renderers import null_renderer class view: def __init__(self, context, request): self.context = context @@ -890,7 +1083,7 @@ class ConfiguratorTests(unittest.TestCase): def __call__(self): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) result = wrapper(None, request) @@ -898,6 +1091,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(request.__view__.__class__, view) def test_add_view_as_oldstyle_class_requestonly(self): + from pyramid.renderers import null_renderer class view: def __init__(self, request): self.request = request @@ -905,7 +1099,7 @@ class ConfiguratorTests(unittest.TestCase): def __call__(self): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) @@ -914,70 +1108,79 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(request.__view__.__class__, view) def test_add_view_context_as_class(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy view = lambda *arg: 'OK' class Foo: pass config = self._makeOne(autocommit=True) - config.add_view(context=Foo, view=view) + config.add_view(context=Foo, view=view, renderer=null_renderer) foo = implementedBy(Foo) wrapper = self._getViewCallable(config, foo) self.assertEqual(wrapper, view) def test_add_view_context_as_iface(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(context=IDummy, view=view) + config.add_view(context=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_context_as_dottedname(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(context='pyramid.tests.test_config.IDummy', - view=view) + view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_for__as_dottedname(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view(for_='pyramid.tests.test_config.IDummy', - view=view) + view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_for_as_class(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer from zope.interface import implementedBy view = lambda *arg: 'OK' class Foo: pass config = self._makeOne(autocommit=True) - config.add_view(for_=Foo, view=view) + config.add_view(for_=Foo, view=view, renderer=null_renderer) foo = implementedBy(Foo) wrapper = self._getViewCallable(config, foo) self.assertEqual(wrapper, view) def test_add_view_for_as_iface(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(for_=IDummy, view=view) + config.add_view(for_=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_context_trumps_for(self): # ``for_`` is older spelling for ``context`` + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) class Foo: pass - config.add_view(context=IDummy, for_=Foo, view=view) + config.add_view(context=IDummy, for_=Foo, view=view, + renderer=null_renderer) wrapper = self._getViewCallable(config, IDummy) self.assertEqual(wrapper, view) def test_add_view_register_secured_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -985,13 +1188,14 @@ class ConfiguratorTests(unittest.TestCase): view = lambda *arg: 'OK' view.__call_permissive__ = view config = self._makeOne(autocommit=True) - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = config.registry.adapters.lookup( (IViewClassifier, IRequest, Interface), ISecuredView, name='', default=None) self.assertEqual(wrapper, view) def test_add_view_exception_register_secured_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -999,14 +1203,15 @@ class ConfiguratorTests(unittest.TestCase): view = lambda *arg: 'OK' view.__call_permissive__ = view config = self._makeOne(autocommit=True) - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, renderer=null_renderer) wrapper = config.registry.adapters.lookup( (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='', default=None) self.assertEqual(wrapper, view) def test_add_view_same_phash_overrides_existing_single_view(self): - from pyramid.compat import md5 + from pyramid.renderers import null_renderer + from hashlib import md5 from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1021,7 +1226,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, xhr=True) + config.add_view(view=newview, xhr=True, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1029,7 +1234,8 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_same_phash_overrides_existing_single_view(self): - from pyramid.compat import md5 + from pyramid.renderers import null_renderer + from hashlib import md5 from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1046,7 +1252,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, xhr=True, context=RuntimeError) + config.add_view(view=newview, xhr=True, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1055,6 +1262,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_default_phash_overrides_no_phash(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1066,7 +1274,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview) + config.add_view(view=newview, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1074,6 +1282,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_default_phash_overrides_no_phash(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1087,7 +1296,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, context=RuntimeError) + config.add_view(view=newview, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1096,6 +1306,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_default_phash_overrides_default_phash(self): + from pyramid.renderers import null_renderer from pyramid.config import DEFAULT_PHASH from zope.interface import Interface from pyramid.interfaces import IRequest @@ -1109,7 +1320,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview) + config.add_view(view=newview, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertFalse(IMultiView.providedBy(wrapper)) request = DummyRequest() @@ -1117,6 +1328,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_default_phash_overrides_default_phash(self): + from pyramid.renderers import null_renderer from pyramid.config import DEFAULT_PHASH from zope.interface import implementedBy from pyramid.interfaces import IRequest @@ -1132,7 +1344,8 @@ class ConfiguratorTests(unittest.TestCase): IView, name='') def newview(context, request): return 'OK' - config.add_view(view=newview, context=RuntimeError) + config.add_view(view=newview, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertFalse(IMultiView.providedBy(wrapper)) @@ -1141,6 +1354,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1151,12 +1365,13 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_exc_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1174,13 +1389,15 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_multiview_replaces_existing_securedview(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -1192,12 +1409,13 @@ class ConfiguratorTests(unittest.TestCase): config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), ISecuredView, name='') - config.add_view(view=view) + config.add_view(view=view, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_exc_multiview_replaces_existing_securedview(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import ISecuredView @@ -1215,13 +1433,14 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), ISecuredView, name='') - config.add_view(view=view, context=RuntimeError) + config.add_view(view=view, context=RuntimeError, renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') def test_add_view_with_accept_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1234,7 +1453,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view2, accept='text/html') + config.add_view(view=view2, accept='text/html', renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(len(wrapper.views), 1) @@ -1245,6 +1464,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK2') def test_add_view_exc_with_accept_multiview_replaces_existing_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1264,7 +1484,8 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view2, accept='text/html', context=RuntimeError) + config.add_view(view=view2, accept='text/html', context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1276,6 +1497,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK2') def test_add_view_multiview_replaces_existing_view_with___accept__(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1290,7 +1512,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, Interface), IView, name='') - config.add_view(view=view2) + config.add_view(view=view2, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual(len(wrapper.views), 1) @@ -1301,6 +1523,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_exc_mulview_replaces_existing_view_with___accept__(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1322,7 +1545,8 @@ class ConfiguratorTests(unittest.TestCase): view, (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IView, name='') - config.add_view(view=view2, context=RuntimeError) + config.add_view(view=view2, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1334,6 +1558,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, request), 'OK') def test_add_view_multiview_replaces_multiview(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IMultiView @@ -1344,13 +1569,14 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Interface), IMultiView, name='') view2 = lambda *arg: 'OK2' - config.add_view(view=view2) + config.add_view(view=view2, renderer=null_renderer) wrapper = self._getViewCallable(config) self.assertTrue(IMultiView.providedBy(wrapper)) self.assertEqual([x[:2] for x in wrapper.views], [(view2, None)]) self.assertEqual(wrapper(None, None), 'OK1') def test_add_view_exc_multiview_replaces_multiview(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IMultiView @@ -1367,7 +1593,8 @@ class ConfiguratorTests(unittest.TestCase): (IExceptionViewClassifier, IRequest, implementedBy(RuntimeError)), IMultiView, name='') view2 = lambda *arg: 'OK2' - config.add_view(view=view2, context=RuntimeError) + config.add_view(view=view2, context=RuntimeError, + renderer=null_renderer) wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), exception_view=True) self.assertTrue(IMultiView.providedBy(wrapper)) @@ -1375,6 +1602,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, None), 'OK1') def test_add_view_multiview_context_superclass_then_subclass(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1389,7 +1617,7 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(autocommit=True) config.registry.registerAdapter( view, (IViewClassifier, IRequest, ISuper), IView, name='') - config.add_view(view=view2, for_=ISub) + config.add_view(view=view2, for_=ISub, renderer=null_renderer) wrapper = self._getViewCallable(config, ISuper, IRequest) self.assertFalse(IMultiView.providedBy(wrapper)) self.assertEqual(wrapper(None, None), 'OK') @@ -1398,6 +1626,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper(None, None), 'OK2') def test_add_view_multiview_exception_superclass_then_subclass(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.interfaces import IView @@ -1415,7 +1644,7 @@ class ConfiguratorTests(unittest.TestCase): view, (IViewClassifier, IRequest, Super), IView, name='') config.registry.registerAdapter( view, (IExceptionViewClassifier, IRequest, Super), IView, name='') - config.add_view(view=view2, for_=Sub) + config.add_view(view=view2, for_=Sub, renderer=null_renderer) wrapper = self._getViewCallable( config, implementedBy(Super), IRequest) wrapper_exc_view = self._getViewCallable( @@ -1432,6 +1661,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper_exc_view(None, None), 'OK2') def test_add_view_multiview_call_ordering(self): + from pyramid.renderers import null_renderer as nr from zope.interface import directlyProvides def view1(context, request): return 'view1' def view2(context, request): return 'view2' @@ -1442,15 +1672,18 @@ class ConfiguratorTests(unittest.TestCase): def view7(context, request): return 'view7' def view8(context, request): return 'view8' config = self._makeOne(autocommit=True) - config.add_view(view=view1) - config.add_view(view=view2, request_method='POST') - config.add_view(view=view3,request_param='param') - config.add_view(view=view4, containment=IDummy) - config.add_view(view=view5, request_method='POST',request_param='param') - config.add_view(view=view6, request_method='POST', containment=IDummy) - config.add_view(view=view7, request_param='param', containment=IDummy) + config.add_view(view=view1, renderer=nr) + config.add_view(view=view2, request_method='POST', renderer=nr) + config.add_view(view=view3,request_param='param', renderer=nr) + config.add_view(view=view4, containment=IDummy, renderer=nr) + config.add_view(view=view5, request_method='POST', + request_param='param', renderer=nr) + config.add_view(view=view6, request_method='POST', containment=IDummy, + renderer=nr) + config.add_view(view=view7, request_param='param', containment=IDummy, + renderer=nr) config.add_view(view=view8, request_method='POST',request_param='param', - containment=IDummy) + containment=IDummy, renderer=nr) wrapper = self._getViewCallable(config) @@ -1574,11 +1807,12 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result.settings, settings) def test_add_view_with_request_type_as_iface(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides def view(context, request): return 'OK' config = self._makeOne(autocommit=True) - config.add_view(request_type=IDummy, view=view) + config.add_view(request_type=IDummy, view=view, renderer=null_renderer) wrapper = self._getViewCallable(config, None) request = self._makeRequest(config) directlyProvides(request, IDummy) @@ -1593,10 +1827,11 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view, '', None, None, object) def test_add_view_with_route_name(self): + from pyramid.renderers import null_renderer from zope.component import ComponentLookupError view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, route_name='foo') + config.add_view(view=view, route_name='foo', renderer=null_renderer) self.assertEqual(len(config.registry.deferred_route_views), 1) infos = config.registry.deferred_route_views['foo'] self.assertEqual(len(infos), 1) @@ -1636,11 +1871,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(info['custom_predicates'], ('123',)) def test_add_view_with_route_name_exception(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from zope.component import ComponentLookupError view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, route_name='foo', context=RuntimeError) + config.add_view(view=view, route_name='foo', context=RuntimeError, + renderer=null_renderer) self.assertEqual(len(config.registry.deferred_route_views), 1) infos = config.registry.deferred_route_views['foo'] self.assertEqual(len(infos), 1) @@ -1667,9 +1904,11 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(wrapper_exc_view(None, None), 'OK') def test_add_view_with_request_method_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_method='POST') + config.add_view(view=view, request_method='POST', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'POST' @@ -1685,9 +1924,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_request_param_noval_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_param='abc') + config.add_view(view=view, request_param='abc', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.params = {'abc':''} @@ -1703,9 +1943,11 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_request_param_val_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_param='abc=123') + config.add_view(view=view, request_param='abc=123', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.params = {'abc':'123'} @@ -1721,9 +1963,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_xhr_true(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, xhr=True) + config.add_view(view=view, xhr=True, renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.is_xhr = True @@ -1746,9 +1989,10 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view=view, header='Host:a\\') def test_add_view_with_header_noval_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, header='Host') + config.add_view(view=view, header='Host', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.headers = {'Host':'whatever'} @@ -1764,9 +2008,10 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_header_val_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, header=r'Host:\d') + config.add_view(view=view, header=r'Host:\d', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.headers = {'Host':'1'} @@ -1792,9 +2037,10 @@ class ConfiguratorTests(unittest.TestCase): self.assertRaises(HTTPNotFound, wrapper, None, request) def test_add_view_with_accept_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, accept='text/xml') + config.add_view(view=view, accept='text/xml', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.accept = ['text/xml'] @@ -1810,10 +2056,11 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_containment_true(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, containment=IDummy) + config.add_view(view=view, containment=IDummy, renderer=null_renderer) wrapper = self._getViewCallable(config) context = DummyContext() directlyProvides(context, IDummy) @@ -1828,12 +2075,14 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, context, None) def test_add_view_with_containment_dottedname(self): + from pyramid.renderers import null_renderer from zope.interface import directlyProvides view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) config.add_view( view=view, - containment='pyramid.tests.test_config.IDummy') + containment='pyramid.tests.test_config.IDummy', + renderer=null_renderer) wrapper = self._getViewCallable(config) context = DummyContext() directlyProvides(context, IDummy) @@ -1847,9 +2096,10 @@ class ConfiguratorTests(unittest.TestCase): config.add_view, view=view, path_info='\\') def test_add_view_with_path_info_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, path_info='/foo') + config.add_view(view=view, path_info='/foo', renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.path_info = '/foo' @@ -1865,6 +2115,7 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_with_custom_predicates_match(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' config = self._makeOne(autocommit=True) def pred1(context, request): @@ -1872,7 +2123,8 @@ class ConfiguratorTests(unittest.TestCase): def pred2(context, request): return True predicates = (pred1, pred2) - config.add_view(view=view, custom_predicates=predicates) + config.add_view(view=view, custom_predicates=predicates, + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(wrapper(None, request), 'OK') @@ -1891,24 +2143,30 @@ class ConfiguratorTests(unittest.TestCase): self._assertNotFound(wrapper, None, request) def test_add_view_custom_predicate_bests_standard_predicate(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' view2 = lambda *arg: 'NOT OK' config = self._makeOne(autocommit=True) def pred1(context, request): return True - config.add_view(view=view, custom_predicates=(pred1,)) - config.add_view(view=view2, request_method='GET') + config.add_view(view=view, custom_predicates=(pred1,), + renderer=null_renderer) + config.add_view(view=view2, request_method='GET', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'GET' self.assertEqual(wrapper(None, request), 'OK') def test_add_view_custom_more_preds_first_bests_fewer_preds_last(self): + from pyramid.renderers import null_renderer view = lambda *arg: 'OK' view2 = lambda *arg: 'NOT OK' config = self._makeOne(autocommit=True) - config.add_view(view=view, request_method='GET', xhr=True) - config.add_view(view=view2, request_method='GET') + config.add_view(view=view, request_method='GET', xhr=True, + renderer=null_renderer) + config.add_view(view=view2, request_method='GET', + renderer=null_renderer) wrapper = self._getViewCallable(config) request = self._makeRequest(config) request.method = 'GET' @@ -1925,6 +2183,7 @@ class ConfiguratorTests(unittest.TestCase): self.assertRaises(ConfigurationConflictError, config.commit) def test_add_view_with_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' outerself = self class DummyPolicy(object): @@ -1940,12 +2199,13 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(authorization_policy=policy, authentication_policy=policy, autocommit=True) - config.add_view(view=view1, permission='view') + config.add_view(view=view1, permission='view', renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') def test_add_view_with_default_permission_no_explicit_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' outerself = self class DummyPolicy(object): @@ -1962,19 +2222,20 @@ class ConfiguratorTests(unittest.TestCase): authentication_policy=policy, default_permission='view', autocommit=True) - config.add_view(view=view1) + config.add_view(view=view1, renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') def test_add_view_with_no_default_permission_no_explicit_permission(self): + from pyramid.renderers import null_renderer view1 = lambda *arg: 'OK' class DummyPolicy(object): pass # wont be called policy = DummyPolicy() config = self._makeOne(authorization_policy=policy, authentication_policy=policy, autocommit=True) - config.add_view(view=view1) + config.add_view(view=view1, renderer=null_renderer) view = self._getViewCallable(config) request = self._makeRequest(config) self.assertEqual(view(None, request), 'OK') @@ -2018,6 +2279,13 @@ class ConfiguratorTests(unittest.TestCase): self._assertRoute(config, 'name', 'root/path') + def test_add_route_discriminator(self): + config = self._makeOne() + route = config.add_route('name', 'path') + self._assertRoute(config, 'name', 'path') + self.assertEqual(route.name, 'name') + self.assertEqual(config._ctx.actions[-1][0], ('route', 'name')) + def test_add_route_with_factory(self): config = self._makeOne(autocommit=True) factory = object() @@ -2176,17 +2444,19 @@ class ConfiguratorTests(unittest.TestCase): raise AssertionError def test_derive_view_function(self): + from pyramid.renderers import null_renderer def view(request): return 'OK' config = self._makeOne() - result = config.derive_view(view) + result = config.derive_view(view, renderer=null_renderer) self.assertFalse(result is view) self.assertEqual(result(None, None), 'OK') def test_derive_view_dottedname(self): + from pyramid.renderers import null_renderer config = self._makeOne() result = config.derive_view( - 'pyramid.tests.test_config.dummy_view') + 'pyramid.tests.test_config.dummy_view', renderer=null_renderer) self.assertFalse(result is dummy_view) self.assertEqual(result(None, None), 'OK') @@ -2279,18 +2549,21 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(config._ctx.info, 'abc') def test_add_static_here_no_utility_registered(self): + from pyramid.renderers import null_renderer from zope.interface import Interface from pyramid.static import PackageURLParser from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier config = self._makeOne(autocommit=True) - config.add_static_view('static', 'fixtures/static') + config.add_static_view('static', 'fixtures/static', + renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'static/') self._assertRoute(config, 'static/', 'static/*subpath') wrapped = config.registry.adapters.lookup( (IViewClassifier, request_type, Interface), IView, name='') request = self._makeRequest(config) - self.assertEqual(wrapped(None, request).__class__, PackageURLParser) + result = wrapped(None, request) + self.assertEqual(result.__class__, PackageURLParser) def test_add_static_view_package_relative(self): from pyramid.interfaces import IStaticURLInfo @@ -2323,12 +2596,13 @@ class ConfiguratorTests(unittest.TestCase): [('static', static_path, {})]) def test_set_notfound_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_notfound_view(view) + config.set_notfound_view(view, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPNotFound), @@ -2337,12 +2611,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result, (None, request)) def test_set_notfound_view_request_has_context(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPNotFound config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_notfound_view(view) + config.set_notfound_view(view, renderer=null_renderer) request = self._makeRequest(config) request.context = 'abc' view = self._getViewCallable(config, @@ -2372,12 +2647,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertTrue('div' in result.body) def test_set_forbidden_view(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPForbidden config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.set_forbidden_view(view) + config.set_forbidden_view(view, renderer=null_renderer) request = self._makeRequest(config) view = self._getViewCallable(config, ctx_iface=implementedBy(HTTPForbidden), @@ -2386,12 +2662,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result, 'OK') def test_set_forbidden_view_request_has_context(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy from pyramid.interfaces import IRequest from pyramid.httpexceptions import HTTPForbidden config = self._makeOne(autocommit=True) view = lambda *arg: arg - config.set_forbidden_view(view) + config.set_forbidden_view(view, renderer=null_renderer) request = self._makeRequest(config) request.context = 'abc' view = self._getViewCallable(config, @@ -2870,6 +3147,11 @@ class ConfiguratorTests(unittest.TestCase): result = render_view_to_response(ctx, req, '') self.assertEqual(result, 'grokked') + def test_scan_integration_with_extra_kw(self): + config = self._makeOne(autocommit=True) + config.scan('pyramid.tests.venusianapp', a=1) + self.assertEqual(config.a, 1) + def test_testing_securitypolicy(self): from pyramid.testing import DummySecurityPolicy config = self._makeOne(autocommit=True) @@ -3111,13 +3393,14 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(registeredview.__name__, 'view3') def test_autocommit_no_conflicts(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) def view1(request): pass def view2(request): pass def view3(request): pass - config.add_view(view1) - config.add_view(view2) - config.add_view(view3) + config.add_view(view1, renderer=null_renderer) + config.add_view(view2, renderer=null_renderer) + config.add_view(view3, renderer=null_renderer) config.commit() registeredview = self._getViewCallable(config) self.assertEqual(registeredview.__name__, 'view3') @@ -3212,8 +3495,10 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): def _makeOne(self, *arg, **kw): from pyramid.config import Configurator - return Configurator(*arg, **kw) - + config = Configurator(*arg, **kw) + config.registry._dont_resolve_responses = True + return config + def _getRouteRequestIface(self, config, name): from pyramid.interfaces import IRouteRequest iface = config.registry.getUtility(IRouteRequest, name) @@ -3271,18 +3556,21 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): yield confinst[2] def test_add_route_with_view(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view) + config.add_route('name', 'path', view=view, view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, None, request_type) self.assertEqual(wrapper(None, None), 'OK') self._assertRoute(config, 'name', 'path') def test_add_route_with_view_context(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_context=IDummy) + config.add_route('name', 'path', view=view, view_context=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3291,10 +3579,12 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_view_exception(self): + from pyramid.renderers import null_renderer from zope.interface import implementedBy config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_context=RuntimeError) + config.add_route('name', 'path', view=view, view_context=RuntimeError, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable( config, ctx_iface=implementedBy(RuntimeError), @@ -3307,9 +3597,11 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_view_for(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, view_for=IDummy) + config.add_route('name', 'path', view=view, view_for=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3318,9 +3610,11 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper, None) def test_add_route_with_for_(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) view = lambda *arg: 'OK' - config.add_route('name', 'path', view=view, for_=IDummy) + config.add_route('name', 'path', view=view, for_=IDummy, + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, IDummy, request_type) self.assertEqual(wrapper(None, None), 'OK') @@ -3340,6 +3634,7 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): self.assertEqual(wrapper(None, None).body, 'Hello!') def test_add_route_with_view_attr(self): + from pyramid.renderers import null_renderer config = self._makeOne(autocommit=True) self._registerRenderer(config) class View(object): @@ -3347,7 +3642,8 @@ class TestConfiguratorDeprecatedFeatures(unittest.TestCase): pass def alt(self): return 'OK' - config.add_route('name', 'path', view=View, view_attr='alt') + config.add_route('name', 'path', view=View, view_attr='alt', + view_renderer=null_renderer) request_type = self._getRouteRequestIface(config, 'name') wrapper = self._getViewCallable(config, None, request_type) self._assertRoute(config, 'name', 'path') @@ -3520,29 +3816,31 @@ class TestViewDeriver(unittest.TestCase): self.config.registry.registerUtility(policy, IAuthorizationPolicy) def test_requestonly_function(self): + response = DummyResponse() def view(request): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_requestonly_function_with_renderer(self): + response = DummyResponse() class moo(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, 'OK') self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return 'moo' + return response def view(request): return 'OK' deriver = self._makeOne(renderer=moo()) result = deriver(view) - self.assertFalse(result is view) + self.assertFalse(result.__wraps__ is view) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), 'moo') + self.assertEqual(result(context, request), response) def test_requestonly_function_with_renderer_request_override(self): def moo(info): @@ -3564,46 +3862,50 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result(context, request).body, 'moo') def test_requestonly_function_with_renderer_request_has_view(self): + response = DummyResponse() class moo(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, 'OK') self.assertEqual(view_inst, 'view') self.assertEqual(ctx, context) - return 'moo' + return response def view(request): return 'OK' deriver = self._makeOne(renderer=moo()) result = deriver(view) - self.assertFalse(result is view) + self.assertFalse(result.__wraps__ is view) request = self._makeRequest() request.__view__ = 'view' context = testing.DummyResource() - self.assertEqual(result(context, request), 'moo') + r = result(context, request) + self.assertEqual(r, response) self.assertFalse(hasattr(request, '__view__')) def test_class_without_attr(self): + response = DummyResponse() class View(object): def __init__(self, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(View) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, View) def test_class_with_attr(self): + response = DummyResponse() class View(object): def __init__(self, request): pass def another(self): - return 'OK' + return response deriver = self._makeOne(attr='another') result = deriver(View) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, View) def test_as_function_context_and_request(self): @@ -3611,13 +3913,14 @@ class TestViewDeriver(unittest.TestCase): return 'OK' deriver = self._makeOne() result = deriver(view) - self.assertTrue(result is view) + self.assertTrue(result.__wraps__ is view) self.assertFalse(hasattr(result, '__call_permissive__')) self.assertEqual(view(None, None), 'OK') def test_as_function_requestonly(self): + response = DummyResponse() def view(request): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3625,14 +3928,15 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_as_newstyle_class_context_and_request(self): + response = DummyResponse() class view(object): def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3641,15 +3945,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_newstyle_class_requestonly(self): + response = DummyResponse() class view(object): def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3658,15 +3963,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_oldstyle_class_context_and_request(self): + response = DummyResponse() class view: def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3675,15 +3981,16 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_oldstyle_class_requestonly(self): + response = DummyResponse() class view: def __init__(self, context, request): pass def __call__(self): - return 'OK' + return response deriver = self._makeOne() result = deriver(view) self.assertFalse(result is view) @@ -3692,24 +3999,26 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__name__, result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) request = self._makeRequest() - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(request.__view__.__class__, view) def test_as_instance_context_and_request(self): + response = DummyResponse() class View: def __call__(self, context, request): - return 'OK' + return response view = View() deriver = self._makeOne() result = deriver(view) - self.assertTrue(result is view) + self.assertTrue(result.__wraps__ is view) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_as_instance_requestonly(self): + response = DummyResponse() class View: def __call__(self, request): - return 'OK' + return response view = View() deriver = self._makeOne() result = deriver(view) @@ -3718,10 +4027,11 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__doc__, result.__doc__) self.assertTrue('instance' in result.__name__) self.assertFalse(hasattr(result, '__call_permissive__')) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result(None, None), response) def test_with_debug_authorization_no_authpol(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3734,7 +4044,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3742,7 +4052,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_authn_policy_no_authz_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthenticationPolicy policy = DummySecurityPolicy(False) @@ -3757,7 +4068,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3765,7 +4076,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_authz_policy_no_authn_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthorizationPolicy policy = DummySecurityPolicy(False) @@ -3780,7 +4092,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3788,7 +4100,8 @@ class TestViewDeriver(unittest.TestCase): "(no authorization policy in use)") def test_with_debug_authorization_no_permission(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) self._registerSecurityPolicy(True) @@ -3802,7 +4115,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " @@ -3810,7 +4123,8 @@ class TestViewDeriver(unittest.TestCase): "no permission registered)") def test_debug_auth_permission_authpol_permitted(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3820,18 +4134,19 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) + self.assertEqual(result.__call_permissive__.__wraps__, view) request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " "'view_name' against context None): True") def test_debug_auth_permission_authpol_permitted_no_request(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3841,8 +4156,8 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) - self.assertEqual(result(None, None), 'OK') + self.assertEqual(result.__call_permissive__.__wraps__, view) + self.assertEqual(result(None, None), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url None (view name " @@ -3850,7 +4165,8 @@ class TestViewDeriver(unittest.TestCase): def test_debug_auth_permission_authpol_denied(self): from pyramid.httpexceptions import HTTPForbidden - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() @@ -3860,7 +4176,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) - self.assertEqual(result.__call_permissive__, view) + self.assertEqual(result.__call_permissive__.__wraps__, view) request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' @@ -3888,12 +4204,14 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(permitted, False) def test_debug_auth_permission_authpol_overridden(self): - view = lambda *arg: 'OK' + from pyramid.security import NO_PERMISSION_REQUIRED + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = dict( debug_authorization=True, reload_templates=True) logger = self._registerLogger() self._registerSecurityPolicy(False) - deriver = self._makeOne(permission='__no_permission_required__') + deriver = self._makeOne(permission=NO_PERMISSION_REQUIRED) result = deriver(view) self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) @@ -3902,14 +4220,15 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], "debug_authorization of url url (view name " "'view_name' against context None): False") def test_secured_view_authn_policy_no_authz_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthenticationPolicy policy = DummySecurityPolicy(False) @@ -3923,10 +4242,11 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) def test_secured_view_authz_policy_no_authn_policy(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthorizationPolicy policy = DummySecurityPolicy(False) @@ -3940,10 +4260,11 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.view_name = 'view_name' request.url = 'url' - self.assertEqual(result(None, request), 'OK') + self.assertEqual(result(None, request), response) def test_with_predicates_all(self): - view = lambda *arg: 'OK' + response = DummyResponse() + view = lambda *arg: response predicates = [] def predicate1(context, request): predicates.append(True) @@ -3956,7 +4277,7 @@ class TestViewDeriver(unittest.TestCase): request = self._makeRequest() request.method = 'POST' next = result(None, None) - self.assertEqual(next, 'OK') + self.assertEqual(next, response) self.assertEqual(predicates, [True, True]) def test_with_predicates_checker(self): @@ -3994,7 +4315,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(predicates, [True, True]) def test_with_wrapper_viewname(self): - from webob import Response + from pyramid.response import Response from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier inner_response = Response('OK') @@ -4003,7 +4324,8 @@ class TestViewDeriver(unittest.TestCase): def outer_view(context, request): self.assertEqual(request.wrapped_response, inner_response) self.assertEqual(request.wrapped_body, inner_response.body) - self.assertEqual(request.wrapped_view, inner_view) + self.assertEqual(request.wrapped_view.__original_view__, + inner_view) return Response('outer ' + request.wrapped_body) self.config.registry.registerAdapter( outer_view, (IViewClassifier, None, None), IView, 'owrap') @@ -4018,7 +4340,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(response.body, 'outer OK') def test_with_wrapper_viewname_notfound(self): - from webob import Response + from pyramid.response import Response inner_response = Response('OK') def inner_view(context, request): return inner_response @@ -4028,13 +4350,14 @@ class TestViewDeriver(unittest.TestCase): self.assertRaises(ValueError, wrapped, None, request) def test_as_newstyle_class_context_and_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View(object): def __init__(self, context, request): pass @@ -4048,16 +4371,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_newstyle_class_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View(object): def __init__(self, request): pass @@ -4071,16 +4395,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_oldstyle_cls_context_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View: def __init__(self, context, request): pass @@ -4094,16 +4419,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_oldstyle_cls_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) - return resp + return response class View: def __init__(self, request): pass @@ -4117,16 +4443,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__name__, View.__name__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_instance_context_and_request_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return resp + return response class View: def index(self, context, request): return {'a':'1'} @@ -4138,16 +4465,17 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__doc__, view.__doc__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_as_instance_requestonly_attr_and_renderer(self): + response = DummyResponse() class renderer(object): def render_view(inself, req, resp, view_inst, ctx): self.assertEqual(req, request) self.assertEqual(resp, {'a':'1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) - return resp + return response class View: def index(self, request): return {'a':'1'} @@ -4159,58 +4487,63 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(result.__doc__, view.__doc__) request = self._makeRequest() context = testing.DummyResource() - self.assertEqual(result(context, request), {'a':'1'}) + self.assertEqual(result(context, request), response) def test_with_view_mapper_config_specified(self): + response = DummyResponse() class mapper(object): def __init__(self, **kw): self.kw = kw def __call__(self, view): def wrapped(context, request): - return 'OK' + return response return wrapped def view(context, request): return 'NOTOK' deriver = self._makeOne(mapper=mapper) result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_with_view_mapper_view_specified(self): + from pyramid.response import Response + response = Response() def mapper(**kw): def inner(view): def superinner(context, request): self.assertEqual(request, None) - return 'OK' + return response return superinner return inner def view(context, request): return 'NOTOK' view.__view_mapper__ = mapper deriver = self._makeOne() result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_with_view_mapper_default_mapper_specified(self): + from pyramid.response import Response + response = Response() def mapper(**kw): def inner(view): def superinner(context, request): self.assertEqual(request, None) - return 'OK' + return response return superinner return inner self.config.set_view_mapper(mapper) def view(context, request): return 'NOTOK' deriver = self._makeOne() result = deriver(view) - self.assertFalse(result is view) - self.assertEqual(result(None, None), 'OK') + self.assertFalse(result.__wraps__ is view) + self.assertEqual(result(None, None), response) def test_attr_wrapped_view_branching_default_phash(self): from pyramid.config import DEFAULT_PHASH def view(context, request): pass deriver = self._makeOne(phash=DEFAULT_PHASH) result = deriver(view) - self.assertEqual(result, view) + self.assertEqual(result.__wraps__, view) def test_attr_wrapped_view_branching_nondefault_phash(self): def view(context, request): pass @@ -4220,7 +4553,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_integer(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4240,7 +4573,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_timedelta(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4260,7 +4593,7 @@ class TestViewDeriver(unittest.TestCase): def test_http_cached_view_tuple(self): import datetime - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4279,7 +4612,7 @@ class TestViewDeriver(unittest.TestCase): self.assertEqual(headers['Cache-Control'], 'max-age=3600, public') def test_http_cached_view_tuple_seconds_None(self): - from webob import Response + from pyramid.response import Response response = Response('OK') def inner_view(context, request): return response @@ -4295,17 +4628,35 @@ class TestViewDeriver(unittest.TestCase): self.assertFalse('Expires' in headers) self.assertEqual(headers['Cache-Control'], 'public') - def test_http_cached_view_nonresponse_object_returned_downstream(self): + def test_http_cached_view_prevent_auto_set(self): + from pyramid.response import Response + response = Response() + response.cache_control.prevent_auto = True def inner_view(context, request): - return None + return response deriver = self._makeOne(http_cache=3600) result = deriver(inner_view) - self.assertFalse(result is inner_view) - self.assertEqual(inner_view.__module__, result.__module__) - self.assertEqual(inner_view.__doc__, result.__doc__) request = self._makeRequest() result = result(None, request) - self.assertEqual(result, None) # doesn't blow up + self.assertEqual(result, response) # doesn't blow up + headers = dict(result.headerlist) + self.assertFalse('Expires' in headers) + self.assertFalse('Cache-Control' in headers) + + def test_http_cached_prevent_http_cache_in_settings(self): + self.config.registry.settings['prevent_http_cache'] = True + from pyramid.response import Response + response = Response() + def inner_view(context, request): + return response + deriver = self._makeOne(http_cache=3600) + result = deriver(inner_view) + request = self._makeRequest() + result = result(None, request) + self.assertEqual(result, response) + headers = dict(result.headerlist) + self.assertFalse('Expires' in headers) + self.assertFalse('Cache-Control' in headers) def test_http_cached_view_bad_tuple(self): from pyramid.exceptions import ConfigurationError @@ -5392,6 +5743,11 @@ def dummyfactory(request): """ """ def dummy_include(config): + config.registry.included = True + config.action('discrim', None, config.package) + +def dummy_include2(config): + config.registry.also_included = True config.action('discrim', None, config.package) includeme = dummy_include @@ -5419,9 +5775,19 @@ class DummyRegistry(object): def parse_httpdate(s): import datetime - return datetime.datetime.strptime(s, "%a, %d %b %Y %H:%M:%S %Z") + # cannot use %Z, must use literal GMT; Jython honors timezone + # but CPython does not + return datetime.datetime.strptime(s, "%a, %d %b %Y %H:%M:%S GMT") def assert_similar_datetime(one, two): for attr in ('year', 'month', 'day', 'hour', 'minute'): - assert(getattr(one, attr) == getattr(two, attr)) + one_attr = getattr(one, attr) + two_attr = getattr(two, attr) + if not one_attr == two_attr: # pragma: no cover + raise AssertionError('%r != %r in %s' % (one_attr, two_attr, attr)) + +from pyramid.interfaces import IResponse +class DummyResponse(object): + implements(IResponse) +def dummy_tween_factory(handler, registry): pass |
