No longer rely on requests (#23685)
* No longer rely on requests * Lint * Missed a few parts * Fix types * Fix more types * Update __main__.py * Fix tests * Lint * Fix script
This commit is contained in:
parent
f019e2a204
commit
cc13713abd
10 changed files with 271 additions and 197 deletions
|
@ -1,13 +1,12 @@
|
|||
"""Test Home Assistant location util methods."""
|
||||
from unittest import TestCase
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import patch, Mock
|
||||
|
||||
import requests
|
||||
import requests_mock
|
||||
import aiohttp
|
||||
import pytest
|
||||
|
||||
import homeassistant.util.location as location_util
|
||||
|
||||
from tests.common import load_fixture
|
||||
from tests.common import load_fixture, mock_coro
|
||||
|
||||
# Paris
|
||||
COORDINATES_PARIS = (48.864716, 2.349014)
|
||||
|
@ -25,120 +24,139 @@ DISTANCE_KM = 5846.39
|
|||
DISTANCE_MILES = 3632.78
|
||||
|
||||
|
||||
class TestLocationUtil(TestCase):
|
||||
"""Test util location methods."""
|
||||
@pytest.fixture
|
||||
async def session(hass):
|
||||
"""Return aioclient session."""
|
||||
return hass.helpers.aiohttp_client.async_get_clientsession()
|
||||
|
||||
def test_get_distance_to_same_place(self):
|
||||
"""Test getting the distance."""
|
||||
meters = location_util.distance(
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1],
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1])
|
||||
|
||||
assert meters == 0
|
||||
@pytest.fixture
|
||||
async def raising_session(loop):
|
||||
"""Return an aioclient session that only fails."""
|
||||
return Mock(get=Mock(side_effect=aiohttp.ClientError))
|
||||
|
||||
def test_get_distance(self):
|
||||
"""Test getting the distance."""
|
||||
meters = location_util.distance(
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1],
|
||||
COORDINATES_NEW_YORK[0], COORDINATES_NEW_YORK[1])
|
||||
|
||||
assert meters/1000 - DISTANCE_KM < 0.01
|
||||
def test_get_distance_to_same_place():
|
||||
"""Test getting the distance."""
|
||||
meters = location_util.distance(
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1],
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1])
|
||||
|
||||
def test_get_kilometers(self):
|
||||
"""Test getting the distance between given coordinates in km."""
|
||||
kilometers = location_util.vincenty(
|
||||
COORDINATES_PARIS, COORDINATES_NEW_YORK)
|
||||
assert round(kilometers, 2) == DISTANCE_KM
|
||||
assert meters == 0
|
||||
|
||||
def test_get_miles(self):
|
||||
"""Test getting the distance between given coordinates in miles."""
|
||||
miles = location_util.vincenty(
|
||||
COORDINATES_PARIS, COORDINATES_NEW_YORK, miles=True)
|
||||
assert round(miles, 2) == DISTANCE_MILES
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_detect_location_info_ipapi(self, m):
|
||||
"""Test detect location info using ipapi.co."""
|
||||
m.get(
|
||||
location_util.IPAPI, text=load_fixture('ipapi.co.json'))
|
||||
def test_get_distance():
|
||||
"""Test getting the distance."""
|
||||
meters = location_util.distance(
|
||||
COORDINATES_PARIS[0], COORDINATES_PARIS[1],
|
||||
COORDINATES_NEW_YORK[0], COORDINATES_NEW_YORK[1])
|
||||
|
||||
info = location_util.detect_location_info(_test_real=True)
|
||||
assert meters/1000 - DISTANCE_KM < 0.01
|
||||
|
||||
assert info is not None
|
||||
assert info.ip == '1.2.3.4'
|
||||
assert info.country_code == 'CH'
|
||||
assert info.country_name == 'Switzerland'
|
||||
assert info.region_code == 'BE'
|
||||
assert info.region_name == 'Bern'
|
||||
assert info.city == 'Bern'
|
||||
assert info.zip_code == '3000'
|
||||
assert info.time_zone == 'Europe/Zurich'
|
||||
assert info.latitude == 46.9480278
|
||||
assert info.longitude == 7.4490812
|
||||
assert info.use_metric
|
||||
|
||||
@requests_mock.Mocker()
|
||||
@patch('homeassistant.util.location._get_ipapi', return_value=None)
|
||||
def test_detect_location_info_ip_api(self, mock_req, mock_ipapi):
|
||||
"""Test detect location info using ip-api.com."""
|
||||
mock_req.get(
|
||||
location_util.IP_API, text=load_fixture('ip-api.com.json'))
|
||||
def test_get_kilometers():
|
||||
"""Test getting the distance between given coordinates in km."""
|
||||
kilometers = location_util.vincenty(
|
||||
COORDINATES_PARIS, COORDINATES_NEW_YORK)
|
||||
assert round(kilometers, 2) == DISTANCE_KM
|
||||
|
||||
info = location_util.detect_location_info(_test_real=True)
|
||||
|
||||
assert info is not None
|
||||
assert info.ip == '1.2.3.4'
|
||||
assert info.country_code == 'US'
|
||||
assert info.country_name == 'United States'
|
||||
assert info.region_code == 'CA'
|
||||
assert info.region_name == 'California'
|
||||
assert info.city == 'San Diego'
|
||||
assert info.zip_code == '92122'
|
||||
assert info.time_zone == 'America/Los_Angeles'
|
||||
assert info.latitude == 32.8594
|
||||
assert info.longitude == -117.2073
|
||||
assert not info.use_metric
|
||||
def test_get_miles():
|
||||
"""Test getting the distance between given coordinates in miles."""
|
||||
miles = location_util.vincenty(
|
||||
COORDINATES_PARIS, COORDINATES_NEW_YORK, miles=True)
|
||||
assert round(miles, 2) == DISTANCE_MILES
|
||||
|
||||
@patch('homeassistant.util.location.elevation', return_value=0)
|
||||
@patch('homeassistant.util.location._get_ipapi', return_value=None)
|
||||
@patch('homeassistant.util.location._get_ip_api', return_value=None)
|
||||
def test_detect_location_info_both_queries_fail(
|
||||
self, mock_ipapi, mock_ip_api, mock_elevation):
|
||||
"""Ensure we return None if both queries fail."""
|
||||
info = location_util.detect_location_info(_test_real=True)
|
||||
assert info is None
|
||||
|
||||
@patch('homeassistant.util.location.requests.get',
|
||||
side_effect=requests.RequestException)
|
||||
def test_freegeoip_query_raises(self, mock_get):
|
||||
"""Test ipapi.co query when the request to API fails."""
|
||||
info = location_util._get_ipapi()
|
||||
assert info is None
|
||||
async def test_detect_location_info_ipapi(aioclient_mock, session):
|
||||
"""Test detect location info using ipapi.co."""
|
||||
aioclient_mock.get(
|
||||
location_util.IPAPI, text=load_fixture('ipapi.co.json'))
|
||||
|
||||
@patch('homeassistant.util.location.requests.get',
|
||||
side_effect=requests.RequestException)
|
||||
def test_ip_api_query_raises(self, mock_get):
|
||||
"""Test ip api query when the request to API fails."""
|
||||
info = location_util._get_ip_api()
|
||||
assert info is None
|
||||
info = await location_util.async_detect_location_info(
|
||||
session, _test_real=True)
|
||||
|
||||
@patch('homeassistant.util.location.requests.get',
|
||||
side_effect=requests.RequestException)
|
||||
def test_elevation_query_raises(self, mock_get):
|
||||
"""Test elevation when the request to API fails."""
|
||||
elevation = location_util.elevation(10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
assert info is not None
|
||||
assert info.ip == '1.2.3.4'
|
||||
assert info.country_code == 'CH'
|
||||
assert info.country_name == 'Switzerland'
|
||||
assert info.region_code == 'BE'
|
||||
assert info.region_name == 'Bern'
|
||||
assert info.city == 'Bern'
|
||||
assert info.zip_code == '3000'
|
||||
assert info.time_zone == 'Europe/Zurich'
|
||||
assert info.latitude == 46.9480278
|
||||
assert info.longitude == 7.4490812
|
||||
assert info.use_metric
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_elevation_query_fails(self, mock_req):
|
||||
"""Test elevation when the request to API fails."""
|
||||
mock_req.get(location_util.ELEVATION_URL, text='{}', status_code=401)
|
||||
elevation = location_util.elevation(10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
|
||||
@requests_mock.Mocker()
|
||||
def test_elevation_query_nonjson(self, mock_req):
|
||||
"""Test if elevation API returns a non JSON value."""
|
||||
mock_req.get(location_util.ELEVATION_URL, text='{ I am not JSON }')
|
||||
elevation = location_util.elevation(10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
async def test_detect_location_info_ip_api(aioclient_mock, session):
|
||||
"""Test detect location info using ip-api.com."""
|
||||
aioclient_mock.get(
|
||||
location_util.IP_API, text=load_fixture('ip-api.com.json'))
|
||||
|
||||
with patch('homeassistant.util.location._get_ipapi',
|
||||
return_value=mock_coro(None)):
|
||||
info = await location_util.async_detect_location_info(
|
||||
session, _test_real=True)
|
||||
|
||||
assert info is not None
|
||||
assert info.ip == '1.2.3.4'
|
||||
assert info.country_code == 'US'
|
||||
assert info.country_name == 'United States'
|
||||
assert info.region_code == 'CA'
|
||||
assert info.region_name == 'California'
|
||||
assert info.city == 'San Diego'
|
||||
assert info.zip_code == '92122'
|
||||
assert info.time_zone == 'America/Los_Angeles'
|
||||
assert info.latitude == 32.8594
|
||||
assert info.longitude == -117.2073
|
||||
assert not info.use_metric
|
||||
|
||||
|
||||
async def test_detect_location_info_both_queries_fail(session):
|
||||
"""Ensure we return None if both queries fail."""
|
||||
with patch('homeassistant.util.location.async_get_elevation',
|
||||
return_value=mock_coro(0)), \
|
||||
patch('homeassistant.util.location._get_ipapi',
|
||||
return_value=mock_coro(None)), \
|
||||
patch('homeassistant.util.location._get_ip_api',
|
||||
return_value=mock_coro(None)):
|
||||
info = await location_util.async_detect_location_info(
|
||||
session, _test_real=True)
|
||||
assert info is None
|
||||
|
||||
|
||||
async def test_freegeoip_query_raises(raising_session):
|
||||
"""Test ipapi.co query when the request to API fails."""
|
||||
info = await location_util._get_ipapi(raising_session)
|
||||
assert info is None
|
||||
|
||||
|
||||
async def test_ip_api_query_raises(raising_session):
|
||||
"""Test ip api query when the request to API fails."""
|
||||
info = await location_util._get_ip_api(raising_session)
|
||||
assert info is None
|
||||
|
||||
|
||||
async def test_elevation_query_raises(raising_session):
|
||||
"""Test elevation when the request to API fails."""
|
||||
elevation = await location_util.async_get_elevation(
|
||||
raising_session, 10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
|
||||
|
||||
async def test_elevation_query_fails(aioclient_mock, session):
|
||||
"""Test elevation when the request to API fails."""
|
||||
aioclient_mock.get(location_util.ELEVATION_URL, text='{}', status=401)
|
||||
elevation = await location_util.async_get_elevation(
|
||||
session, 10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
|
||||
|
||||
async def test_elevation_query_nonjson(aioclient_mock, session):
|
||||
"""Test if elevation API returns a non JSON value."""
|
||||
aioclient_mock.get(location_util.ELEVATION_URL, text='{ I am not JSON }')
|
||||
elevation = await location_util.async_get_elevation(
|
||||
session, 10, 10, _test_real=True)
|
||||
assert elevation == 0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue