From bda1306749c62ef4f11cfe567ed7d56c8ad94240 Mon Sep 17 00:00:00 2001 From: Michael Merickel <github@m.merickel.org> Date: Mon, 15 Oct 2018 16:56:42 +0200 Subject: [PATCH] Merge pull request #3388 from mmerickel/black --- tests/test_viewderivers.py | 847 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 605 insertions(+), 242 deletions(-) diff --git a/tests/test_viewderivers.py b/tests/test_viewderivers.py index 69dcc7d..a1455ed 100644 --- a/tests/test_viewderivers.py +++ b/tests/test_viewderivers.py @@ -3,13 +3,10 @@ from pyramid import testing from pyramid.exceptions import ConfigurationError -from pyramid.interfaces import ( - IResponse, - IRequest, - ) +from pyramid.interfaces import IResponse, IRequest + class TestDeriveView(unittest.TestCase): - def setUp(self): self.config = testing.setUp() self.config.set_default_csrf_options(require_csrf=False) @@ -25,6 +22,7 @@ def _registerLogger(self): from pyramid.interfaces import IDebugLogger + logger = DummyLogger() self.config.registry.registerUtility(logger, IDebugLogger) return logger @@ -32,6 +30,7 @@ def _registerSecurityPolicy(self, permissive): from pyramid.interfaces import IAuthenticationPolicy from pyramid.interfaces import IAuthorizationPolicy + policy = DummySecurityPolicy(permissive) self.config.registry.registerUtility(policy, IAuthenticationPolicy) self.config.registry.registerUtility(policy, IAuthorizationPolicy) @@ -39,6 +38,7 @@ def test_function_returns_non_adaptable(self): def view(request): return None + result = self.config.derive_view(view) self.assertFalse(result is view) try: @@ -49,14 +49,15 @@ 'Could not convert return value of the view callable function ' 'tests.test_viewderivers.view into a response ' 'object. The value returned was None. You may have forgotten ' - 'to return a value from the view callable.' - ) - else: # pragma: no cover + 'to return a value from the view callable.', + ) + else: # pragma: no cover raise AssertionError def test_function_returns_non_adaptable_dict(self): def view(request): - return {'a':1} + return {'a': 1} + result = self.config.derive_view(view) self.assertFalse(result is view) try: @@ -67,15 +68,16 @@ "Could not convert return value of the view callable function " "tests.test_viewderivers.view into a response " "object. The value returned was {'a': 1}. You may have " - "forgotten to define a renderer in the view configuration." - ) - else: # pragma: no cover + "forgotten to define a renderer in the view configuration.", + ) + else: # pragma: no cover raise AssertionError def test_instance_returns_non_adaptable(self): class AView(object): def __call__(self, request): return None + view = AView() result = self.config.derive_view(view) self.assertFalse(result is view) @@ -83,20 +85,30 @@ result(None, None) except ValueError as e: msg = e.args[0] - self.assertTrue(msg.startswith( - 'Could not convert return value of the view callable object ' - '<tests.test_viewderivers.')) - self.assertTrue(msg.endswith( - '> into a response object. The value returned was None. You ' - 'may have forgotten to return a value from the view callable.')) - else: # pragma: no cover + self.assertTrue( + msg.startswith( + 'Could not convert return value of the view callable ' + 'object <tests.test_viewderivers.' + ) + ) + self.assertTrue( + msg.endswith( + '> into a response object. The value returned was None. ' + 'You may have forgotten to return a value from the view ' + 'callable.' + ) + ) + else: # pragma: no cover raise AssertionError def test_function_returns_true_Response_no_renderer(self): from pyramid.response import Response + r = Response('Hello') + def view(request): return r + result = self.config.derive_view(view) self.assertFalse(result is view) response = result(None, None) @@ -104,10 +116,12 @@ def test_function_returns_true_Response_with_renderer(self): from pyramid.response import Response + r = Response('Hello') + def view(request): return r - renderer = object() + result = self.config.derive_view(view) self.assertFalse(result is view) response = result(None, None) @@ -115,11 +129,14 @@ def test_requestonly_default_method_returns_non_adaptable(self): request = DummyRequest() + class AView(object): def __init__(self, request): pass + def __call__(self): return None + result = self.config.derive_view(AView) self.assertFalse(result is AView) try: @@ -131,18 +148,21 @@ 'method __call__ of ' 'class tests.test_viewderivers.AView into a ' 'response object. The value returned was None. You may have ' - 'forgotten to return a value from the view callable.' - ) - else: # pragma: no cover + 'forgotten to return a value from the view callable.', + ) + else: # pragma: no cover raise AssertionError def test_requestonly_nondefault_method_returns_non_adaptable(self): request = DummyRequest() + class AView(object): def __init__(self, request): pass + def theviewmethod(self): return None + result = self.config.derive_view(AView, attr='theviewmethod') self.assertFalse(result is AView) try: @@ -154,21 +174,24 @@ 'method theviewmethod of ' 'class tests.test_viewderivers.AView into a ' 'response object. The value returned was None. You may have ' - 'forgotten to return a value from the view callable.' - ) - else: # pragma: no cover + 'forgotten to return a value from the view callable.', + ) + else: # pragma: no cover raise AssertionError def test_requestonly_function(self): response = DummyResponse() + def view(request): return response + result = self.config.derive_view(view) self.assertFalse(result is view) 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) @@ -176,10 +199,13 @@ self.assertEqual(view_inst, view) self.assertEqual(ctx, context) return response + def clone(self): return self + def view(request): return 'OK' + result = self.config.derive_view(view, renderer=moo()) self.assertFalse(result.__wraps__ is view) request = self._makeRequest() @@ -193,9 +219,12 @@ self.assertEqual(system['request'], request) self.assertEqual(system['context'], context) return b'moo' + return inner + def view(request): return 'OK' + self.config.add_renderer('moo', moo) result = self.config.derive_view(view, renderer='string') self.assertFalse(result is view) @@ -206,6 +235,7 @@ 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) @@ -213,10 +243,13 @@ self.assertEqual(view_inst, 'view') self.assertEqual(ctx, context) return response + def clone(self): return self + def view(request): return 'OK' + result = self.config.derive_view(view, renderer=moo()) self.assertFalse(result.__wraps__ is view) request = self._makeRequest() @@ -228,11 +261,14 @@ def test_class_without_attr(self): response = DummyResponse() + class View(object): def __init__(self, request): pass + def __call__(self): return response + result = self.config.derive_view(View) request = self._makeRequest() self.assertEqual(result(None, request), response) @@ -240,11 +276,14 @@ def test_class_with_attr(self): response = DummyResponse() + class View(object): def __init__(self, request): pass + def another(self): return response + result = self.config.derive_view(View, attr='another') request = self._makeRequest() self.assertEqual(result(None, request), response) @@ -253,6 +292,7 @@ def test_as_function_context_and_request(self): def view(context, request): return 'OK' + result = self.config.derive_view(view) self.assertTrue(result.__wraps__ is view) self.assertFalse(hasattr(result, '__call_permissive__')) @@ -260,8 +300,10 @@ def test_as_function_requestonly(self): response = DummyResponse() + def view(request): return response + result = self.config.derive_view(view) self.assertFalse(result is view) self.assertEqual(view.__module__, result.__module__) @@ -272,11 +314,14 @@ def test_as_newstyle_class_context_and_request(self): response = DummyResponse() + class view(object): def __init__(self, context, request): pass + def __call__(self): return response + result = self.config.derive_view(view) self.assertFalse(result is view) self.assertEqual(view.__module__, result.__module__) @@ -289,11 +334,14 @@ def test_as_newstyle_class_requestonly(self): response = DummyResponse() + class view(object): def __init__(self, context, request): pass + def __call__(self): return response + result = self.config.derive_view(view) self.assertFalse(result is view) self.assertEqual(view.__module__, result.__module__) @@ -306,11 +354,14 @@ def test_as_oldstyle_class_context_and_request(self): response = DummyResponse() + class view: def __init__(self, context, request): pass + def __call__(self): return response + result = self.config.derive_view(view) self.assertFalse(result is view) self.assertEqual(view.__module__, result.__module__) @@ -323,11 +374,14 @@ def test_as_oldstyle_class_requestonly(self): response = DummyResponse() + class view: def __init__(self, context, request): pass + def __call__(self): return response + result = self.config.derive_view(view) self.assertFalse(result is view) self.assertEqual(view.__module__, result.__module__) @@ -340,9 +394,11 @@ def test_as_instance_context_and_request(self): response = DummyResponse() + class View: def __call__(self, context, request): return response + view = View() result = self.config.derive_view(view) self.assertTrue(result.__wraps__ is view) @@ -351,9 +407,11 @@ def test_as_instance_requestonly(self): response = DummyResponse() + class View: def __call__(self, request): return response + view = View() result = self.config.derive_view(view) self.assertFalse(result is view) @@ -367,7 +425,8 @@ response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() result = self.config._derive_view(view, permission='view') self.assertEqual(view.__module__, result.__module__) @@ -379,16 +438,19 @@ request.url = 'url' 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): Allowed " - "(no authorization policy in use)") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): Allowed " + "(no authorization policy in use)", + ) def test_with_debug_authorization_authn_policy_no_authz_policy(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthenticationPolicy + policy = DummySecurityPolicy(False) self.config.registry.registerUtility(policy, IAuthenticationPolicy) logger = self._registerLogger() @@ -402,16 +464,19 @@ request.url = 'url' 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): Allowed " - "(no authorization policy in use)") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): Allowed " + "(no authorization policy in use)", + ) def test_with_debug_authorization_authz_policy_no_authn_policy(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict(debug_authorization=True) from pyramid.interfaces import IAuthorizationPolicy + policy = DummySecurityPolicy(False) self.config.registry.registerUtility(policy, IAuthorizationPolicy) logger = self._registerLogger() @@ -425,16 +490,19 @@ request.url = 'url' 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): Allowed " - "(no authorization policy in use)") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): Allowed " + "(no authorization policy in use)", + ) def test_with_debug_authorization_no_permission(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) self._registerSecurityPolicy(True) logger = self._registerLogger() result = self.config._derive_view(view) @@ -447,16 +515,19 @@ request.url = 'url' 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): Allowed (" - "no permission registered)") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): Allowed (" + "no permission registered)", + ) def test_debug_auth_permission_authpol_permitted(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() self._registerSecurityPolicy(True) result = self.config._derive_view(view, permission='view') @@ -469,15 +540,18 @@ request.url = 'url' 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") + 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): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() self._registerSecurityPolicy(True) result = self.config._derive_view(view, permission='view') @@ -487,16 +561,20 @@ 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 " - "None against context None): True") + self.assertEqual( + logger.messages[0], + "debug_authorization of url None (view name " + "None against context None): True", + ) def test_debug_auth_permission_authpol_denied(self): from pyramid.httpexceptions import HTTPForbidden + response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() self._registerSecurityPolicy(False) result = self.config._derive_view(view, permission='view') @@ -509,14 +587,17 @@ request.url = 'url' self.assertRaises(HTTPForbidden, result, None, request) self.assertEqual(len(logger.messages), 1) - self.assertEqual(logger.messages[0], - "debug_authorization of url url (view name " - "'view_name' against context None): False") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): False", + ) def test_debug_auth_permission_authpol_denied2(self): view = lambda *arg: 'OK' self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) self._registerLogger() self._registerSecurityPolicy(False) result = self.config._derive_view(view, permission='view') @@ -531,13 +612,17 @@ def test_debug_auth_permission_authpol_overridden(self): from pyramid.security import NO_PERMISSION_REQUIRED + response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() self._registerSecurityPolicy(False) - result = self.config._derive_view(view, permission=NO_PERMISSION_REQUIRED) + result = self.config._derive_view( + view, permission=NO_PERMISSION_REQUIRED + ) self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) @@ -547,20 +632,24 @@ request.url = 'url' 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): " - "Allowed (NO_PERMISSION_REQUIRED)") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context None): " + "Allowed (NO_PERMISSION_REQUIRED)", + ) def test_debug_auth_permission_authpol_permitted_excview(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = dict( - debug_authorization=True, reload_templates=True) + debug_authorization=True, reload_templates=True + ) logger = self._registerLogger() self._registerSecurityPolicy(True) result = self.config._derive_view( - view, context=Exception, permission='view') + view, context=Exception, permission='view' + ) self.assertEqual(view.__module__, result.__module__) self.assertEqual(view.__doc__, result.__doc__) self.assertEqual(view.__name__, result.__name__) @@ -570,15 +659,18 @@ request.url = 'url' self.assertEqual(result(Exception(), request), response) self.assertEqual(len(logger.messages), 1) - self.assertEqual(logger.messages[0], - "debug_authorization of url url (view name " - "'view_name' against context Exception()): True") + self.assertEqual( + logger.messages[0], + "debug_authorization of url url (view name " + "'view_name' against context Exception()): True", + ) def test_secured_view_authn_policy_no_authz_policy(self): response = DummyResponse() view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthenticationPolicy + policy = DummySecurityPolicy(False) self.config.registry.registerUtility(policy, IAuthenticationPolicy) result = self.config._derive_view(view, permission='view') @@ -596,6 +688,7 @@ view = lambda *arg: response self.config.registry.settings = {} from pyramid.interfaces import IAuthorizationPolicy + policy = DummySecurityPolicy(False) self.config.registry.registerUtility(policy, IAuthorizationPolicy) result = self.config._derive_view(view, permission='view') @@ -612,6 +705,7 @@ from pyramid.interfaces import IAuthenticationPolicy from pyramid.interfaces import IAuthorizationPolicy from pyramid.httpexceptions import HTTPForbidden + response = DummyResponse() view = lambda *arg: response self.config.registry.settings = {} @@ -625,16 +719,20 @@ try: result(None, request) except HTTPForbidden as e: - self.assertEqual(e.message, - 'Unauthorized: <lambda> failed permission check') - else: # pragma: no cover + self.assertEqual( + e.message, 'Unauthorized: <lambda> failed permission check' + ) + else: # pragma: no cover raise AssertionError def test_secured_view_raises_forbidden_with_name(self): from pyramid.interfaces import IAuthenticationPolicy from pyramid.interfaces import IAuthorizationPolicy from pyramid.httpexceptions import HTTPForbidden - def myview(request): pass + + def myview(request): # pragma: no cover + pass + self.config.registry.settings = {} policy = DummySecurityPolicy(False) self.config.registry.registerUtility(policy, IAuthenticationPolicy) @@ -646,22 +744,28 @@ try: result(None, request) except HTTPForbidden as e: - self.assertEqual(e.message, - 'Unauthorized: myview failed permission check') - else: # pragma: no cover + self.assertEqual( + e.message, 'Unauthorized: myview failed permission check' + ) + else: # pragma: no cover raise AssertionError def test_secured_view_skipped_by_default_on_exception_view(self): from pyramid.request import Request from pyramid.security import NO_PERMISSION_REQUIRED + def view(request): raise ValueError + def excview(request): return 'hello' + self._registerSecurityPolicy(False) self.config.add_settings({'debug_authorization': True}) self.config.set_default_permission('view') - self.config.add_view(view, name='foo', permission=NO_PERMISSION_REQUIRED) + self.config.add_view( + view, name='foo', permission=NO_PERMISSION_REQUIRED + ) self.config.add_view(excview, context=ValueError, renderer='string') app = self.config.make_wsgi_app() request = Request.blank('/foo', base_url='http://example.com') @@ -673,13 +777,20 @@ from pyramid.httpexceptions import HTTPForbidden from pyramid.request import Request from pyramid.security import NO_PERMISSION_REQUIRED + def view(request): raise ValueError - def excview(request): pass + + def excview(request): # pragma: no cover + pass + self._registerSecurityPolicy(False) - self.config.add_view(view, name='foo', permission=NO_PERMISSION_REQUIRED) - self.config.add_view(excview, context=ValueError, renderer='string', - permission='view') + self.config.add_view( + view, name='foo', permission=NO_PERMISSION_REQUIRED + ) + self.config.add_view( + excview, context=ValueError, renderer='string', permission='view' + ) app = self.config.make_wsgi_app() request = Request.blank('/foo', base_url='http://example.com') request.method = 'POST' @@ -687,20 +798,26 @@ request.get_response(app) except HTTPForbidden: pass - else: # pragma: no cover + else: # pragma: no cover raise AssertionError def test_secured_view_passed_on_explicit_exception_view(self): from pyramid.request import Request from pyramid.security import NO_PERMISSION_REQUIRED + def view(request): raise ValueError + def excview(request): return 'hello' + self._registerSecurityPolicy(True) - self.config.add_view(view, name='foo', permission=NO_PERMISSION_REQUIRED) - self.config.add_view(excview, context=ValueError, renderer='string', - permission='view') + self.config.add_view( + view, name='foo', permission=NO_PERMISSION_REQUIRED + ) + self.config.add_view( + excview, context=ValueError, renderer='string', permission='view' + ) app = self.config.make_wsgi_app() request = Request.blank('/foo', base_url='http://example.com') request.method = 'POST' @@ -710,10 +827,13 @@ def test_predicate_mismatch_view_has_no_name(self): from pyramid.exceptions import PredicateMismatch + response = DummyResponse() view = lambda *arg: response + def predicate1(context, request): return False + predicate1.text = lambda *arg: 'text' result = self.config._derive_view(view, predicates=[predicate1]) request = self._makeRequest() @@ -721,16 +841,21 @@ try: result(None, None) except PredicateMismatch as e: - self.assertEqual(e.detail, - 'predicate mismatch for view <lambda> (text)') - else: # pragma: no cover + self.assertEqual( + e.detail, 'predicate mismatch for view <lambda> (text)' + ) + else: # pragma: no cover raise AssertionError def test_predicate_mismatch_view_has_name(self): from pyramid.exceptions import PredicateMismatch - def myview(request): pass + + def myview(request): # pragma: no cover + pass + def predicate1(context, request): return False + predicate1.text = lambda *arg: 'text' result = self.config._derive_view(myview, predicates=[predicate1]) request = self._makeRequest() @@ -738,44 +863,57 @@ try: result(None, None) except PredicateMismatch as e: - self.assertEqual(e.detail, - 'predicate mismatch for view myview (text)') - else: # pragma: no cover + self.assertEqual( + e.detail, 'predicate mismatch for view myview (text)' + ) + else: # pragma: no cover raise AssertionError def test_predicate_mismatch_exception_has_text_in_detail(self): from pyramid.exceptions import PredicateMismatch - def myview(request): pass + + def myview(request): # pragma: no cover + pass + def predicate1(context, request): return True + predicate1.text = lambda *arg: 'pred1' + def predicate2(context, request): return False + predicate2.text = lambda *arg: 'pred2' - result = self.config._derive_view(myview, - predicates=[predicate1, predicate2]) + result = self.config._derive_view( + myview, predicates=[predicate1, predicate2] + ) request = self._makeRequest() request.method = 'POST' try: result(None, None) except PredicateMismatch as e: - self.assertEqual(e.detail, - 'predicate mismatch for view myview (pred2)') - else: # pragma: no cover + self.assertEqual( + e.detail, 'predicate mismatch for view myview (pred2)' + ) + else: # pragma: no cover raise AssertionError def test_with_predicates_all(self): response = DummyResponse() view = lambda *arg: response predicates = [] + def predicate1(context, request): predicates.append(True) return True + def predicate2(context, request): predicates.append(True) return True - result = self.config._derive_view(view, - predicates=[predicate1, predicate2]) + + result = self.config._derive_view( + view, predicates=[predicate1, predicate2] + ) request = self._makeRequest() request.method = 'POST' next = result(None, None) @@ -785,14 +923,18 @@ def test_with_predicates_checker(self): view = lambda *arg: 'OK' predicates = [] + def predicate1(context, request): predicates.append(True) return True + def predicate2(context, request): predicates.append(True) return True - result = self.config._derive_view(view, - predicates=[predicate1, predicate2]) + + result = self.config._derive_view( + view, predicates=[predicate1, predicate2] + ) request = self._makeRequest() request.method = 'POST' next = result.__predicated__(None, None) @@ -801,18 +943,24 @@ def test_with_predicates_notall(self): from pyramid.httpexceptions import HTTPNotFound + view = lambda *arg: 'OK' predicates = [] + def predicate1(context, request): predicates.append(True) return True + predicate1.text = lambda *arg: 'text' + def predicate2(context, request): predicates.append(True) return False + predicate2.text = lambda *arg: 'text' - result = self.config._derive_view(view, - predicates=[predicate1, predicate2]) + result = self.config._derive_view( + view, predicates=[predicate1, predicate2] + ) request = self._makeRequest() request.method = 'POST' self.assertRaises(HTTPNotFound, result, None, None) @@ -822,19 +970,26 @@ from pyramid.response import Response from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier + inner_response = Response('OK') + def inner_view(context, request): return inner_response + 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.__original_view__, - inner_view) + self.assertEqual( + request.wrapped_view.__original_view__, inner_view + ) return Response(b'outer ' + request.wrapped_body) + self.config.registry.registerAdapter( - outer_view, (IViewClassifier, None, None), IView, 'owrap') - result = self.config._derive_view(inner_view, viewname='inner', - wrapper_viewname='owrap') + outer_view, (IViewClassifier, None, None), IView, 'owrap' + ) + result = self.config._derive_view( + inner_view, viewname='inner', wrapper_viewname='owrap' + ) self.assertFalse(result is inner_view) self.assertEqual(inner_view.__module__, result.__module__) self.assertEqual(inner_view.__doc__, result.__doc__) @@ -844,32 +999,42 @@ def test_with_wrapper_viewname_notfound(self): from pyramid.response import Response + inner_response = Response('OK') + def inner_view(context, request): return inner_response - wrapped = self.config._derive_view(inner_view, viewname='inner', - wrapper_viewname='owrap') + + wrapped = self.config._derive_view( + inner_view, viewname='inner', wrapper_viewname='owrap' + ) request = self._makeRequest() 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(resp, {'a': '1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) return response + def clone(self): return self + class View(object): def __init__(self, context, request): pass + def index(self): - return {'a':'1'} - result = self.config._derive_view(View, - renderer=renderer(), attr='index') + return {'a': '1'} + + result = self.config._derive_view( + View, renderer=renderer(), attr='index' + ) self.assertFalse(result is View) self.assertEqual(result.__module__, View.__module__) self.assertEqual(result.__doc__, View.__doc__) @@ -880,22 +1045,28 @@ 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(resp, {'a': '1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) return response + def clone(self): return self + class View(object): def __init__(self, request): pass + def index(self): - return {'a':'1'} - result = self.config.derive_view(View, - renderer=renderer(), attr='index') + return {'a': '1'} + + result = self.config.derive_view( + View, renderer=renderer(), attr='index' + ) self.assertFalse(result is View) self.assertEqual(result.__module__, View.__module__) self.assertEqual(result.__doc__, View.__doc__) @@ -906,22 +1077,28 @@ 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(resp, {'a': '1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) return response + def clone(self): return self + class View: def __init__(self, context, request): pass + def index(self): - return {'a':'1'} - result = self.config.derive_view(View, - renderer=renderer(), attr='index') + return {'a': '1'} + + result = self.config.derive_view( + View, renderer=renderer(), attr='index' + ) self.assertFalse(result is View) self.assertEqual(result.__module__, View.__module__) self.assertEqual(result.__doc__, View.__doc__) @@ -932,22 +1109,28 @@ 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(resp, {'a': '1'}) self.assertEqual(view_inst.__class__, View) self.assertEqual(ctx, context) return response + def clone(self): return self + class View: def __init__(self, request): pass + def index(self): - return {'a':'1'} - result = self.config.derive_view(View, - renderer=renderer(), attr='index') + return {'a': '1'} + + result = self.config.derive_view( + View, renderer=renderer(), attr='index' + ) self.assertFalse(result is View) self.assertEqual(result.__module__, View.__module__) self.assertEqual(result.__doc__, View.__doc__) @@ -958,21 +1141,26 @@ 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(resp, {'a': '1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) return response + def clone(self): return self + class View: def index(self, context, request): - return {'a':'1'} + return {'a': '1'} + view = View() - result = self.config.derive_view(view, - renderer=renderer(), attr='index') + result = self.config.derive_view( + view, renderer=renderer(), attr='index' + ) self.assertFalse(result is view) self.assertEqual(result.__module__, view.__module__) self.assertEqual(result.__doc__, view.__doc__) @@ -982,21 +1170,26 @@ 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(resp, {'a': '1'}) self.assertEqual(view_inst, view) self.assertEqual(ctx, context) return response + def clone(self): return self + class View: def index(self, request): - return {'a':'1'} + return {'a': '1'} + view = View() - result = self.config.derive_view(view, - renderer=renderer(), attr='index') + result = self.config.derive_view( + view, renderer=renderer(), attr='index' + ) self.assertFalse(result is view) self.assertEqual(result.__module__, view.__module__) self.assertEqual(result.__doc__, view.__doc__) @@ -1006,29 +1199,42 @@ 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 response + return wrapped - def view(context, request): return 'NOTOK' + + def view(context, request): # pragma: no cover + return 'NOTOK' + result = self.config._derive_view(view, mapper=mapper) 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 response + return superinner + return inner - def view(context, request): return 'NOTOK' + + def view(context, request): # pragma: no cover + return 'NOTOK' + view.__view_mapper__ = mapper result = self.config.derive_view(view) self.assertFalse(result.__wraps__ is view) @@ -1036,37 +1242,53 @@ 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 response + return response + return superinner + return inner + self.config.set_view_mapper(mapper) - def view(context, request): return 'NOTOK' + + def view(context, request): # pragma: no cover + return 'NOTOK' + result = self.config.derive_view(view) self.assertFalse(result.__wraps__ is view) self.assertEqual(result(None, None), response) def test_attr_wrapped_view_branching_default_phash(self): from pyramid.config.util import DEFAULT_PHASH - def view(context, request): pass + + def view(context, request): # pragma: no cover + pass + result = self.config._derive_view(view, phash=DEFAULT_PHASH) self.assertEqual(result.__wraps__, view) def test_attr_wrapped_view_branching_nondefault_phash(self): - def view(context, request): pass + def view(context, request): # pragma: no cover + pass + result = self.config._derive_view(view, phash='nondefault') self.assertNotEqual(result, view) def test_http_cached_view_integer(self): import datetime from pyramid.response import Response + response = Response('OK') + def inner_view(context, request): return response + result = self.config._derive_view(inner_view, http_cache=3600) self.assertFalse(result is inner_view) self.assertEqual(inner_view.__module__, result.__module__) @@ -1083,11 +1305,15 @@ def test_http_cached_view_timedelta(self): import datetime from pyramid.response import Response + response = Response('OK') + def inner_view(context, request): return response - result = self.config._derive_view(inner_view, - http_cache=datetime.timedelta(hours=1)) + + result = self.config._derive_view( + inner_view, http_cache=datetime.timedelta(hours=1) + ) self.assertFalse(result is inner_view) self.assertEqual(inner_view.__module__, result.__module__) self.assertEqual(inner_view.__doc__, result.__doc__) @@ -1103,11 +1329,15 @@ def test_http_cached_view_tuple(self): import datetime from pyramid.response import Response + response = Response('OK') + def inner_view(context, request): return response - result = self.config._derive_view(inner_view, - http_cache=(3600, {'public':True})) + + result = self.config._derive_view( + inner_view, http_cache=(3600, {'public': True}) + ) self.assertFalse(result is inner_view) self.assertEqual(inner_view.__module__, result.__module__) self.assertEqual(inner_view.__doc__, result.__doc__) @@ -1122,11 +1352,15 @@ def test_http_cached_view_tuple_seconds_None(self): from pyramid.response import Response + response = Response('OK') + def inner_view(context, request): return response - result = self.config._derive_view(inner_view, - http_cache=(None, {'public':True})) + + result = self.config._derive_view( + inner_view, http_cache=(None, {'public': True}) + ) self.assertFalse(result is inner_view) self.assertEqual(inner_view.__module__, result.__module__) self.assertEqual(inner_view.__doc__, result.__doc__) @@ -1139,14 +1373,17 @@ 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 response + result = self.config._derive_view(inner_view, http_cache=3600) request = self._makeRequest() result = result(None, request) - self.assertEqual(result, response) # 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) @@ -1154,9 +1391,12 @@ 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 + result = self.config._derive_view(inner_view, http_cache=3600) request = self._makeRequest() result = result(None, request) @@ -1166,14 +1406,22 @@ self.assertFalse('Cache-Control' in headers) def test_http_cached_view_bad_tuple(self): - def view(request): pass - self.assertRaises(ConfigurationError, self.config._derive_view, - view, http_cache=(None,)) + def view(request): # pragma: no cover + pass + + self.assertRaises( + ConfigurationError, + self.config._derive_view, + view, + http_cache=(None,), + ) def test_csrf_view_ignores_GET(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.method = 'GET' view = self.config._derive_view(inner_view, require_csrf=True) @@ -1182,7 +1430,10 @@ def test_csrf_view_fails_with_bad_POST_header(self): from pyramid.exceptions import BadCSRFToken - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1193,8 +1444,10 @@ def test_csrf_view_passes_with_good_POST_header(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1206,7 +1459,10 @@ def test_csrf_view_fails_with_bad_POST_token(self): from pyramid.exceptions import BadCSRFToken - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1217,8 +1473,10 @@ def test_csrf_view_passes_with_good_POST_token(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1230,8 +1488,10 @@ def test_csrf_view_https_domain(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "https" request.domain = "example.com" @@ -1246,7 +1506,10 @@ def test_csrf_view_fails_on_bad_PUT_header(self): from pyramid.exceptions import BadCSRFToken - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.scheme = "http" request.method = 'PUT' @@ -1257,7 +1520,10 @@ def test_csrf_view_fails_on_bad_referrer(self): from pyramid.exceptions import BadCSRFOrigin - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.method = "POST" request.scheme = "https" @@ -1270,7 +1536,10 @@ def test_csrf_view_fails_on_bad_origin(self): from pyramid.exceptions import BadCSRFOrigin - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.method = "POST" request.scheme = "https" @@ -1283,7 +1552,10 @@ def test_csrf_view_enabled_by_default(self): from pyramid.exceptions import BadCSRFToken - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1295,35 +1567,48 @@ def test_csrf_view_enabled_via_callback(self): def callback(request): return True + from pyramid.exceptions import BadCSRFToken - def inner_view(request): pass + + def inner_view(request): # pragma: no cover + pass + request = self._makeRequest() request.scheme = "http" request.method = 'POST' request.session = DummySession({'csrf_token': 'foo'}) - self.config.set_default_csrf_options(require_csrf=True, callback=callback) + self.config.set_default_csrf_options( + require_csrf=True, callback=callback + ) view = self.config._derive_view(inner_view) self.assertRaises(BadCSRFToken, lambda: view(None, request)) def test_csrf_view_disabled_via_callback(self): def callback(request): return False + response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' request.session = DummySession({'csrf_token': 'foo'}) - self.config.set_default_csrf_options(require_csrf=True, callback=callback) + self.config.set_default_csrf_options( + require_csrf=True, callback=callback + ) view = self.config._derive_view(inner_view) result = view(None, request) self.assertTrue(result is response) def test_csrf_view_uses_custom_csrf_token(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1336,8 +1621,10 @@ def test_csrf_view_uses_custom_csrf_header(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1350,22 +1637,27 @@ def test_csrf_view_uses_custom_methods(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'PUT' request.session = DummySession({'csrf_token': 'foo'}) self.config.set_default_csrf_options( - require_csrf=True, safe_methods=['PUT']) + require_csrf=True, safe_methods=['PUT'] + ) view = self.config._derive_view(inner_view) result = view(None, request) self.assertTrue(result is response) def test_csrf_view_uses_view_option_override(self): response = DummyResponse() + def inner_view(request): return response + request = self._makeRequest() request.scheme = "http" request.method = 'POST' @@ -1378,13 +1670,17 @@ def test_csrf_view_skipped_by_default_on_exception_view(self): from pyramid.request import Request + def view(request): raise ValueError + def excview(request): return 'hello' + self.config.set_default_csrf_options(require_csrf=True) self.config.set_session_factory( - lambda request: DummySession({'csrf_token': 'foo'})) + lambda request: DummySession({'csrf_token': 'foo'}) + ) self.config.add_view(view, name='foo', require_csrf=False) self.config.add_view(excview, context=ValueError, renderer='string') app = self.config.make_wsgi_app() @@ -1396,15 +1692,21 @@ def test_csrf_view_failed_on_explicit_exception_view(self): from pyramid.exceptions import BadCSRFToken from pyramid.request import Request + def view(request): raise ValueError - def excview(request): pass + + def excview(request): # pragma: no cover + pass + self.config.set_default_csrf_options(require_csrf=True) self.config.set_session_factory( - lambda request: DummySession({'csrf_token': 'foo'})) + lambda request: DummySession({'csrf_token': 'foo'}) + ) self.config.add_view(view, name='foo', require_csrf=False) - self.config.add_view(excview, context=ValueError, renderer='string', - require_csrf=True) + self.config.add_view( + excview, context=ValueError, renderer='string', require_csrf=True + ) app = self.config.make_wsgi_app() request = Request.blank('/foo', base_url='http://example.com') request.method = 'POST' @@ -1412,21 +1714,26 @@ request.get_response(app) except BadCSRFToken: pass - else: # pragma: no cover + else: # pragma: no cover raise AssertionError def test_csrf_view_passed_on_explicit_exception_view(self): from pyramid.request import Request + def view(request): raise ValueError + def excview(request): return 'hello' + self.config.set_default_csrf_options(require_csrf=True) self.config.set_session_factory( - lambda request: DummySession({'csrf_token': 'foo'})) + lambda request: DummySession({'csrf_token': 'foo'}) + ) self.config.add_view(view, name='foo', require_csrf=False) - self.config.add_view(excview, context=ValueError, renderer='string', - require_csrf=True) + self.config.add_view( + excview, context=ValueError, renderer='string', require_csrf=True + ) app = self.config.make_wsgi_app() request = Request.blank('/foo', base_url='http://example.com') request.method = 'POST' @@ -1447,24 +1754,29 @@ from pyramid.interfaces import IViewDerivers self.config.add_view_deriver(None, 'deriv1') - self.config.add_view_deriver(None, 'deriv2', 'decorated_view', 'deriv1') + self.config.add_view_deriver( + None, 'deriv2', 'decorated_view', 'deriv1' + ) self.config.add_view_deriver(None, 'deriv3', 'deriv2', 'deriv1') derivers = self.config.registry.getUtility(IViewDerivers) derivers_sorted = derivers.sorted() dlist = [d for (d, _) in derivers_sorted] - self.assertEqual([ - 'secured_view', - 'csrf_view', - 'owrapped_view', - 'http_cached_view', - 'decorated_view', - 'deriv2', - 'deriv3', - 'deriv1', - 'rendered_view', - 'mapped_view', - ], dlist) + self.assertEqual( + [ + 'secured_view', + 'csrf_view', + 'owrapped_view', + 'http_cached_view', + 'decorated_view', + 'deriv2', + 'deriv3', + 'deriv1', + 'rendered_view', + 'mapped_view', + ], + dlist, + ) def test_right_order_implicit(self): from pyramid.interfaces import IViewDerivers @@ -1476,65 +1788,76 @@ derivers = self.config.registry.getUtility(IViewDerivers) derivers_sorted = derivers.sorted() dlist = [d for (d, _) in derivers_sorted] - self.assertEqual([ - 'secured_view', - 'csrf_view', - 'owrapped_view', - 'http_cached_view', - 'decorated_view', - 'deriv3', - 'deriv2', - 'deriv1', - 'rendered_view', - 'mapped_view', - ], dlist) + self.assertEqual( + [ + 'secured_view', + 'csrf_view', + 'owrapped_view', + 'http_cached_view', + 'decorated_view', + 'deriv3', + 'deriv2', + 'deriv1', + 'rendered_view', + 'mapped_view', + ], + dlist, + ) def test_right_order_under_rendered_view(self): from pyramid.interfaces import IViewDerivers - self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view') + self.config.add_view_deriver( + None, 'deriv1', 'rendered_view', 'mapped_view' + ) derivers = self.config.registry.getUtility(IViewDerivers) derivers_sorted = derivers.sorted() dlist = [d for (d, _) in derivers_sorted] - self.assertEqual([ - 'secured_view', - 'csrf_view', - 'owrapped_view', - 'http_cached_view', - 'decorated_view', - 'rendered_view', - 'deriv1', - 'mapped_view', - ], dlist) - + self.assertEqual( + [ + 'secured_view', + 'csrf_view', + 'owrapped_view', + 'http_cached_view', + 'decorated_view', + 'rendered_view', + 'deriv1', + 'mapped_view', + ], + dlist, + ) def test_right_order_under_rendered_view_others(self): from pyramid.interfaces import IViewDerivers - self.config.add_view_deriver(None, 'deriv1', 'rendered_view', 'mapped_view') + self.config.add_view_deriver( + None, 'deriv1', 'rendered_view', 'mapped_view' + ) self.config.add_view_deriver(None, 'deriv2') self.config.add_view_deriver(None, 'deriv3') derivers = self.config.registry.getUtility(IViewDerivers) derivers_sorted = derivers.sorted() dlist = [d for (d, _) in derivers_sorted] - self.assertEqual([ - 'secured_view', - 'csrf_view', - 'owrapped_view', - 'http_cached_view', - 'decorated_view', - 'deriv3', - 'deriv2', - 'rendered_view', - 'deriv1', - 'mapped_view', - ], dlist) + self.assertEqual( + [ + 'secured_view', + 'csrf_view', + 'owrapped_view', + 'http_cached_view', + 'decorated_view', + 'deriv3', + 'deriv2', + 'rendered_view', + 'deriv1', + 'mapped_view', + ], + dlist, + ) class TestAddDeriver(unittest.TestCase): - def setUp(self): self.config = testing.setUp() @@ -1556,7 +1879,7 @@ self.assertFalse(response.deriv) self.config.add_view_deriver(deriv, 'test_deriv') - result = self.config._derive_view(view) + result = self.config._derive_view(view) # noqa: F841 self.assertTrue(response.deriv) def test_override_deriver(self): @@ -1583,12 +1906,13 @@ flags.clear() view2 = AView() self.config.add_view_deriver(deriv2, 'test_deriv') - result = self.config._derive_view(view2) + result = self.config._derive_view(view2) # noqa: F841 self.assertFalse(flags.get('deriv1')) self.assertTrue(flags.get('deriv2')) def test_override_mapped_view(self): from pyramid.viewderivers import VIEW + response = DummyResponse() view = lambda *arg: response flags = {} @@ -1602,12 +1926,14 @@ flags.clear() self.config.add_view_deriver( - deriv1, name='mapped_view', under='rendered_view', over=VIEW) - result = self.config._derive_view(view) + deriv1, name='mapped_view', under='rendered_view', over=VIEW + ) + result = self.config._derive_view(view) # noqa: F841 self.assertTrue(flags.get('deriv1')) def test_add_multi_derivers_ordered(self): from pyramid.viewderivers import INGRESS + response = DummyResponse() view = lambda *arg: response response.deriv = [] @@ -1627,12 +1953,15 @@ self.config.add_view_deriver(deriv1, 'deriv1') self.config.add_view_deriver(deriv2, 'deriv2', INGRESS, 'deriv1') self.config.add_view_deriver(deriv3, 'deriv3', 'deriv2', 'deriv1') - result = self.config._derive_view(view) + result = self.config._derive_view(view) # noqa: F841 self.assertEqual(response.deriv, ['deriv1', 'deriv3', 'deriv2']) def test_add_deriver_without_name(self): from pyramid.interfaces import IViewDerivers - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + self.config.add_view_deriver(deriv1) derivers = self.config.registry.getUtility(IViewDerivers) self.assertTrue('deriv1' in derivers.names) @@ -1640,40 +1969,53 @@ def test_add_deriver_reserves_ingress(self): from pyramid.exceptions import ConfigurationError from pyramid.viewderivers import INGRESS - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + self.assertRaises( - ConfigurationError, self.config.add_view_deriver, deriv1, INGRESS) + ConfigurationError, self.config.add_view_deriver, deriv1, INGRESS + ) def test_add_deriver_enforces_ingress_is_first(self): from pyramid.exceptions import ConfigurationError from pyramid.viewderivers import INGRESS - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + try: self.config.add_view_deriver(deriv1, over=INGRESS) except ConfigurationError as ex: self.assertTrue('cannot be over INGRESS' in ex.args[0]) - else: # pragma: no cover + else: # pragma: no cover raise AssertionError def test_add_deriver_enforces_view_is_last(self): from pyramid.exceptions import ConfigurationError from pyramid.viewderivers import VIEW - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + try: self.config.add_view_deriver(deriv1, under=VIEW) except ConfigurationError as ex: self.assertTrue('cannot be under VIEW' in ex.args[0]) - else: # pragma: no cover + else: # pragma: no cover raise AssertionError def test_add_deriver_enforces_mapped_view_is_last(self): from pyramid.exceptions import ConfigurationError - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + try: self.config.add_view_deriver(deriv1, 'deriv1', under='mapped_view') except ConfigurationError as ex: self.assertTrue('cannot be under "mapped_view"' in ex.args[0]) - else: # pragma: no cover + else: # pragma: no cover raise AssertionError @@ -1685,20 +2027,25 @@ self.config = None testing.tearDown() - def _getViewCallable(self, config, ctx_iface=None, request_iface=None, - name=''): + def _getViewCallable( + self, config, ctx_iface=None, request_iface=None, name='' + ): from zope.interface import Interface from pyramid.interfaces import IRequest from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier + classifier = IViewClassifier if ctx_iface is None: ctx_iface = Interface if request_iface is None: request_iface = IRequest return config.registry.adapters.lookup( - (classifier, request_iface, ctx_iface), IView, name=name, - default=None) + (classifier, request_iface, ctx_iface), + IView, + name=name, + default=None, + ) def _makeRequest(self, config): request = DummyRequest() @@ -1713,11 +2060,13 @@ def deriv1(view, info): response.deriv.append(info.options['deriv1']) return view + deriv1.options = ('deriv1',) def deriv2(view, info): response.deriv.append(info.options['deriv2']) return view + deriv2.options = ('deriv2',) self.config.add_view_deriver(deriv1, 'deriv1') @@ -1732,11 +2081,16 @@ def test_unexpected_view_options(self): from pyramid.exceptions import ConfigurationError - def deriv1(view, info): pass + + def deriv1(view, info): # pragma: no cover + pass + self.config.add_view_deriver(deriv1, 'deriv1') self.assertRaises( ConfigurationError, - lambda: self.config.add_view(lambda r: {}, deriv1='test1')) + lambda: self.config.add_view(lambda r: {}, deriv1='test1'), + ) + @implementer(IResponse) class DummyResponse(object): @@ -1744,10 +2098,11 @@ default_content_type = None body = None + class DummyRequest: subpath = () matchdict = None - request_iface = IRequest + request_iface = IRequest def __init__(self, environ=None): if environ is None: @@ -1759,13 +2114,17 @@ self.headers = {} self.response = DummyResponse() + class DummyLogger: def __init__(self): self.messages = [] + def info(self, msg): self.messages.append(msg) + warn = info debug = info + class DummySecurityPolicy: def __init__(self, permitted=True): @@ -1777,19 +2136,23 @@ def permits(self, context, principals, permission): return self.permitted + class DummySession(dict): def get_csrf_token(self): return self['csrf_token'] + def parse_httpdate(s): import datetime + # 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'): one_attr = getattr(one, attr) two_attr = getattr(two, attr) - if not one_attr == two_attr: # pragma: no cover + if not one_attr == two_attr: # pragma: no cover raise AssertionError('%r != %r in %s' % (one_attr, two_attr, attr)) -- Gitblit v1.9.3