Skip to content

Commit 267573c

Browse files
Henry Chanhenrylamchan
authored andcommitted
Tests for request helper
1 parent 52d5a61 commit 267573c

File tree

7 files changed

+121
-11
lines changed

7 files changed

+121
-11
lines changed

test_requirements.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,7 @@
1-
pytest==5.3.2
1+
# Install package deps
2+
-e .
3+
4+
# Test deps
5+
pytest==4.6.9
26
pytest-cov==2.8.1
7+
six==1.13.0

tests/conftest.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
import workos
55

66
class MockResponse(object):
7-
def __init__(self, response_dict, status_code):
7+
def __init__(self, response_dict, status_code, headers=None):
88
self.response_dict = response_dict
99
self.status_code = status_code
10+
self.headers = {} if headers is None else headers
1011

1112
def json(self):
1213
return self.response_dict
@@ -25,10 +26,26 @@ def set_api_key_and_project_id(set_api_key, set_project_id):
2526

2627
@pytest.fixture
2728
def mock_request_method(monkeypatch):
28-
def _mock_request_method(method, response_dict, status_code):
29-
def mock_response(*args, **kwargs):
30-
return MockResponse(response_dict, status_code)
29+
def inner(method, response_dict, status_code, headers=None):
30+
def mock(*args, **kwargs):
31+
return MockResponse(response_dict, status_code, headers=headers)
3132

32-
monkeypatch.setattr(requests, method, mock_response)
33+
monkeypatch.setattr(requests, method, mock)
3334

34-
return _mock_request_method
35+
return inner
36+
37+
@pytest.fixture
38+
def capture_and_mock_requests(monkeypatch):
39+
def inner():
40+
captured_requests = []
41+
42+
def capture(*args, **kwargs):
43+
captured_requests.append((args, kwargs))
44+
return MockResponse({}, 200)
45+
46+
monkeypatch.setattr(requests, 'get', capture)
47+
monkeypatch.setattr(requests, 'post', capture)
48+
49+
return captured_requests
50+
51+
return inner

tests/test_sso.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import json
2-
from urllib.parse import parse_qsl, urlparse
2+
from six.moves.urllib.parse import parse_qsl, urlparse
33

44
import pytest
55

66
import workos
77
from workos.sso import SSO
8-
from workos.utils.requests import RESPONSE_TYPE_CODE
8+
from workos.utils.request import RESPONSE_TYPE_CODE
99

1010
class TestSSO(object):
1111
@pytest.fixture(autouse=True)
@@ -62,7 +62,7 @@ def test_get_profile_returns_expected_workosprofile_object(
6262
}
6363

6464
mock_request_method('post', response_dict, 200)
65-
65+
6666
profile = self.sso.get_profile(123)
6767

6868
assert profile.to_dict() == mock_profile

tests/utils/__init__.py

Whitespace-only changes.

tests/utils/test_requests.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import pytest
2+
3+
from workos.exceptions import (
4+
AuthenticationException, AuthorizationException, BadRequestException,
5+
ServerException,
6+
)
7+
from workos.utils.request import RequestHelper, BASE_HEADERS
8+
9+
STATUS_CODE_TO_EXCEPTION_MAPPING = {
10+
400: BadRequestException,
11+
401: AuthenticationException,
12+
403: AuthorizationException,
13+
500: ServerException,
14+
}
15+
16+
class TestRequestHelper(object):
17+
def test_set_base_api_url(self):
18+
pass
19+
20+
def test_request_raises_expected_exception_for_status_code(
21+
self, mock_request_method
22+
):
23+
request_helper = RequestHelper()
24+
25+
for status_code, exception in STATUS_CODE_TO_EXCEPTION_MAPPING.items():
26+
mock_request_method('get', {}, status_code)
27+
28+
with pytest.raises(exception):
29+
request_helper.request('bad_place')
30+
31+
def test_request_exceptions_include_expected_request_data(
32+
self, mock_request_method
33+
):
34+
request_helper = RequestHelper()
35+
36+
request_id = 'request-123'
37+
response_message = 'stuff happened'
38+
39+
for status_code, exception in STATUS_CODE_TO_EXCEPTION_MAPPING.items():
40+
mock_request_method(
41+
'get',
42+
{'message': response_message, },
43+
status_code,
44+
headers={'X-Request-ID': request_id}
45+
)
46+
47+
try:
48+
request_helper.request('bad_place')
49+
except exception as ex:
50+
assert ex.message == response_message
51+
assert ex.request_id == request_id
52+
except Exception as ex:
53+
# This'll fail for sure here but... just using the nice error that'd come up
54+
assert ex.__class__ == exception
55+
56+
def test_request_bad_body_raises_expected_exception_with_request_data(
57+
self, mock_request_method
58+
):
59+
request_id = 'request-123'
60+
61+
mock_request_method(
62+
'get',
63+
'this_isnt_json',
64+
200,
65+
headers={'X-Request-ID': request_id}
66+
)
67+
68+
try:
69+
RequestHelper().request('bad_place')
70+
except ServerException as ex:
71+
assert ex.message == None
72+
assert ex.request_id == request_id
73+
except Exception as ex:
74+
# This'll fail for sure here but... just using the nice error that'd come up
75+
assert ex.__class__ == ServerException
76+
77+
def test_request_includes_base_headers(self, capture_and_mock_requests):
78+
requests = capture_and_mock_requests()
79+
80+
RequestHelper().request('ok_place')
81+
82+
assert len(requests) == 1
83+
84+
base_headers = set(BASE_HEADERS.items())
85+
headers = set(requests[0][1]['headers'].items())
86+
87+
assert base_headers.issubset(headers)

workos/sso.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import workos
66
from workos.exceptions import ConfigurationException
77
from workos.resources.sso import WorkOSProfile
8-
from workos.utils.requests import RequestHelper, RESPONSE_TYPE_CODE, REQUEST_METHOD_POST
8+
from workos.utils.request import RequestHelper, RESPONSE_TYPE_CODE, REQUEST_METHOD_POST
99

1010
AUTHORIZATION_PATH = 'sso/authorize'
1111
TOKEN_PATH = 'sso/token'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def request(self, path, method=REQUEST_METHOD_GET, params=None):
4444
dict: Response from WorkOS
4545
'''
4646
url = self.generate_api_url(path)
47+
4748
response = getattr(requests, method)(url, headers=BASE_HEADERS, params=params)
4849

4950
status_code = response.status_code

0 commit comments

Comments
 (0)