159 lines
4.9 KiB
Python
159 lines
4.9 KiB
Python
#!/usr/local/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import unittest
|
|
import requests_mock
|
|
import re
|
|
from nose.tools import assert_raises
|
|
from urlparse import urlparse, parse_qs
|
|
from mock import Mock
|
|
|
|
from cartodb_services.mapzen import MapzenRouting, MapzenRoutingResponse
|
|
from cartodb_services.tools.exceptions import WrongParams
|
|
from cartodb_services.tools import Coordinate
|
|
|
|
requests_mock.Mocker.TEST_PREFIX = 'test_'
|
|
|
|
|
|
@requests_mock.Mocker()
|
|
class MapzenRoutingTestCase(unittest.TestCase):
|
|
|
|
GOOD_SHAPE_SIMPLE = [(38.5, -120.2), (43.2, -126.4)]
|
|
|
|
GOOD_RESPONSE_SIMPLE = """{{
|
|
"id": "ethervoid-route",
|
|
"trip": {{
|
|
"status": 0,
|
|
"status_message": "Found route between points",
|
|
"legs": [
|
|
{{
|
|
"shape": "_p~iF~ps|U_~t[~|yd@",
|
|
"summary": {{
|
|
"length": 444.59,
|
|
"time": 16969
|
|
}}
|
|
}}
|
|
],
|
|
"units": "kilometers",
|
|
"summary": {{
|
|
"length": 444.59,
|
|
"time": 16969
|
|
}},
|
|
"locations": [
|
|
{{
|
|
"lon": -120.2,
|
|
"lat": 38.5,
|
|
"type": "break"
|
|
}},
|
|
{{
|
|
"lon": -126.4,
|
|
"lat": 43.2,
|
|
"type": "break"
|
|
}}
|
|
]
|
|
}}
|
|
}}""".format(GOOD_SHAPE_SIMPLE)
|
|
|
|
GOOD_SHAPE_MULTI = [(40.4, -3.7), (40.1, -3.4), (40.6, -3.9)]
|
|
|
|
GOOD_RESPONSE_MULTI = """{{
|
|
"id": "ethervoid-route",
|
|
"trip": {{
|
|
"language":"en-US",
|
|
"summary":{{
|
|
"length": 1.261,
|
|
"time": 913
|
|
}},
|
|
"locations":[
|
|
{{
|
|
"side_of_street":"right",
|
|
"lon": -3.7,
|
|
"lat": 40.4,
|
|
"type":"break"
|
|
}},
|
|
{{
|
|
"lon": -3.4,
|
|
"lat": 40.1,
|
|
"type": "through"
|
|
}},
|
|
{{
|
|
"lon": -3.9,
|
|
"lat": 40.6,
|
|
"type": "break"
|
|
}}
|
|
],
|
|
"units":"kilometers",
|
|
"legs":[
|
|
{{
|
|
"shape": "_squF~sqU~qy@_ry@_t`B~s`B",
|
|
"summary": {{
|
|
"length":1.261,
|
|
"time":913
|
|
}}
|
|
}}
|
|
],
|
|
"status_message": "Found route between points",
|
|
"status": 0
|
|
}}
|
|
}}""".format(GOOD_SHAPE_MULTI)
|
|
|
|
MALFORMED_RESPONSE = """{"manolo": "escobar"}"""
|
|
|
|
def setUp(self):
|
|
logger = Mock()
|
|
self.routing = MapzenRouting('api_key', logger)
|
|
self.url = MapzenRouting.PRODUCTION_ROUTING_BASE_URL
|
|
|
|
def test_calculate_simple_routing_with_valid_params(self, req_mock):
|
|
req_mock.register_uri('GET', requests_mock.ANY,
|
|
text=self.GOOD_RESPONSE_SIMPLE)
|
|
origin = Coordinate('-120.2', '38.5')
|
|
destination = Coordinate('-126.4', '43.2')
|
|
waypoints = [origin, destination]
|
|
response = self.routing.calculate_route_point_to_point(waypoints,
|
|
'car')
|
|
|
|
self.assertEqual(response.shape, self.GOOD_SHAPE_SIMPLE)
|
|
self.assertEqual(response.length, 444.59)
|
|
self.assertEqual(response.duration, 16969)
|
|
|
|
def test_uknown_mode_raise_exception(self, req_mock):
|
|
req_mock.register_uri('GET', requests_mock.ANY,
|
|
text=self.GOOD_RESPONSE_SIMPLE)
|
|
origin = Coordinate('-120.2', '38.5')
|
|
destination = Coordinate('-126.4', '43.2')
|
|
waypoints = [origin, destination]
|
|
|
|
assert_raises(WrongParams,
|
|
self.routing.calculate_route_point_to_point,
|
|
waypoints, 'unknown')
|
|
|
|
def test_calculate_routing_waypoints_with_valid_params(self, req_mock):
|
|
req_mock.register_uri('GET', requests_mock.ANY,
|
|
text=self.GOOD_RESPONSE_MULTI)
|
|
origin = Coordinate('-3.7', '40.4')
|
|
pass_through = Coordinate('-3.4', '40.1')
|
|
destination = Coordinate('-3.9', '40.6')
|
|
waypoints = [origin, pass_through, destination]
|
|
|
|
response = self.routing.calculate_route_point_to_point(waypoints,
|
|
'walk')
|
|
|
|
self.assertEqual(response.length, 1.261)
|
|
self.assertEqual(response.duration, 913)
|
|
self.assertEqual(response.shape, self.GOOD_SHAPE_MULTI)
|
|
|
|
def test_nonstandard_url(self, req_mock):
|
|
url = 'http://serviceurl.com'
|
|
routing = MapzenRouting('api_key', Mock(), {'base_url': url})
|
|
req_mock.register_uri('GET', url, text=self.GOOD_RESPONSE_SIMPLE)
|
|
origin = Coordinate('-120.2', '38.5')
|
|
destination = Coordinate('-126.4', '43.2')
|
|
waypoints = [origin, destination]
|
|
response = routing.calculate_route_point_to_point(waypoints,
|
|
'car')
|
|
|
|
self.assertEqual(response.shape, self.GOOD_SHAPE_SIMPLE)
|
|
self.assertEqual(response.length, 444.59)
|
|
self.assertEqual(response.duration, 16969)
|