Skip to content

Commit 9d62731

Browse files
authored
Merge pull request #330 from MarketSquare/lucagiove/issue329
Fixes #329 breaking change in urls behaviors
2 parents 34d89a6 + 419b4f5 commit 9d62731

File tree

6 files changed

+56
-27
lines changed

6 files changed

+56
-27
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ lib/
2323
test.py
2424
bin/
2525
src/robotframework_requests.egg-info/
26+
.pytest_cache/*
2627

2728
# ignore virtuvalenv
2829
venv/*

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ Library RequestsLibrary
1818
1919
*** Test Cases ***
2020
21-
Quick Get Request
21+
Quick Get Request Test
2222
${response}= GET https://www.google.com
2323
2424
Quick Get Request With Parameters Test
2525
${response}= GET https://www.google.com/search params=query=ciao expected_status=200
2626
27-
Quick Get A JSON Body
27+
Quick Get A JSON Body Test
2828
${response}= GET https://jsonplaceholder.typicode.com/posts/1
2929
Should Be Equal As Strings 1 ${response.json()}[id]
3030
```

src/RequestsLibrary/RequestsKeywords.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def _common_request(
3535
self._capture_output()
3636

3737
resp = method_function(
38-
self._get_url(session, uri),
38+
self._merge_url(session, uri),
3939
timeout=self._get_timeout(kwargs.pop('timeout', None)),
4040
cookies=kwargs.pop('cookies', self.cookies),
4141
**kwargs)
@@ -53,15 +53,22 @@ def _common_request(
5353

5454
return resp
5555

56+
5657
@staticmethod
57-
def _get_url(session, uri):
58+
def _merge_url(session, uri):
5859
"""
59-
Helper method to get the full url
60+
Helper method that join session url and request url.
61+
It relies on urljoin that handles quite good join urls and multiple /
62+
but has some counter intuitive behaviours if you join uri starting with /
63+
It handles also override in case a full url (http://etc) is passed as uri.
6064
"""
65+
base = ''
6166
if session:
6267
base = session.url
63-
else:
64-
base = ''
68+
if session and uri and not session.url.endswith('/'):
69+
base = session.url + '/'
70+
if session and uri and uri.startswith('/'):
71+
uri = uri[1:]
6572
url = urljoin(base, uri)
6673
return url
6774

src/RequestsLibrary/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,13 @@ class RequestsLibrary(RequestsOnSessionKeywords, DeprecatedKeywords):
3232
| Library RequestsLibrary
3333
|
3434
| *** Test Cases ***
35-
| Quick Get Request
35+
| Quick Get Request Test
3636
| ${response}= GET https://www.google.com
3737
|
3838
| Quick Get Request With Parameters Test
3939
| ${response}= GET https://www.google.com/search params=query=ciao expected_status=200
4040
|
41-
| Quick Get A JSON Body
41+
| Quick Get A JSON Body Test
4242
| ${response}= GET https://jsonplaceholder.typicode.com/posts/1
4343
| Should Be Equal As Strings 1 ${response.json()}[id]
4444

src/RequestsLibrary/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VERSION = '0.9'
1+
VERSION = '0.9.1'

utests/test_RequestsKeywords.py

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,50 +19,71 @@ def build_mocked_session_keywords(url=''):
1919
return session, keywords
2020

2121

22-
def test_get_url_with_none_session():
22+
def test_merge_url_with_none_session():
2323
keywords = RequestsLibrary()
24-
url = keywords._get_url(None, 'http://thisisa.url')
24+
url = keywords._merge_url(None, 'http://thisisa.url')
2525
assert url == 'http://thisisa.url'
2626

2727

28-
def test_get_url_with_base():
28+
def test_merge_url_with_session_url_only():
2929
session, keywords = build_mocked_session_keywords('http://www.domain.com')
30-
url = keywords._get_url(session, '')
30+
url = keywords._merge_url(session, '')
3131
assert url == 'http://www.domain.com'
3232

3333

34-
def test_get_url_with_base_endpoint():
34+
def test_merge_url_with_session_url_and_uri_endpoint():
3535
session, keywords = build_mocked_session_keywords('http://www.domain.com')
36-
url = keywords._get_url(session, 'endpoint')
36+
url = keywords._merge_url(session, 'endpoint')
3737
assert url == 'http://www.domain.com/endpoint'
3838

3939

40-
def test_get_url_with_base_slash_endpoint_pre():
40+
def test_merge_url_with_session_url_slash_and_uri_endpoint():
4141
session, keywords = build_mocked_session_keywords('http://www.domain.com/')
42-
url = keywords._get_url(session, 'endpoint')
42+
url = keywords._merge_url(session, 'endpoint')
4343
assert url == 'http://www.domain.com/endpoint'
4444

4545

46-
def test_get_url_with_base_slash_endpoint_post():
46+
def test_merge_url_with_session_url_and_uri_slash_endpoint():
4747
session, keywords = build_mocked_session_keywords('http://www.domain.com')
48-
url = keywords._get_url(session, '/endpoint')
48+
url = keywords._merge_url(session, '/endpoint')
4949
assert url == 'http://www.domain.com/endpoint'
5050

5151

52+
# breaking change with 0.8 introduced in 0.9 :( #329
53+
def test_merge_url_with_session_url_path_and_uri_root_endpoint():
54+
session, keywords = build_mocked_session_keywords('http://www.domain.com/path')
55+
url = keywords._merge_url(session, '/endpoint')
56+
assert url == 'http://www.domain.com/path/endpoint'
57+
58+
59+
# breaking change with 0.8 introduced in 0.9 :( #329
60+
def test_merge_url_with_session_url_path_and_uri_endpoint():
61+
session, keywords = build_mocked_session_keywords('http://www.domain.com/path')
62+
url = keywords._merge_url(session, 'endpoint')
63+
assert url == 'http://www.domain.com/path/endpoint'
64+
65+
66+
def test_merge_url_with_session_url_path_slash_and_uri_endpoint():
67+
session, keywords = build_mocked_session_keywords('http://www.domain.com/path/')
68+
url = keywords._merge_url(session, 'endpoint')
69+
assert url == 'http://www.domain.com/path/endpoint'
70+
71+
5272
@pytest.mark.skipif(sys.version_info < (3, 0), reason="different urljoin handling of double slash")
53-
def test_get_url_with_base2trailing_endpoint():
73+
def test_merge_url_with_session2trailing_and_endpoint():
5474
session, keywords = build_mocked_session_keywords('http://www.domain.com//')
55-
url = keywords._get_url(session, 'endpoint')
75+
url = keywords._merge_url(session, 'endpoint')
5676
assert url == 'http://www.domain.com/endpoint'
5777

5878

59-
def test_get_url_with_base_slash_endpoint_2trailing():
79+
@pytest.mark.skipif(sys.version_info < (3, 0), reason="different urljoin handling of double slash")
80+
def test_merge_url_with_session_and_slash_endpoint_2trailing():
6081
session, keywords = build_mocked_session_keywords('http://www.domain.com')
61-
url = keywords._get_url(session, '/endpoint//')
62-
assert url == 'http://www.domain.com/endpoint//'
82+
url = keywords._merge_url(session, '/endpoint//')
83+
assert url == 'http://www.domain.com/endpoint/'
6384

6485

65-
def test_get_url_with_url_override_base():
86+
def test_merge_url_with_url_override_base():
6687
session, keywords = build_mocked_session_keywords('http://www.domain.com')
67-
url = keywords._get_url(session, 'https://new.domain.com')
88+
url = keywords._merge_url(session, 'https://new.domain.com')
6889
assert url == 'https://new.domain.com'

0 commit comments

Comments
 (0)