From f9e876500cf208ba25c130dab716f9f9063cee12 Mon Sep 17 00:00:00 2001 From: Luca Giovenzana Date: Tue, 20 Apr 2021 19:01:52 +0200 Subject: [PATCH 1/4] [test] shows the breaking change of issue #329 Breaking change with url partially defined in Create Session and * On Session keywords #329 --- utests/test_RequestsKeywords.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/utests/test_RequestsKeywords.py b/utests/test_RequestsKeywords.py index c4b4c84..0c31b55 100644 --- a/utests/test_RequestsKeywords.py +++ b/utests/test_RequestsKeywords.py @@ -25,29 +25,41 @@ def test_get_url_with_none_session(): assert url == 'http://thisisa.url' -def test_get_url_with_base(): +def test_get_url_with_session_url_only(): session, keywords = build_mocked_session_keywords('http://www.domain.com') url = keywords._get_url(session, '') assert url == 'http://www.domain.com' -def test_get_url_with_base_endpoint(): +def test_get_url_with_session_url_and_uri_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com') url = keywords._get_url(session, 'endpoint') assert url == 'http://www.domain.com/endpoint' -def test_get_url_with_base_slash_endpoint_pre(): +def test_get_url_with_session_url_slash_and_uri_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com/') url = keywords._get_url(session, 'endpoint') assert url == 'http://www.domain.com/endpoint' -def test_get_url_with_base_slash_endpoint_post(): +def test_get_url_with_session_url_and_uri_slash_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com') url = keywords._get_url(session, '/endpoint') assert url == 'http://www.domain.com/endpoint' +# breaking change with 0.8 :( #329 +def test_get_url_with_session_url_path_and_uri_root_endpoint(): + session, keywords = build_mocked_session_keywords('http://www.domain.com/path') + url = keywords._get_url(session, '/endpoint') + assert url == 'http://www.domain.com/endpoint' + + +def test_get_url_with_session_url_path_and_uri_endpoint(): + session, keywords = build_mocked_session_keywords('http://www.domain.com/path/') + url = keywords._get_url(session, 'endpoint') + assert url == 'http://www.domain.com/path/endpoint' + @pytest.mark.skipif(sys.version_info < (3, 0), reason="different urljoin handling of double slash") def test_get_url_with_base2trailing_endpoint(): From 9231af06c0e4c679555f6cdba77a6372c3f3cb4b Mon Sep 17 00:00:00 2001 From: Luca Giovenzana Date: Wed, 21 Apr 2021 01:08:46 +0200 Subject: [PATCH 2/4] [fix] fixes #329 manipulating urls before urljoin --- .gitignore | 1 + src/RequestsLibrary/RequestsKeywords.py | 17 +++++--- utests/test_RequestsKeywords.py | 54 ++++++++++++++----------- 3 files changed, 44 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 4dd337a..ea232d3 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ lib/ test.py bin/ src/robotframework_requests.egg-info/ +.pytest_cache/* # ignore virtuvalenv venv/* diff --git a/src/RequestsLibrary/RequestsKeywords.py b/src/RequestsLibrary/RequestsKeywords.py index 4d932df..58b4a39 100644 --- a/src/RequestsLibrary/RequestsKeywords.py +++ b/src/RequestsLibrary/RequestsKeywords.py @@ -35,7 +35,7 @@ def _common_request( self._capture_output() resp = method_function( - self._get_url(session, uri), + self._merge_url(session, uri), timeout=self._get_timeout(kwargs.pop('timeout', None)), cookies=kwargs.pop('cookies', self.cookies), **kwargs) @@ -53,15 +53,22 @@ def _common_request( return resp + @staticmethod - def _get_url(session, uri): + def _merge_url(session, uri): """ - Helper method to get the full url + Helper method that join session url and request url. + It relies on urljoin that handles quite good join urls and multiple / + but has some counter intuitive behaviours if you join uri starting with / + It handles also override in case a full url (http://etc) is passed as uri. """ + base = '' if session: base = session.url - else: - base = '' + if session and uri: + base = session.url + '/' + if session and uri and uri.startswith('/'): + uri = uri[1:] url = urljoin(base, uri) return url diff --git a/utests/test_RequestsKeywords.py b/utests/test_RequestsKeywords.py index 0c31b55..c88a4c2 100644 --- a/utests/test_RequestsKeywords.py +++ b/utests/test_RequestsKeywords.py @@ -19,62 +19,70 @@ def build_mocked_session_keywords(url=''): return session, keywords -def test_get_url_with_none_session(): +def test_merge_url_with_none_session(): keywords = RequestsLibrary() - url = keywords._get_url(None, 'http://thisisa.url') + url = keywords._merge_url(None, 'http://thisisa.url') assert url == 'http://thisisa.url' -def test_get_url_with_session_url_only(): +def test_merge_url_with_session_url_only(): session, keywords = build_mocked_session_keywords('http://www.domain.com') - url = keywords._get_url(session, '') + url = keywords._merge_url(session, '') assert url == 'http://www.domain.com' -def test_get_url_with_session_url_and_uri_endpoint(): +def test_merge_url_with_session_url_and_uri_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com') - url = keywords._get_url(session, 'endpoint') + url = keywords._merge_url(session, 'endpoint') assert url == 'http://www.domain.com/endpoint' -def test_get_url_with_session_url_slash_and_uri_endpoint(): +def test_merge_url_with_session_url_slash_and_uri_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com/') - url = keywords._get_url(session, 'endpoint') + url = keywords._merge_url(session, 'endpoint') assert url == 'http://www.domain.com/endpoint' -def test_get_url_with_session_url_and_uri_slash_endpoint(): +def test_merge_url_with_session_url_and_uri_slash_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com') - url = keywords._get_url(session, '/endpoint') + url = keywords._merge_url(session, '/endpoint') assert url == 'http://www.domain.com/endpoint' -# breaking change with 0.8 :( #329 -def test_get_url_with_session_url_path_and_uri_root_endpoint(): + +# breaking change with 0.8 introduced in 0.9 :( #329 +def test_merge_url_with_session_url_path_and_uri_root_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com/path') - url = keywords._get_url(session, '/endpoint') - assert url == 'http://www.domain.com/endpoint' + url = keywords._merge_url(session, '/endpoint') + assert url == 'http://www.domain.com/path/endpoint' + + +# breaking change with 0.8 introduced in 0.9 :( #329 +def test_merge_url_with_session_url_path_and_uri_endpoint(): + session, keywords = build_mocked_session_keywords('http://www.domain.com/path') + url = keywords._merge_url(session, 'endpoint') + assert url == 'http://www.domain.com/path/endpoint' -def test_get_url_with_session_url_path_and_uri_endpoint(): +def test_merge_url_with_session_url_path_slash_and_uri_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com/path/') - url = keywords._get_url(session, 'endpoint') + url = keywords._merge_url(session, 'endpoint') assert url == 'http://www.domain.com/path/endpoint' @pytest.mark.skipif(sys.version_info < (3, 0), reason="different urljoin handling of double slash") -def test_get_url_with_base2trailing_endpoint(): +def test_merge_url_with_session2trailing_and_endpoint(): session, keywords = build_mocked_session_keywords('http://www.domain.com//') - url = keywords._get_url(session, 'endpoint') + url = keywords._merge_url(session, 'endpoint') assert url == 'http://www.domain.com/endpoint' -def test_get_url_with_base_slash_endpoint_2trailing(): +def test_merge_url_with_session_and_slash_endpoint_2trailing(): session, keywords = build_mocked_session_keywords('http://www.domain.com') - url = keywords._get_url(session, '/endpoint//') - assert url == 'http://www.domain.com/endpoint//' + url = keywords._merge_url(session, '/endpoint//') + assert url == 'http://www.domain.com/endpoint/' -def test_get_url_with_url_override_base(): +def test_merge_url_with_url_override_base(): session, keywords = build_mocked_session_keywords('http://www.domain.com') - url = keywords._get_url(session, 'https://new.domain.com') + url = keywords._merge_url(session, 'https://new.domain.com') assert url == 'https://new.domain.com' From e33100184e0466563f17d4d4c24c207176667d7e Mon Sep 17 00:00:00 2001 From: Luca Giovenzana Date: Wed, 21 Apr 2021 01:28:46 +0200 Subject: [PATCH 3/4] [fix] fixes 2.7 tests --- src/RequestsLibrary/RequestsKeywords.py | 2 +- utests/test_RequestsKeywords.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/RequestsLibrary/RequestsKeywords.py b/src/RequestsLibrary/RequestsKeywords.py index 58b4a39..290abf3 100644 --- a/src/RequestsLibrary/RequestsKeywords.py +++ b/src/RequestsLibrary/RequestsKeywords.py @@ -65,7 +65,7 @@ def _merge_url(session, uri): base = '' if session: base = session.url - if session and uri: + if session and uri and not session.url.endswith('/'): base = session.url + '/' if session and uri and uri.startswith('/'): uri = uri[1:] diff --git a/utests/test_RequestsKeywords.py b/utests/test_RequestsKeywords.py index c88a4c2..65b0bda 100644 --- a/utests/test_RequestsKeywords.py +++ b/utests/test_RequestsKeywords.py @@ -76,6 +76,7 @@ def test_merge_url_with_session2trailing_and_endpoint(): assert url == 'http://www.domain.com/endpoint' +@pytest.mark.skipif(sys.version_info < (3, 0), reason="different urljoin handling of double slash") def test_merge_url_with_session_and_slash_endpoint_2trailing(): session, keywords = build_mocked_session_keywords('http://www.domain.com') url = keywords._merge_url(session, '/endpoint//') From 419b4f5c1f2cfe8e3f623bd70fb7f11b4004fbcc Mon Sep 17 00:00:00 2001 From: Luca Giovenzana Date: Thu, 22 Apr 2021 08:19:08 +0200 Subject: [PATCH 4/4] [release] increases version to 0.9.1 --- README.md | 4 ++-- src/RequestsLibrary/__init__.py | 4 ++-- src/RequestsLibrary/version.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f56537b..9e0b0d9 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,13 @@ Library RequestsLibrary *** Test Cases *** -Quick Get Request +Quick Get Request Test ${response}= GET https://www.google.com Quick Get Request With Parameters Test ${response}= GET https://www.google.com/search params=query=ciao expected_status=200 -Quick Get A JSON Body +Quick Get A JSON Body Test ${response}= GET https://jsonplaceholder.typicode.com/posts/1 Should Be Equal As Strings 1 ${response.json()}[id] ``` diff --git a/src/RequestsLibrary/__init__.py b/src/RequestsLibrary/__init__.py index 5e7e37a..c986205 100644 --- a/src/RequestsLibrary/__init__.py +++ b/src/RequestsLibrary/__init__.py @@ -32,13 +32,13 @@ class RequestsLibrary(RequestsOnSessionKeywords, DeprecatedKeywords): | Library RequestsLibrary | | *** Test Cases *** - | Quick Get Request + | Quick Get Request Test | ${response}= GET https://www.google.com | | Quick Get Request With Parameters Test | ${response}= GET https://www.google.com/search params=query=ciao expected_status=200 | - | Quick Get A JSON Body + | Quick Get A JSON Body Test | ${response}= GET https://jsonplaceholder.typicode.com/posts/1 | Should Be Equal As Strings 1 ${response.json()}[id] diff --git a/src/RequestsLibrary/version.py b/src/RequestsLibrary/version.py index e90ccf6..1f867ad 100644 --- a/src/RequestsLibrary/version.py +++ b/src/RequestsLibrary/version.py @@ -1 +1 @@ -VERSION = '0.9' +VERSION = '0.9.1'