From 12ddf78f9515f110d5d6aeda5d5a65e486e86390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 5 Aug 2016 11:01:41 +0200 Subject: [PATCH 1/6] Added unit test for issue 810. The problem seems to be that code called by post_internal() relies on the Flask request object, even though the current request may not be a POST to the given resource. --- eve/methods/common.py | 2 ++ eve/tests/endpoints.py | 21 +++++++++++++++++++++ eve/tests/test_prefix.py | 1 + 3 files changed, 24 insertions(+) diff --git a/eve/methods/common.py b/eve/methods/common.py index 58aa60f68..4a40d9bf4 100644 --- a/eve/methods/common.py +++ b/eve/methods/common.py @@ -1080,6 +1080,8 @@ def resource_link(): """ path = request.path.strip('/') + assert request.routing_exception is None, 'Routing error for %s: %s' % (request.url, request.routing_exception) + if '|item' in request.endpoint: path = path[:path.rfind('/')] diff --git a/eve/tests/endpoints.py b/eve/tests/endpoints.py index bd94effab..74e71d377 100644 --- a/eve/tests/endpoints.py +++ b/eve/tests/endpoints.py @@ -218,6 +218,27 @@ def test_api_prefix(self): r = self.test_prefix.get('/prefix/contacts/') self.assert200(r.status_code) + r = self.test_prefix.post('/prefix/contacts/', data='{}', + content_type='application/json') + self.assert201(r.status_code) + + def test_api_prefix_post_internal(self): + from eve.methods.post import post_internal + + settings_file = os.path.join(self.this_directory, 'test_prefix.py') + self.app = Eve(settings=settings_file) + self.test_prefix = self.app.test_client() + + # This works fine + with self.app.test_request_context(method='POST', path='/prefix/contacts'): + r, _, _, status_code = post_internal('contacts', {}) + self.assert201(status_code) + + # This fails + with self.app.test_request_context(): + r, _, _, status_code = post_internal('contacts', {}) + self.assert201(status_code) + def test_api_prefix_version(self): settings_file = os.path.join(self.this_directory, 'test_prefix_version.py') diff --git a/eve/tests/test_prefix.py b/eve/tests/test_prefix.py index 75d7b981b..baa0ed1f9 100644 --- a/eve/tests/test_prefix.py +++ b/eve/tests/test_prefix.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +RESOURCE_METHODS = ['GET', 'POST'] URL_PREFIX = 'prefix' DOMAIN = {'contacts': {}} From d3090967c0d68341c8c5a7b3d5d16b8d3f35abb5 Mon Sep 17 00:00:00 2001 From: Nicola Iarocci Date: Wed, 24 May 2017 15:00:03 +0200 Subject: [PATCH 2/6] Fix broken (obsolete) test for #810 --- eve/methods/common.py | 2 -- eve/tests/endpoints.py | 10 ++++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/eve/methods/common.py b/eve/methods/common.py index 4a40d9bf4..58aa60f68 100644 --- a/eve/methods/common.py +++ b/eve/methods/common.py @@ -1080,8 +1080,6 @@ def resource_link(): """ path = request.path.strip('/') - assert request.routing_exception is None, 'Routing error for %s: %s' % (request.url, request.routing_exception) - if '|item' in request.endpoint: path = path[:path.rfind('/')] diff --git a/eve/tests/endpoints.py b/eve/tests/endpoints.py index 74e71d377..46a8e0c0a 100644 --- a/eve/tests/endpoints.py +++ b/eve/tests/endpoints.py @@ -223,6 +223,7 @@ def test_api_prefix(self): self.assert201(r.status_code) def test_api_prefix_post_internal(self): + # https://github.com/pyeve/eve/issues/810 from eve.methods.post import post_internal settings_file = os.path.join(self.this_directory, 'test_prefix.py') @@ -230,13 +231,14 @@ def test_api_prefix_post_internal(self): self.test_prefix = self.app.test_client() # This works fine - with self.app.test_request_context(method='POST', path='/prefix/contacts'): - r, _, _, status_code = post_internal('contacts', {}) + with self.app.test_request_context( + method='POST', path='/prefix/contacts'): + _, _, _, status_code, _ = post_internal('contacts', {}) self.assert201(status_code) - # This fails + # This fails unless #810 is fixed with self.app.test_request_context(): - r, _, _, status_code = post_internal('contacts', {}) + _, _, _, status_code, _ = post_internal('contacts', {}) self.assert201(status_code) def test_api_prefix_version(self): From 3c65242ba7206936088c69ba24a5e535328cef38 Mon Sep 17 00:00:00 2001 From: Nicola Iarocci Date: Wed, 24 May 2017 15:01:49 +0200 Subject: [PATCH 3/6] =?UTF-8?q?Sybren=20A.=20St=C3=BCvel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS b/AUTHORS index 062659a9c..4e4b3b0b1 100644 --- a/AUTHORS +++ b/AUTHORS @@ -138,6 +138,7 @@ Patches and Contributions - Stanislav Filin - Stanislav Heller - Stratos Gerakakis +- Sybren A. Stüvel - Taylor Brown - Thomas Sileo - Tim Jacobi From b8092327a46e97b006d1db4bc876279510d71580 Mon Sep 17 00:00:00 2001 From: Nicola Iarocci Date: Wed, 24 May 2017 15:04:32 +0200 Subject: [PATCH 4/6] Fix: post_internal fails with URL_PREFIX or API_VERSION Closes #810. --- CHANGES | 6 ++++++ eve/auth.py | 2 +- eve/methods/common.py | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 937898cbd..3baecdcb3 100644 --- a/CHANGES +++ b/CHANGES @@ -6,6 +6,12 @@ Here you can see the full list of changes between each Eve release. Development ----------- +Version 0.7.4 +~~~~~~~~~~~~~ + +- Fix: ``post_internal`` fails when using ``URL_PREFIX`` or ``API_VERSION``. + Closes #810. + Stable ------ diff --git a/eve/auth.py b/eve/auth.py index d809cc4b3..2c2590d9d 100644 --- a/eve/auth.py +++ b/eve/auth.py @@ -291,7 +291,7 @@ def auth_field_and_value(resource): .. versionadded:: 0.3 """ - if '|resource' in request.endpoint: + if request.endpoint and '|resource' in request.endpoint: # We are on a resource endpoint and need to check against # `public_methods` public_method_list_to_check = 'public_methods' diff --git a/eve/methods/common.py b/eve/methods/common.py index 58aa60f68..d816a5b6c 100644 --- a/eve/methods/common.py +++ b/eve/methods/common.py @@ -1080,7 +1080,7 @@ def resource_link(): """ path = request.path.strip('/') - if '|item' in request.endpoint: + if request.endpoint and '|item' in request.endpoint: path = path[:path.rfind('/')] def strip_prefix(hit): From f37991b46e0bb54a3cb63d163fbbe787b383dda7 Mon Sep 17 00:00:00 2001 From: Nicola Iarocci Date: Wed, 24 May 2017 15:20:09 +0200 Subject: [PATCH 5/6] v0.7.4 release date --- CHANGES | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 3baecdcb3..41a1c0fb9 100644 --- a/CHANGES +++ b/CHANGES @@ -6,15 +6,17 @@ Here you can see the full list of changes between each Eve release. Development ----------- +Stable +------ + Version 0.7.4 ~~~~~~~~~~~~~ +Released on 24 May, 2017 + - Fix: ``post_internal`` fails when using ``URL_PREFIX`` or ``API_VERSION``. Closes #810. -Stable ------- - Version 0.7.3 ~~~~~~~~~~~~~ From 56793318e7857216269e764c0c027a0c4f6d92c0 Mon Sep 17 00:00:00 2001 From: Nicola Iarocci Date: Wed, 24 May 2017 16:01:07 +0200 Subject: [PATCH 6/6] Bump version to 0.7.4 --- eve/__init__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eve/__init__.py b/eve/__init__.py index 767f3cfeb..dbe6722f8 100644 --- a/eve/__init__.py +++ b/eve/__init__.py @@ -38,7 +38,7 @@ """ -__version__ = '0.7.3' +__version__ = '0.7.4' # RFC 1123 (ex RFC 822) DATE_FORMAT = '%a, %d %b %Y %H:%M:%S GMT' diff --git a/setup.py b/setup.py index 18d803da6..017646734 100755 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ setup( name='Eve', - version='0.7.3', + version='0.7.4', description=DESCRIPTION, long_description=LONG_DESCRIPTION, author='Nicola Iarocci',