1import pytest
2
3from geopy.geocoders import MapBox
4from geopy.point import Point
5from test.geocoders.util import BaseTestGeocoder, env
6
7
8class TestMapBox(BaseTestGeocoder):
9    @classmethod
10    def make_geocoder(cls, **kwargs):
11        return MapBox(api_key=env['MAPBOX_KEY'], timeout=3, **kwargs)
12
13    async def test_geocode(self):
14        await self.geocode_run(
15            {"query": "435 north michigan ave, chicago il 60611 usa"},
16            {"latitude": 41.890, "longitude": -87.624},
17        )
18
19    async def test_unicode_name(self):
20        await self.geocode_run(
21            {"query": "\u6545\u5bab"},
22            {"latitude": 39.916, "longitude": 116.390},
23        )
24
25    async def test_reverse(self):
26        new_york_point = Point(40.75376406311989, -73.98489005863667)
27        location = await self.reverse_run(
28            {"query": new_york_point},
29            {"latitude": 40.7537640, "longitude": -73.98489, "delta": 1},
30        )
31        assert "New York" in location.address
32
33    async def test_zero_results(self):
34        await self.geocode_run(
35            {"query": 'asdfasdfasdf'},
36            {},
37            expect_failure=True,
38        )
39
40    async def test_geocode_outside_bbox(self):
41        await self.geocode_run(
42            {
43                "query": "435 north michigan ave, chicago il 60611 usa",
44                "bbox": [[34.172684, -118.604794],
45                         [34.236144, -118.500938]]
46            },
47            {},
48            expect_failure=True,
49        )
50
51    async def test_geocode_bbox(self):
52        await self.geocode_run(
53            {
54                "query": "435 north michigan ave, chicago il 60611 usa",
55                "bbox": [Point(35.227672, -103.271484),
56                         Point(48.603858, -74.399414)]
57            },
58            {"latitude": 41.890, "longitude": -87.624},
59        )
60
61    async def test_geocode_proximity(self):
62        await self.geocode_run(
63            {"query": "200 queen street", "proximity": Point(45.3, -66.1)},
64            {"latitude": 45.270208, "longitude": -66.050289, "delta": 0.1},
65        )
66
67    async def test_geocode_country_str(self):
68        await self.geocode_run(
69            {"query": "kazan", "country": "TR"},
70            {"latitude": 40.2317, "longitude": 32.6839},
71        )
72
73    async def test_geocode_country_list(self):
74        await self.geocode_run(
75            {"query": "kazan", "country": ["CN", "TR"]},
76            {"latitude": 40.2317, "longitude": 32.6839},
77        )
78
79    async def test_geocode_raw(self):
80        result = await self.geocode_run({"query": "New York"}, {})
81        delta = 1.0
82        expected = pytest.approx((-73.8784155, 40.6930727), abs=delta)
83        assert expected == result.raw['center']
84
85    async def test_geocode_exactly_one_false(self):
86        list_result = await self.geocode_run(
87            {"query": "maple street", "exactly_one": False},
88            {},
89        )
90        assert len(list_result) >= 3
91