Skip to content

Commit e774c42

Browse files
author
Nick Bragdon
committed
Adding tests
1 parent 362b891 commit e774c42

2 files changed

Lines changed: 99 additions & 13 deletions

File tree

src/fhirRequest.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,47 +5,45 @@
55

66

77
def fhirRequest(bb, config):
8-
auth_token = config.auth_token
9-
new_auth_token = handle_expired(bb, auth_token, config.refresh_token)
8+
auth_token = config["auth_token"]
9+
new_auth_token = handle_expired(bb, auth_token)
1010

1111
if new_auth_token is not None:
1212
auth_token = new_auth_token
1313

1414
retry_config = Retry(
1515
total=3, backoff_factor=0.2, status_forcelist=[500, 502, 503, 504]
1616
)
17-
full_url = bb.base_url + "/v" + bb.version + config.url
18-
headers = {
19-
"Authorization": "Bearer " + auth_token.access_token,
20-
[SDK_HEADER_KEY]: SDK_HEADER,
21-
}
17+
full_url = bb["base_url"] + "/v" + bb["version"] + config["url"]
18+
headers = {"Authorization": "Bearer " + auth_token["access_token"]}
19+
headers[SDK_HEADER_KEY] = SDK_HEADER
2220
adapter = HTTPAdapter(max_retries=retry_config)
2321
sesh = requests.Session()
2422
sesh.mount("https://", adapter)
2523
sesh.mount("http://", adapter)
26-
response = sesh.get(url=full_url, params=config.params, headers=headers)
24+
response = sesh.get(url=full_url, params=config["params"], headers=headers)
2725

2826
return {"auth_token": new_auth_token, "response": response}
2927

3028

3129
def handle_expired(bb, auth_token):
32-
if datetime.datetime.now() > auth_token.expires_at:
33-
return refresh_access_token(bb, auth_token.refresh_token)
30+
if datetime.datetime.now() > auth_token["expires_at"]:
31+
return refresh_access_token(bb, auth_token["refresh_token"])
3432

3533
return None
3634

3735

3836
def refresh_access_token(bb, refresh_token):
39-
full_url = bb.base_url + "/v" + bb.version + REFRESH_TOKEN_ENDPOINT
37+
full_url = bb["base_url"] + "/v" + bb["version"] + REFRESH_TOKEN_ENDPOINT
4038

4139
params = {
42-
"client_id": bb.client_id,
40+
"client_id": bb["client_id"],
4341
"grant_type": "refresh_token",
4442
"refresh_token": refresh_token,
4543
}
4644

4745
my_response = requests.post(
48-
url=full_url, params=params, auth=(bb.client_id, bb.client_secret)
46+
url=full_url, params=params, auth=(bb["client_id"], bb["client_secret"])
4947
)
5048
response_json = my_response.json()
5149
response_json["expires_at"] = datetime.datetime.now() + datetime.timedelta(

src/test_fhirRequest.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import datetime
2+
import unittest
3+
from unittest import mock
4+
from fhirRequest import fhirRequest
5+
6+
7+
class MockResponse:
8+
def __init__(self, json_data, status_code):
9+
self.json_data = json_data
10+
self.status_code = status_code
11+
12+
def json(self):
13+
return self.json_data
14+
15+
16+
class MockSession:
17+
def __init__(self, json_data, status_code):
18+
self.response = MockResponse(json_data, status_code)
19+
20+
def mount(self, *args, **kwargs):
21+
return
22+
23+
def get(self, *args, **kwargs):
24+
return self.response
25+
26+
27+
def success_fhir_request_mock(*args, **kwargs):
28+
return MockSession({"resourceType": "Patient", "id": "-20140000010000"}, 200)
29+
30+
31+
def error_fhir_request_mock(*args, **kwargs):
32+
return MockSession(None, 500)
33+
34+
35+
def not_found_fhir_request_mock(*args, **kwargs):
36+
return MockSession(None, 404)
37+
38+
39+
def generate_mock_bb():
40+
return {
41+
"base_url": "https://sandbox.bluebutton.cms.gov",
42+
"client_id": "fake_client_id",
43+
"client_secret": "fake_client_secret",
44+
"version": "2",
45+
}
46+
47+
48+
def generate_mock_config():
49+
return {
50+
"url": "/fhir/Patient/-20140000010000",
51+
"params": {},
52+
"auth_token": {
53+
"access_token": "fake_access_token",
54+
"refresh_token": "fake_refresh_token",
55+
"expires_at": datetime.datetime.now() + datetime.timedelta(seconds=36000),
56+
"patient": "-20140000010000",
57+
},
58+
}
59+
60+
61+
class TestAPI(unittest.TestCase):
62+
@mock.patch("requests.Session", side_effect=success_fhir_request_mock)
63+
def test_successful_fhir_request(self, get_request_mock):
64+
bb = generate_mock_bb()
65+
config = generate_mock_config()
66+
response = fhirRequest(bb, config)
67+
self.assertEqual(response["auth_token"], None)
68+
self.assertEqual(response["response"].status_code, 200)
69+
self.assertEqual(response["response"].json()["id"], "-20140000010000")
70+
self.assertEqual(get_request_mock.call_count, 1)
71+
72+
@mock.patch("requests.Session", side_effect=error_fhir_request_mock)
73+
def test_500_error_fhir_request(self, get_request_mock):
74+
bb = generate_mock_bb()
75+
config = generate_mock_config()
76+
response = fhirRequest(bb, config)
77+
self.assertEqual(response["auth_token"], None)
78+
self.assertEqual(response["response"].status_code, 500)
79+
self.assertEqual(get_request_mock.call_count, 1)
80+
81+
@mock.patch("requests.Session", side_effect=not_found_fhir_request_mock)
82+
def test_not_found_fhir_request(self, get_request_mock):
83+
bb = generate_mock_bb()
84+
config = generate_mock_config()
85+
response = fhirRequest(bb, config)
86+
self.assertEqual(response["auth_token"], None)
87+
self.assertEqual(response["response"].status_code, 404)
88+
self.assertEqual(get_request_mock.call_count, 1)

0 commit comments

Comments
 (0)