Skip to content

Commit

Permalink
Merge pull request #330 from MarketSquare/lucagiove/issue329
Browse files Browse the repository at this point in the history
Fixes #329 breaking change in urls behaviors
  • Loading branch information
lucagiove authored Apr 22, 2021
2 parents 34d89a6 + 419b4f5 commit 9d62731
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 27 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ lib/
test.py
bin/
src/robotframework_requests.egg-info/
.pytest_cache/*

# ignore virtuvalenv
venv/*
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]
```
Expand Down
17 changes: 12 additions & 5 deletions src/RequestsLibrary/RequestsKeywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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 and not session.url.endswith('/'):
base = session.url + '/'
if session and uri and uri.startswith('/'):
uri = uri[1:]
url = urljoin(base, uri)
return url

Expand Down
4 changes: 2 additions & 2 deletions src/RequestsLibrary/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
2 changes: 1 addition & 1 deletion src/RequestsLibrary/version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
VERSION = '0.9'
VERSION = '0.9.1'
55 changes: 38 additions & 17 deletions utests/test_RequestsKeywords.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,50 +19,71 @@ 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_base():
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_base_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_base_slash_endpoint_pre():
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_base_slash_endpoint_post():
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 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._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_merge_url_with_session_url_path_slash_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'


@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():
@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._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'

0 comments on commit 9d62731

Please sign in to comment.