Merge development
This commit is contained in:
@@ -9,3 +9,8 @@ def mapbox_api_key():
|
||||
def tomtom_api_key():
|
||||
"""Returns TomTom API key. Requires setting TOMTOM_API_KEY environment variable."""
|
||||
return os.environ['TOMTOM_API_KEY']
|
||||
|
||||
|
||||
def geocodio_api_key():
|
||||
"""Returns Geocodio API key. Requires setting GEOCODIO_API_KEY environment variable."""
|
||||
return os.environ['GEOCODIO_API_KEY']
|
||||
|
||||
@@ -7,7 +7,7 @@ from cartodb_services.metrics.config import *
|
||||
|
||||
class TestGeocoderUserConfig(TestCase):
|
||||
|
||||
GEOCODER_PROVIDERS = ['heremaps', 'mapzen', 'mapbox', 'tomtom', 'google']
|
||||
GEOCODER_PROVIDERS = ['heremaps', 'mapzen', 'mapbox', 'tomtom', 'geocodio', 'google']
|
||||
|
||||
def setUp(self):
|
||||
self.redis_conn = MockRedis()
|
||||
@@ -31,6 +31,9 @@ class TestGeocoderUserConfig(TestCase):
|
||||
elif geocoder_provider == 'tomtom':
|
||||
assert geocoder_config.tomtom_geocoder is True
|
||||
assert geocoder_config.geocoding_quota == 100
|
||||
elif geocoder_provider == 'geocodio':
|
||||
assert geocoder_config.geocodio_geocoder is True
|
||||
assert geocoder_config.geocoding_quota == 100
|
||||
elif geocoder_provider == 'google':
|
||||
assert geocoder_config.google_geocoder is True
|
||||
assert geocoder_config.geocoding_quota is None
|
||||
@@ -84,7 +87,7 @@ class TestGeocoderUserConfig(TestCase):
|
||||
|
||||
class TestGeocoderOrgConfig(TestCase):
|
||||
|
||||
GEOCODER_PROVIDERS = ['heremaps', 'mapzen', 'mapbox', 'tomtom', 'google']
|
||||
GEOCODER_PROVIDERS = ['heremaps', 'mapzen', 'mapbox', 'tomtom', 'geocodio', 'google']
|
||||
|
||||
def setUp(self):
|
||||
self.redis_conn = MockRedis()
|
||||
@@ -113,6 +116,9 @@ class TestGeocoderOrgConfig(TestCase):
|
||||
elif geocoder_provider == 'tomtom':
|
||||
assert geocoder_config.tomtom_geocoder is True
|
||||
assert geocoder_config.geocoding_quota == 200
|
||||
elif geocoder_provider == 'geocodio':
|
||||
assert geocoder_config.geocodio_geocoder is True
|
||||
assert geocoder_config.geocoding_quota == 200
|
||||
elif geocoder_provider == 'google':
|
||||
assert geocoder_config.google_geocoder is True
|
||||
assert geocoder_config.geocoding_quota is None
|
||||
|
||||
268
server/lib/python/cartodb_services/test/test_geocodiogeocoder.py
Normal file
268
server/lib/python/cartodb_services/test/test_geocodiogeocoder.py
Normal file
@@ -0,0 +1,268 @@
|
||||
import unittest
|
||||
from mock import Mock
|
||||
from cartodb_services.geocodio import GeocodioGeocoder
|
||||
from cartodb_services.geocodio import GeocodioBulkGeocoder
|
||||
from cartodb_services.tools.exceptions import ServiceException
|
||||
from credentials import geocodio_api_key
|
||||
|
||||
INVALID_TOKEN = 'invalid_token'
|
||||
|
||||
VALID_ADDRESS_1 = 'Lexington Ave; New York; US'
|
||||
VALID_ADDRESS_2 = 'E 14th St; New York; US'
|
||||
VALID_ADDRESS_3 = '652 Lombard Street; San Francisco; California; United States'
|
||||
|
||||
VALID_SEARCH_TEXT_1='Lexington Ave'
|
||||
VALID_CITY_1='New York'
|
||||
VALID_STATE_PROVINCE_1='New York'
|
||||
VALID_COUNTRY_1='US'
|
||||
|
||||
VALID_SEARCH_TEXT_2='E 14th St'
|
||||
VALID_CITY_2='New York'
|
||||
VALID_STATE_PROVINCE_2='New York'
|
||||
VALID_COUNTRY_2='US'
|
||||
|
||||
VALID_SEARCH_TEXT_3='652 Lombard Street'
|
||||
VALID_CITY_3='San Francisco'
|
||||
VALID_STATE_PROVINCE_3='California'
|
||||
VALID_COUNTRY_3='United States'
|
||||
|
||||
WELL_KNOWN_LONGITUDE_1 = -73.960
|
||||
WELL_KNOWN_LATITUDE_1 = 40.774
|
||||
WELL_KNOWN_LONGITUDE_2 = -73.983
|
||||
WELL_KNOWN_LATITUDE_2 = 40.731
|
||||
WELL_KNOWN_LONGITUDE_3 = -122.412
|
||||
WELL_KNOWN_LATITUDE_3 = 37.803207
|
||||
|
||||
SEARCH_ID_1 = 1
|
||||
SEARCH_ID_2 = 2
|
||||
|
||||
|
||||
class GeocodioGeocoderTestCase(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.geocoder = GeocodioGeocoder(token=geocodio_api_key(), logger=Mock())
|
||||
self.bulk_geocoder = GeocodioBulkGeocoder(token=geocodio_api_key(), logger=Mock())
|
||||
|
||||
### NON BULK
|
||||
|
||||
def test_invalid_token(self):
|
||||
invalid_geocoder = GeocodioGeocoder(token=INVALID_TOKEN, logger=Mock())
|
||||
with self.assertRaises(ServiceException):
|
||||
invalid_geocoder.geocode(VALID_ADDRESS_1)
|
||||
|
||||
def test_valid_requests(self):
|
||||
place = self.geocoder.geocode(VALID_ADDRESS_1)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_1)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_1)
|
||||
|
||||
place = self.geocoder.geocode(VALID_ADDRESS_2)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_2)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_2)
|
||||
|
||||
place = self.geocoder.geocode(VALID_ADDRESS_3)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_3)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_3)
|
||||
|
||||
def test_valid_request_components(self):
|
||||
place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_1,
|
||||
city=VALID_CITY_1,
|
||||
state_province=VALID_STATE_PROVINCE_1,
|
||||
country=VALID_COUNTRY_1)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_1)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_1)
|
||||
|
||||
place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_2,
|
||||
city=VALID_CITY_2,
|
||||
state_province=VALID_STATE_PROVINCE_2,
|
||||
country=VALID_COUNTRY_2)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_2)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_2)
|
||||
|
||||
place = self.geocoder.geocode(searchtext=VALID_SEARCH_TEXT_3,
|
||||
city=VALID_CITY_3,
|
||||
state_province=VALID_STATE_PROVINCE_3,
|
||||
country=VALID_COUNTRY_3)
|
||||
|
||||
self.assertEqual('%.3f' % place[0], '%.3f' % WELL_KNOWN_LONGITUDE_3)
|
||||
self.assertEqual('%.3f' % place[1], '%.3f' % WELL_KNOWN_LATITUDE_3)
|
||||
|
||||
def test_valid_request_namedplace(self):
|
||||
place = self.geocoder.geocode(searchtext='New York')
|
||||
|
||||
assert place
|
||||
|
||||
def test_valid_request_namedplace2(self):
|
||||
place = self.geocoder.geocode(searchtext='New York', country='us')
|
||||
|
||||
assert place
|
||||
|
||||
def test_odd_characters(self):
|
||||
place = self.geocoder.geocode(searchtext='New York; "USA"')
|
||||
|
||||
assert place
|
||||
|
||||
def test_empty_request(self):
|
||||
place = self.geocoder.geocode(searchtext='', country=None, city=None, state_province=None)
|
||||
|
||||
assert place == []
|
||||
|
||||
def test_empty_search_text_request(self):
|
||||
place = self.geocoder.geocode(searchtext=' ', country='us', city=None, state_province="")
|
||||
|
||||
assert place == []
|
||||
|
||||
def test_unknown_place_request(self):
|
||||
place = self.geocoder.geocode(searchtext='[unknown]', country='ch', state_province=None, city=None)
|
||||
|
||||
assert place == []
|
||||
|
||||
### BULK ONE
|
||||
|
||||
def test_invalid_token_bulk_one(self):
|
||||
invalid_geocoder = GeocodioBulkGeocoder(token=INVALID_TOKEN, logger=Mock())
|
||||
with self.assertRaises(ServiceException):
|
||||
invalid_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_1, None, None, None)])
|
||||
|
||||
def test_valid_request_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_1, None, None, None)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_1)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_1)
|
||||
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_2, None, None, None)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_2)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_2)
|
||||
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_3, None, None, None)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_3)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_3)
|
||||
|
||||
def test_valid_request_components_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_1, VALID_CITY_1, VALID_STATE_PROVINCE_1, VALID_COUNTRY_1)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_1)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_1)
|
||||
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_2, VALID_CITY_2, VALID_STATE_PROVINCE_2, VALID_COUNTRY_2)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_2)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_2)
|
||||
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_3, VALID_CITY_3, VALID_STATE_PROVINCE_3, VALID_COUNTRY_3)])
|
||||
|
||||
self.assertEqual(place[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % place[0][1], '%.3f' % WELL_KNOWN_LONGITUDE_3)
|
||||
self.assertEqual('%.3f' % place[0][2], '%.3f' % WELL_KNOWN_LATITUDE_3)
|
||||
|
||||
def test_valid_request_namedplace_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York', None, None, None)])
|
||||
|
||||
assert place
|
||||
|
||||
def test_valid_request_namedplace2_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York', 'us', None, None)])
|
||||
|
||||
assert place
|
||||
|
||||
def test_odd_characters_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York; "USA"', None, None, None)])
|
||||
|
||||
assert place
|
||||
|
||||
def test_empty_request_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, '', None, None, None)])
|
||||
|
||||
assert place == [(SEARCH_ID_1, None, None)]
|
||||
|
||||
def test_empty_search_text_request_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, ' ', 'us', None, "")])
|
||||
|
||||
assert place == [(SEARCH_ID_1, None, None)]
|
||||
|
||||
def test_unknown_place_request_bulk_one(self):
|
||||
place = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, '[unknown]', 'ch', None, None)])
|
||||
|
||||
assert place == [(SEARCH_ID_1, None, None)]
|
||||
|
||||
### BULK MANY
|
||||
|
||||
def test_invalid_token_bulk_many(self):
|
||||
invalid_geocoder = GeocodioBulkGeocoder(token=INVALID_TOKEN, logger=Mock())
|
||||
with self.assertRaises(ServiceException):
|
||||
invalid_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_1, None, None, None),
|
||||
(SEARCH_ID_2, VALID_ADDRESS_2, None, None, None)])
|
||||
|
||||
def test_valid_request_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_ADDRESS_1, None, None, None),
|
||||
(SEARCH_ID_2, VALID_ADDRESS_2, None, None, None)])
|
||||
|
||||
self.assertEqual(places[0][0], SEARCH_ID_1)
|
||||
self.assertEqual('%.3f' % places[0][1][0], '%.3f' % WELL_KNOWN_LONGITUDE_1)
|
||||
self.assertEqual('%.3f' % places[0][1][1], '%.3f' % WELL_KNOWN_LATITUDE_1)
|
||||
|
||||
self.assertEqual(places[1][0], SEARCH_ID_2)
|
||||
self.assertEqual('%.3f' % places[1][1][0], '%.3f' % WELL_KNOWN_LONGITUDE_2)
|
||||
self.assertEqual('%.3f' % places[1][1][1], '%.3f' % WELL_KNOWN_LATITUDE_2)
|
||||
|
||||
def test_valid_request_components_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, VALID_SEARCH_TEXT_1, VALID_CITY_1, VALID_STATE_PROVINCE_1, VALID_COUNTRY_1),
|
||||
(SEARCH_ID_2, VALID_SEARCH_TEXT_2, VALID_CITY_2, VALID_STATE_PROVINCE_2, VALID_COUNTRY_2)])
|
||||
|
||||
self.assertEqual(places[0][0], SEARCH_ID_1)
|
||||
self.assertEqual(places[1][0], SEARCH_ID_2)
|
||||
|
||||
def test_valid_request_namedplace_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York', None, None, None),
|
||||
(SEARCH_ID_2, 'Los Angeles', None, None, None)])
|
||||
|
||||
assert places
|
||||
|
||||
self.assertEqual(places[0][0], SEARCH_ID_1)
|
||||
self.assertEqual(places[1][0], SEARCH_ID_2)
|
||||
|
||||
def test_valid_request_namedplace2_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York', 'us', None, None),
|
||||
(SEARCH_ID_2, 'Los Angeles', None, None, None)])
|
||||
|
||||
assert places
|
||||
|
||||
self.assertEqual(places[0][0], SEARCH_ID_1)
|
||||
self.assertEqual(places[1][0], SEARCH_ID_2)
|
||||
|
||||
def test_odd_characters_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, 'New York; "USA"', None, None, None),
|
||||
(SEARCH_ID_2, 'Los Angeles', None, None, None)])
|
||||
|
||||
assert places
|
||||
|
||||
self.assertEqual(places[0][0], SEARCH_ID_1)
|
||||
self.assertEqual(places[1][0], SEARCH_ID_2)
|
||||
|
||||
def test_empty_request_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, '', None, None, None),
|
||||
(SEARCH_ID_2, '', None, None, None)])
|
||||
|
||||
assert places == [(SEARCH_ID_1, [], {}), (SEARCH_ID_2, [], {})]
|
||||
|
||||
def test_empty_search_text_request_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, ' ', 'us', None, ""),
|
||||
(SEARCH_ID_2, ' ', 'us', None, "")])
|
||||
|
||||
assert places == [(SEARCH_ID_1, [], {}), (SEARCH_ID_2, [], {})]
|
||||
|
||||
def test_unknown_place_request_bulk_many(self):
|
||||
places = self.bulk_geocoder._batch_geocode([(SEARCH_ID_1, '[unknown]', 'ch', None, None),
|
||||
(SEARCH_ID_2, '[unknown]', 'ch', None, None)])
|
||||
|
||||
assert places == [(SEARCH_ID_1, [], {}), (SEARCH_ID_2, [], {})]
|
||||
@@ -79,6 +79,7 @@ def plpy_mock_config():
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('mapbox_conf'\)", [{'conf': '{"routing": {"api_keys": ["api_key_rou"], "monthly_quota": 1500000}, "geocoder": {"api_keys": ["api_key_geo"], "monthly_quota": 1500000}, "matrix": {"api_keys": ["api_key_mat"], "monthly_quota": 1500000}}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('mapbox_iso_conf'\)", [{'conf': '{"isolines": {"api_keys": ["api_key_mat"], "monthly_quota": 1500000}}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('tomtom_conf'\)", [{'conf': '{"routing": {"api_keys": ["api_key_rou"], "monthly_quota": 1500000}, "geocoder": {"api_keys": ["api_key_geo"], "monthly_quota": 1500000}, "isolines": {"api_keys": ["api_key_mat"], "monthly_quota": 1500000}}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('geocodio_conf'\)", [{'conf': '{"geocoder": {"api_keys": ["api_key_geo"], "monthly_quota": 1500000}}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('logger_conf'\)", [{'conf': '{"geocoder_log_path": "/dev/null"}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('data_observatory_conf'\)", [{'conf': '{"connection": {"whitelist": ["ethervoid"], "production": "host=localhost port=5432 dbname=dataservices_db user=geocoder_api", "staging": "host=localhost port=5432 dbname=dataservices_db user=geocoder_api"}}'}])
|
||||
plpy_mock._define_result("CDB_Conf_GetConf\('server_conf'\)", [{'conf': '{"environment": "testing"}'}])
|
||||
|
||||
Reference in New Issue
Block a user