From 5828e5ab3d2efac02b7785d876836ffd88726d7c Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Thu, 11 Feb 2016 11:26:45 +0100 Subject: [PATCH 1/4] Apply request extensions on forged requests (ref Kinto/kinto#438) --- cliquet/tests/test_utils.py | 23 ++++++++++++++++++++++- cliquet/tests/test_views_batch.py | 1 - cliquet/utils.py | 6 +++++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/cliquet/tests/test_utils.py b/cliquet/tests/test_utils.py index c640ad4d5..24f7450da 100644 --- a/cliquet/tests/test_utils.py +++ b/cliquet/tests/test_utils.py @@ -9,7 +9,8 @@ from cliquet.utils import ( native_value, strip_whitespace, random_bytes_hex, read_env, hmac_digest, - current_service, encode_header, decode_header, follow_subrequest + current_service, encode_header, decode_header, follow_subrequest, + build_request ) from .support import unittest, DummyRequest @@ -118,6 +119,26 @@ def test_current_service_returns_none_for_unexisting_patterns(self): self.assertEqual(current_service(request), None) +def build_real_request(wsgi_environ): + from pyramid import request as pyramid_request + from pyramid import testing + from cliquet import includeme + from cliquet import DEFAULT_SETTINGS + config = testing.setUp(settings=DEFAULT_SETTINGS) + includeme(config) + request = pyramid_request.Request(wsgi_environ) + request.registry = config.registry + return request + + +class BuildRequestTest(unittest.TestCase): + + def test_built_request_has_cliquet_custom_methods(self): + original = build_real_request({'PATH_INFO': '/foo'}) + request = build_request(original, {"path": "bar"}) + self.assertIsNone(request.current_service) + + class EncodeHeaderTest(unittest.TestCase): def test_returns_a_string_if_passed_a_string(self): diff --git a/cliquet/tests/test_views_batch.py b/cliquet/tests/test_views_batch.py index 5b60f41ec..a78e27ff0 100644 --- a/cliquet/tests/test_views_batch.py +++ b/cliquet/tests/test_views_batch.py @@ -292,7 +292,6 @@ class BatchServiceTest(unittest.TestCase): def setUp(self): self.method, self.view, self.options = batch_service.definitions[0] self.request = DummyRequest() - self.request.registry = mock.Mock(settings=DEFAULT_SETTINGS) def post(self, validated): self.request.validated = validated diff --git a/cliquet/utils.py b/cliquet/utils.py index 5aa6205fc..a7d28c9b7 100644 --- a/cliquet/utils.py +++ b/cliquet/utils.py @@ -36,7 +36,7 @@ def json_serializer(v, **kw): sqlalchemy = None from pyramid import httpexceptions -from pyramid.request import Request +from pyramid.request import Request, apply_request_extensions from pyramid.settings import aslist from cornice import cors from colander import null @@ -262,6 +262,10 @@ def build_request(original, dict_obj): POST=payload, method=method) + request.registry = original.registry + + apply_request_extensions(request) + # This is used to distinguish subrequests from direct incoming requests. # See :func:`cliquet.initialization.setup_logging()` request.parent = original From 36bcec4a38bf1b092dbcc47f1bdfaef376d61e77 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Thu, 11 Feb 2016 14:41:17 +0100 Subject: [PATCH 2/4] flake8 --- cliquet/tests/test_views_batch.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cliquet/tests/test_views_batch.py b/cliquet/tests/test_views_batch.py index a78e27ff0..28fb6fca4 100644 --- a/cliquet/tests/test_views_batch.py +++ b/cliquet/tests/test_views_batch.py @@ -5,7 +5,6 @@ from pyramid.response import Response -from cliquet import DEFAULT_SETTINGS from cliquet.views.batch import BatchPayloadSchema, batch as batch_service from cliquet.tests.support import BaseWebTest, unittest, DummyRequest from cliquet.utils import json From 0237d1e60453f8be501ffca4579d9ab50db0ada3 Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Mon, 15 Feb 2016 17:11:55 +0100 Subject: [PATCH 3/4] @almet @Natim reviews --- cliquet/tests/test_utils.py | 28 +++++++++++++++------------- cliquet/utils.py | 2 -- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cliquet/tests/test_utils.py b/cliquet/tests/test_utils.py index 24f7450da..45dc3febd 100644 --- a/cliquet/tests/test_utils.py +++ b/cliquet/tests/test_utils.py @@ -5,7 +5,11 @@ import colander import mock import six +from cliquet import includeme +from cliquet import DEFAULT_SETTINGS from pyramid import httpexceptions +from pyramid import request as pyramid_request +from pyramid import testing from cliquet.utils import ( native_value, strip_whitespace, random_bytes_hex, read_env, hmac_digest, @@ -16,6 +20,16 @@ from .support import unittest, DummyRequest +def build_real_request(wsgi_environ): + """Build a Pyramid request, as if it was instantiated by Pyramid. + """ + config = testing.setUp(settings=DEFAULT_SETTINGS) + includeme(config) + request = pyramid_request.Request(wsgi_environ) + request.registry = config.registry + return request + + class NativeValueTest(unittest.TestCase): def test_simple_string(self): self.assertEqual(native_value('value'), 'value') @@ -119,24 +133,12 @@ def test_current_service_returns_none_for_unexisting_patterns(self): self.assertEqual(current_service(request), None) -def build_real_request(wsgi_environ): - from pyramid import request as pyramid_request - from pyramid import testing - from cliquet import includeme - from cliquet import DEFAULT_SETTINGS - config = testing.setUp(settings=DEFAULT_SETTINGS) - includeme(config) - request = pyramid_request.Request(wsgi_environ) - request.registry = config.registry - return request - - class BuildRequestTest(unittest.TestCase): def test_built_request_has_cliquet_custom_methods(self): original = build_real_request({'PATH_INFO': '/foo'}) request = build_request(original, {"path": "bar"}) - self.assertIsNone(request.current_service) + self.assertIsTrue(hasattr(request, 'current_service')) class EncodeHeaderTest(unittest.TestCase): diff --git a/cliquet/utils.py b/cliquet/utils.py index a7d28c9b7..0bd9ce66d 100644 --- a/cliquet/utils.py +++ b/cliquet/utils.py @@ -261,9 +261,7 @@ def build_request(original, dict_obj): headers=headers, POST=payload, method=method) - request.registry = original.registry - apply_request_extensions(request) # This is used to distinguish subrequests from direct incoming requests. From c1f84e3993c46f6dba3bab998643f7db2d06ac8c Mon Sep 17 00:00:00 2001 From: Mathieu Leplatre Date: Tue, 16 Feb 2016 00:23:42 +0100 Subject: [PATCH 4/4] typo --- cliquet/tests/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cliquet/tests/test_utils.py b/cliquet/tests/test_utils.py index 45dc3febd..c061a44c0 100644 --- a/cliquet/tests/test_utils.py +++ b/cliquet/tests/test_utils.py @@ -138,7 +138,7 @@ class BuildRequestTest(unittest.TestCase): def test_built_request_has_cliquet_custom_methods(self): original = build_real_request({'PATH_INFO': '/foo'}) request = build_request(original, {"path": "bar"}) - self.assertIsTrue(hasattr(request, 'current_service')) + self.assertTrue(hasattr(request, 'current_service')) class EncodeHeaderTest(unittest.TestCase):