dataservices-api/server/lib/python/cartodb_services/test/test_mapzenrouting.py
2017-03-06 15:25:11 +01:00

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.mapzen.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)