Reputation: 181
I wrote an endpoint that calls an API to get the time of day for a timezone defined by the user. Now I need to Mock this endpoint but I am having trouble coming up with the correct answer. Here is the code that I wrote:
Im not quite sure what I am suppose to call to get a response.
import requests
import json
import jsonpath
import dateutil
from flask import Flask, render_template, request
from flask import jsonify, make_response
app = Flask(__name__, template_folder="templates")
@app.route('/get_time', methods=['GET'])
def get_time():
try:
time_zone = request.args.get('time_zone')
url = "http://worldclockapi.com/api/json/" + time_zone + "/now"
r = requests.get(url)
except Exception:
return make_response(jsonify({"Error": "Some error message"}), 400)
return r.json()["currentDateTime"]
if response.status_code != 200:
print("Error on response")
return response.status_code, response.text
if __name__ == '__main__':
app.run(debug=True)
This is what I have for the Test:
import json
import unittest
import unittest.mock
import requests
#name of the file being tested
import timeofday
class MockResponse:
def __init__(self, text, status_code):
self.text = text
self.status_code = status_code
def json(self):
return json.loads(self.text)
def __iter__(self):
return self
def __next__(self):
return self
#json returned by the API http://worldclockapi.com/api/json/est/now
def mock_requests_timeofday(*args, **kwargs):
text = """
{
"$id": "1",
"currentDateTime": "2019-11-08T15:52-05:00",
"utcOffset": "-05:00:00",
"isDayLightSavingsTime": false,
"dayOfTheWeek": "Friday",
"timeZoneName": "Eastern Standard Time",
"currentFileTime": 132177019635463680,
"ordinalDate": "2019-312",
"serviceResponse": null
}}
"""
response = MockResponse(text, 200)
return response
class TestLocation(unittest.TestCase):
@unittest.mock.patch('requests.get', mock_requests_get_success)
def test_get_time(self):
self.assertEqual(response.status_code, 200)
class TestTimeofday(unittest.TestCase):
@unittest.mock.patch('timeofday.requests.get', mock_requests_timeofday)
def get_time(self):
self.assertEqual(response.status_code, 200)
Upvotes: 0
Views: 84
Reputation: 405
Your code is currently failing because you directly mock the get function of the module you've imported in your test file.
In order to make your test work, you will have to mock directly the requests.get
method of your other file.
This is what a mock of the get method you did in the timeofday.py
could look like:
mock.patch('timeofday.requests.get', mock_requests_get_success)
Now when you execute get_time
the API call should be mocked and you will receive the answer you defined.
PS: Be aware that the if statement you wrote after the return r.json()["currentDateTime"] will never be executed because your function is ending when you use return.
Upvotes: 1