Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Update test_routes to handle asyncio
  • Loading branch information
james-gray committed Apr 2, 2020
commit c4a6c9ed2ba19a96f173fb6a07d445d31bd0cbde
90 changes: 61 additions & 29 deletions tests/test_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
from unittest import mock

import pytest
from fastapi.testclient import TestClient
from async_asgi_testclient import TestClient

# import app
# from app import services
from .fixtures import mock_client_session
from .fixtures import mocked_session_get
from .fixtures import mocked_strptime_isoformat
from .test_jhu import DATETIME_STRING
from app.main import APP

from .test_jhu import DATETIME_STRING, mocked_requests_get, mocked_strptime_isoformat


@pytest.mark.asyncio
@mock.patch("app.services.location.jhu.datetime")
@mock.patch("app.services.location.jhu.requests.get", side_effect=mocked_requests_get)
class FlaskRoutesTest(unittest.TestCase):
"""
Need to mock some objects to control testing data locally
Expand All @@ -32,89 +32,112 @@ def read_file_v1(self, state):
expected_json_output = file.read()
return expected_json_output

def test_root_api(self, mock_request_get, mock_datetime):
async def test_root_api(self, mock_datetime):
"""Validate that / returns a 200 and is not a redirect."""
response = self.asgi_client.get("/")
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/")

assert response.status_code == 200
assert not response.is_redirect

def test_v1_confirmed(self, mock_request_get, mock_datetime):
async def test_v1_confirmed(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = self.date
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "confirmed"
expected_json_output = self.read_file_v1(state=state)
return_data = self.asgi_client.get("/{}".format(state)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/{}".format(state))
return_data = response.json()

assert return_data == json.loads(expected_json_output)

def test_v1_deaths(self, mock_request_get, mock_datetime):
async def test_v1_deaths(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = self.date
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "deaths"
expected_json_output = self.read_file_v1(state=state)
return_data = self.asgi_client.get("/{}".format(state)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/{}".format(state))
return_data = response.json()

assert return_data == json.loads(expected_json_output)

def test_v1_recovered(self, mock_request_get, mock_datetime):
async def test_v1_recovered(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = self.date
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "recovered"
expected_json_output = self.read_file_v1(state=state)
return_data = self.asgi_client.get("/{}".format(state)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/{}".format(state))
return_data = response.json()

assert return_data == json.loads(expected_json_output)

def test_v1_all(self, mock_request_get, mock_datetime):
async def test_v1_all(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = self.date
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "all"
expected_json_output = self.read_file_v1(state=state)
return_data = self.asgi_client.get("/{}".format(state)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/{}".format(state))
return_data = response.json()

assert return_data == json.loads(expected_json_output)

def test_v2_latest(self, mock_request_get, mock_datetime):
async def test_v2_latest(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = DATETIME_STRING
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "latest"
return_data = self.asgi_client.get(f"/v2/{state}").json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get(f"/v2/{state}")
return_data = response.json()

check_dict = {"latest": {"confirmed": 1940, "deaths": 1940, "recovered": 0}}

assert return_data == check_dict

def test_v2_locations(self, mock_request_get, mock_datetime):
async def test_v2_locations(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = DATETIME_STRING
mock_datetime.strptime.side_effect = mocked_strptime_isoformat
state = "locations"
return_data = self.asgi_client.get("/v2/{}".format(state)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/v2/{}".format(state))
return_data = response.json()

filepath = "tests/expected_output/v2_{state}.json".format(state=state)
with open(filepath, "r") as file:
expected_json_output = file.read()

# TODO: Why is this failing?
# assert return_data == json.loads(expected_json_output)

def test_v2_locations_id(self, mock_request_get, mock_datetime):
async def test_v2_locations_id(self, mock_datetime):
mock_datetime.utcnow.return_value.isoformat.return_value = DATETIME_STRING
mock_datetime.strptime.side_effect = mocked_strptime_isoformat

state = "locations"
test_id = 1
return_data = self.asgi_client.get("/v2/{}/{}".format(state, test_id)).json()
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await self.asgi_client.get("/v2/{}/{}".format(state, test_id))
return_data = response.json()

filepath = "tests/expected_output/v2_{state}_id_{test_id}.json".format(state=state, test_id=test_id)
with open(filepath, "r") as file:
expected_json_output = file.read()

# TODO: Why is this failing?
# assert return_data == expected_json_output

def tearDown(self):
pass


@pytest.mark.asyncio
@pytest.mark.parametrize(
"query_params,expected_status",
[
Expand All @@ -128,13 +151,18 @@ def tearDown(self):
({"source": "jhu", "country_code": "US"}, 404),
],
)
def test_locations_status_code(api_client, query_params, expected_status):
response = api_client.get("/v2/locations", params=query_params)
async def test_locations_status_code(query_params, expected_status):
api_client = TestClient(APP)
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await api_client.get("/v2/locations", query_string=query_params)

print(f"GET {response.url}\n{response}")
print(f"\tjson:\n{pf(response.json())[:1000]}\n\t...")
assert response.status_code == expected_status


@pytest.mark.asyncio
@pytest.mark.parametrize(
"query_params",
[
Expand All @@ -146,8 +174,12 @@ def test_locations_status_code(api_client, query_params, expected_status):
{"source": "jhu", "timelines": True},
],
)
def test_latest(api_client, query_params):
response = api_client.get("/v2/latest", params=query_params)
async def test_latest(query_params):
api_client = TestClient(APP)
async with mock_client_session() as mocked_client_session:
mocked_client_session.get = mocked_session_get
response = await api_client.get("/v2/latest", query_string=query_params)

print(f"GET {response.url}\n{response}")

response_json = response.json()
Expand Down