Completed
Push — master ( 691051...1cbe14 )
by Tobias
06:52
created

YandexTest::testGeocodeWithLocalhostIPv6()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Geocoder package.
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 *
10
 * @license    MIT License
11
 */
12
13
namespace Geocoder\Provider\Yandex\Tests;
14
15
use Geocoder\Collection;
16
use Geocoder\IntegrationTest\BaseTestCase;
17
use Geocoder\Location;
18
use Geocoder\Provider\Yandex\Model\YandexAddress;
19
use Geocoder\Query\GeocodeQuery;
20
use Geocoder\Query\ReverseQuery;
21
use Geocoder\Tests\TestCase;
22
use Geocoder\Provider\Yandex\Yandex;
23
24
/**
25
 * @author Antoine Corcy <[email protected]>
26
 */
27
class YandexTest extends BaseTestCase
28
{
29
    protected function getCacheDir()
30
    {
31
        return __DIR__.'/.cached_responses';
32
    }
33
34
    public function testGetName()
35
    {
36
        $provider = new Yandex($this->getMockedHttpClient());
37
        $this->assertEquals('yandex', $provider->getName());
38
    }
39
40
    /**
41
     * @expectedException \Geocoder\Exception\UnsupportedOperation
42
     * @expectedExceptionMessage The Yandex provider does not support IP addresses, only street addresses.
43
     */
44
    public function testGeocodeWithLocalhostIPv4()
45
    {
46
        $provider = new Yandex($this->getMockedHttpClient());
47
        $provider->geocodeQuery(GeocodeQuery::create('127.0.0.1'));
48
    }
49
50
    /**
51
     * @expectedException \Geocoder\Exception\UnsupportedOperation
52
     * @expectedExceptionMessage The Yandex provider does not support IP addresses, only street addresses.
53
     */
54
    public function testGeocodeWithLocalhostIPv6()
55
    {
56
        $provider = new Yandex($this->getMockedHttpClient());
57
        $provider->geocodeQuery(GeocodeQuery::create('::1'));
58
    }
59
60
    public function testGeocodeWithEmpty()
61
    {
62
        $provider = new Yandex($this->getMockedHttpClient('{"error":{"status":"400","message":"missing geocode parameter"}}'));
63
        $result = $provider->geocodeQuery(GeocodeQuery::create('xx'));
64
65
        $this->assertInstanceOf(Collection::class, $result);
66
        $this->assertEquals(0, $result->count());
67
    }
68
69
    public function testGeocodeWithFakeAddress()
70
    {
71
        $provider = new Yandex($this->getHttpClient());
72
        $result = $provider->geocodeQuery(GeocodeQuery::create('foobar'));
73
74
        $this->assertInstanceOf(Collection::class, $result);
75
        $this->assertEquals(0, $result->count());
76
    }
77
78
    public function testGeocodeWithRealAddress()
79
    {
80
        $provider = new Yandex($this->getHttpClient());
81
        $results = $provider->geocodeQuery(GeocodeQuery::create('10 avenue Gambetta, Paris, France'));
82
83
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
84
        $this->assertCount(1, $results);
85
86
        /** @var Location $result */
87
        $result = $results->first();
88
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
89
        $this->assertEquals(48.863277, $result->getCoordinates()->getLatitude(), '', 0.01);
90
        $this->assertEquals(2.389016, $result->getCoordinates()->getLongitude(), '', 0.01);
91
        $this->assertNotNull($result->getBounds());
92
        $this->assertEquals(48.861926, $result->getBounds()->getSouth(), '', 0.01);
93
        $this->assertEquals(2.386967, $result->getBounds()->getWest(), '', 0.01);
94
        $this->assertEquals(48.864629, $result->getBounds()->getNorth(), '', 0.01);
95
        $this->assertEquals(2.391064, $result->getBounds()->getEast(), '', 0.01);
96
        $this->assertEquals(10, $result->getStreetNumber());
97
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
98
        $this->assertEquals('Париж', $result->getLocality());
99
        $this->assertEquals('XX округ', $result->getSubLocality());
100
        $this->assertCount(2, $result->getAdminLevels());
101
        $this->assertEquals('Париж', $result->getAdminLevels()->get(2)->getName());
102
        $this->assertEquals('Иль-Де-Франс', $result->getAdminLevels()->get(1)->getName());
103
        $this->assertEquals('Франция', $result->getCountry()->getName());
104
        $this->assertEquals('FR', $result->getCountry()->getCode());
105
106
        // not provided
107
        $this->assertNull($result->getPostalCode());
108
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
109
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
110
        $this->assertNull($result->getTimezone());
111
    }
112
113
    public function testGeocodeWithRealAddressWithUALocale()
114
    {
115
        $provider = new Yandex($this->getHttpClient());
116
        $results = $provider->geocodeQuery(GeocodeQuery::create('Copenhagen, Denmark')->withLocale('uk-UA'));
117
118
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
119
        $this->assertCount(5, $results);
120
121
        /** @var Location $result */
122
        $result = $results->first();
123
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
124
        $this->assertEquals(55.675676, $result->getCoordinates()->getLatitude(), '', 0.01);
125
        $this->assertEquals(12.567593, $result->getCoordinates()->getLongitude(), '', 0.01);
126
        $this->assertNotNull($result->getBounds());
127
        $this->assertEquals(55.614999, $result->getBounds()->getSouth(), '', 0.01);
128
        $this->assertEquals(12.45295, $result->getBounds()->getWest(), '', 0.01);
129
        $this->assertEquals(55.73259, $result->getBounds()->getNorth(), '', 0.01);
130
        $this->assertEquals(12.65075, $result->getBounds()->getEast(), '', 0.01);
131
        $this->assertNull($result->getStreetNumber());
132
        $this->assertNull($result->getStreetName());
133
        $this->assertEquals('Копенгаген', $result->getLocality());
134
        $this->assertCount(2, $result->getAdminLevels());
135
        $this->assertEquals('Столичная область', $result->getAdminLevels()->get(1)->getName());
136
        $this->assertEquals('Данія', $result->getCountry()->getName());
137
        $this->assertEquals('DK', $result->getCountry()->getCode());
138
139
        // not provided
140
        $this->assertNull($result->getPostalCode());
141
        $this->assertNull($result->getSubLocality());
142
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
143
        $this->assertNull($result->getTimezone());
144
145
        /** @var Location $result */
146
        $result = $results->get(1);
147
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
148
        $this->assertEquals(55.455739, $result->getCoordinates()->getLatitude(), '', 0.01);
149
        $this->assertEquals(9.972854, $result->getCoordinates()->getLongitude(), '', 0.01);
150
151
        /** @var Location $result */
152
        $result = $results->get(2);
153
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
154
        $this->assertEquals(55.713258, $result->getCoordinates()->getLatitude(), '', 0.01);
155
        $this->assertEquals(12.534930, $result->getCoordinates()->getLongitude(), '', 0.01);
156
157
        /** @var Location $result */
158
        $result = $results->get(3);
159
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
160
        $this->assertEquals(55.698878, $result->getCoordinates()->getLatitude(), '', 0.01);
161
        $this->assertEquals(12.578211, $result->getCoordinates()->getLongitude(), '', 0.01);
162
163
        /** @var Location $result */
164
        $result = $results->get(4);
165
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
166
        $this->assertEquals(55.690380, $result->getCoordinates()->getLatitude(), '', 0.01);
167
        $this->assertEquals(12.554827, $result->getCoordinates()->getLongitude(), '', 0.01);
168
    }
169
170
    public function testGeocodeWithRealAddressWithUSLocale()
171
    {
172
        $provider = new Yandex($this->getHttpClient());
173
        $results = $provider->geocodeQuery(GeocodeQuery::create('1600 Pennsylvania Ave, Washington')->withLocale('en-US'));
174
175
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
176
        $this->assertCount(5, $results);
177
178
        /** @var Location $result */
179
        $result = $results->first();
180
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
181
        $this->assertEquals(38.897695, $result->getCoordinates()->getLatitude(), '', 0.01);
182
        $this->assertEquals(-77.038692, $result->getCoordinates()->getLongitude(), '', 0.01);
183
        $this->assertNotNull($result->getBounds());
184
        $this->assertEquals(38.891265, $result->getBounds()->getSouth(), '', 0.01);
185
        $this->assertEquals(-77.046921, $result->getBounds()->getWest(), '', 0.01);
186
        $this->assertEquals(38.904125, $result->getBounds()->getNorth(), '', 0.01);
187
        $this->assertEquals(-77.030464, $result->getBounds()->getEast(), '', 0.01);
188
        $this->assertEquals(1600, $result->getStreetNumber());
189
        $this->assertEquals('Pennsylvania Ave NW', $result->getStreetName());
190
        $this->assertEquals('Washington', $result->getLocality());
191
        $this->assertCount(2, $result->getAdminLevels());
192
        $this->assertEquals('District of Columbia', $result->getAdminLevels()->get(2)->getName());
193
        $this->assertEquals('District of Columbia', $result->getAdminLevels()->get(1)->getName());
194
        $this->assertEquals('United States', $result->getCountry()->getName());
195
        $this->assertEquals('US', $result->getCountry()->getCode());
196
197
        // not provided
198
        $this->assertNull($result->getPostalCode());
199
        $this->assertNull($result->getSubLocality());
200
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
201
        $this->assertNull($result->getTimezone());
202
    }
203
204
    public function testGeocodeWithRealAddressWithBYLocale()
205
    {
206
        $provider = new Yandex($this->getHttpClient());
207
        $results = $provider->geocodeQuery(GeocodeQuery::create('ул.Ленина, 19, Минск 220030, Республика Беларусь')->withLocale('be-BY'));
208
209
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
210
        $this->assertCount(1, $results);
211
212
        /** @var Location $result */
213
        $result = $results->first();
214
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
215
        $this->assertEquals(53.898077, $result->getCoordinates()->getLatitude(), '', 0.01);
216
        $this->assertEquals(27.563673, $result->getCoordinates()->getLongitude(), '', 0.01);
217
        $this->assertNotNull($result->getBounds());
218
        $this->assertEquals(53.896867, $result->getBounds()->getSouth(), '', 0.01);
219
        $this->assertEquals(27.561624, $result->getBounds()->getWest(), '', 0.01);
220
        $this->assertEquals(53.899286, $result->getBounds()->getNorth(), '', 0.01);
221
        $this->assertEquals(27.565721, $result->getBounds()->getEast(), '', 0.01);
222
        $this->assertEquals(19, $result->getStreetNumber());
223
        $this->assertEquals('улица Ленина', $result->getStreetName());
224
        $this->assertEquals('Минск', $result->getLocality());
225
        $this->assertCount(1, $result->getAdminLevels());
226
        $this->assertEquals('Минск', $result->getAdminLevels()->get(1)->getName());
227
        $this->assertEquals('Беларусь', $result->getCountry()->getName());
228
        $this->assertEquals('BY', $result->getCountry()->getCode());
229
230
        // not provided
231
        $this->assertNull($result->getPostalCode());
232
        $this->assertNull($result->getSubLocality());
233
        $this->assertNull($result->getTimezone());
234
    }
235
236
    public function testReverseWithRealCoordinates()
237
    {
238
        $provider = new Yandex($this->getHttpClient());
239
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(48.863216489553, 2.388771995902061));
240
241
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
242
        $this->assertCount(5, $results);
243
244
        /** @var Location $result */
245
        $result = $results->first();
246
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
247
        $this->assertEquals(48.863212, $result->getCoordinates()->getLatitude(), '', 0.01);
248
        $this->assertEquals(2.388773, $result->getCoordinates()->getLongitude(), '', 0.01);
249
        $this->assertNotNull($result->getBounds());
250
        $this->assertEquals(48.86294, $result->getBounds()->getSouth(), '', 0.01);
251
        $this->assertEquals(2.387497, $result->getBounds()->getWest(), '', 0.01);
252
        $this->assertEquals(48.877038, $result->getBounds()->getNorth(), '', 0.01);
253
        $this->assertEquals(2.406587, $result->getBounds()->getEast(), '', 0.01);
254
        $this->assertNull($result->getStreetNumber());
255
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
256
        $this->assertEquals('Париж', $result->getLocality());
257
        $this->assertEquals('XX округ', $result->getSubLocality());
258
        $this->assertCount(2, $result->getAdminLevels());
259
        $this->assertEquals('Париж', $result->getAdminLevels()->get(2)->getName());
260
        $this->assertEquals('Иль-Де-Франс', $result->getAdminLevels()->get(1)->getName());
261
        $this->assertEquals('Франция', $result->getCountry()->getName());
262
        $this->assertEquals('FR', $result->getCountry()->getCode());
263
264
        // not provided
265
        $this->assertNull($result->getPostalCode());
266
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
267
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
268
        $this->assertNull($result->getTimezone());
269
270
        /** @var Location $result */
271
        $result = $results->get(1);
272
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
273
        $this->assertEquals(48.864848, $result->getCoordinates()->getLatitude(), '', 0.01);
274
        $this->assertEquals(2.3993549, $result->getCoordinates()->getLongitude(), '', 0.01);
275
276
        /** @var Location $result */
277
        $result = $results->get(2);
278
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
279
        $this->assertEquals(48.856929, $result->getCoordinates()->getLatitude(), '', 0.01);
280
        $this->assertEquals(2.341197, $result->getCoordinates()->getLongitude(), '', 0.01);
281
    }
282
283
    public function testReverseWithRealCoordinatesWithUSLocaleAndStreeToponym()
284
    {
285
        $provider = new Yandex($this->getHttpClient(), 'street');
286
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(48.863216489553, 2.388771995902061)->withLocale('en-US'));
287
288
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
289
        $this->assertCount(5, $results);
290
291
        /** @var Location $result */
292
        $result = $results->first();
293
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
294
        $this->assertEquals(48.87132, $result->getCoordinates()->getLatitude(), '', 0.01);
295
        $this->assertEquals(2.404017, $result->getCoordinates()->getLongitude(), '', 0.01);
296
        $this->assertNotNull($result->getBounds());
297
        $this->assertEquals(48.86294, $result->getBounds()->getSouth(), '', 0.01);
298
        $this->assertEquals(2.387497, $result->getBounds()->getWest(), '', 0.01);
299
        $this->assertEquals(48.877038, $result->getBounds()->getNorth(), '', 0.01);
300
        $this->assertEquals(2.406587, $result->getBounds()->getEast(), '', 0.01);
301
        $this->assertNull($result->getStreetNumber());
302
        $this->assertEquals('Avenue Gambetta', $result->getStreetName());
303
        $this->assertEquals('20e Arrondissement', $result->getSubLocality());
304
        $this->assertEquals('Paris', $result->getLocality());
305
        $this->assertCount(2, $result->getAdminLevels());
306
        $this->assertEquals('Paris', $result->getAdminLevels()->get(2)->getName());
307
        $this->assertEquals('Ile-de-France', $result->getAdminLevels()->get(1)->getName());
308
        $this->assertEquals('France', $result->getCountry()->getName());
309
        $this->assertEquals('FR', $result->getCountry()->getCode());
310
311
        // not provided
312
        $this->assertNull($result->getPostalCode());
313
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
314
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
315
        $this->assertNull($result->getTimezone());
316
317
        /** @var Location $result */
318
        $result = $results->get(1);
319
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
320
        $this->assertEquals(48.863230, $result->getCoordinates()->getLatitude(), '', 0.01);
321
        $this->assertEquals(2.388261, $result->getCoordinates()->getLongitude(), '', 0.01);
322
323
        /** @var Location $result */
324
        $result = $results->get(2);
325
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
326
        $this->assertEquals(48.866022, $result->getCoordinates()->getLatitude(), '', 0.01);
327
        $this->assertEquals(2.389662, $result->getCoordinates()->getLongitude(), '', 0.01);
328
329
        /** @var Location $result */
330
        $result = $results->get(3);
331
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
332
        $this->assertEquals(48.863918, $result->getCoordinates()->getLatitude(), '', 0.01);
333
        $this->assertEquals(2.387767, $result->getCoordinates()->getLongitude(), '', 0.01);
334
335
        /** @var Location $result */
336
        $result = $results->get(4);
337
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
338
        $this->assertEquals(48.863787, $result->getCoordinates()->getLatitude(), '', 0.01);
339
        $this->assertEquals(2.389600, $result->getCoordinates()->getLongitude(), '', 0.01);
340
    }
341
342
    public function testReverseWithRealCoordinatesWithUALocaleAndHouseToponym()
343
    {
344
        $provider = new Yandex($this->getHttpClient(), 'house');
345
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(60.4539471768582, 22.2567842183875)->withLocale('uk-UA'));
346
347
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
348
        $this->assertCount(5, $results);
349
350
        /** @var Location $result */
351
        $result = $results->first();
352
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
353
        $this->assertEquals(60.454462, $result->getCoordinates()->getLatitude(), '', 0.01);
354
        $this->assertEquals(22.256561, $result->getCoordinates()->getLongitude(), '', 0.01);
355
        $this->assertNotNull($result->getBounds());
356
        $this->assertEquals(60.45345, $result->getBounds()->getSouth(), '', 0.01);
357
        $this->assertEquals(22.254513, $result->getBounds()->getWest(), '', 0.01);
358
        $this->assertEquals(60.455474, $result->getBounds()->getNorth(), '', 0.01);
359
        $this->assertEquals(22.258609, $result->getBounds()->getEast(), '', 0.01);
360
        $this->assertEquals(36, $result->getStreetNumber());
361
        $this->assertEquals('Bangårdsgatan', $result->getStreetName());
362
        $this->assertEquals('Турку', $result->getLocality());
363
        $this->assertEquals('Кескуста', $result->getSubLocality());
364
        $this->assertCount(2, $result->getAdminLevels());
365
        $this->assertEquals('Исконная Финляндия', $result->getAdminLevels()->get(2)->getName());
366
        $this->assertEquals('Юго-Западная Финляндия', $result->getAdminLevels()->get(1)->getName());
367
        $this->assertEquals('Фінляндія', $result->getCountry()->getName());
368
        $this->assertEquals('FI', $result->getCountry()->getCode());
369
370
        // not provided
371
        $this->assertNull($result->getPostalCode());
372
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
373
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
374
        $this->assertNull($result->getTimezone());
375
    }
376
377
    public function testReverseWithRealCoordinatesWithTRLocaleAndLocalityToponym()
378
    {
379
        $provider = new Yandex($this->getHttpClient(), 'locality');
380
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(40.900640, 29.198184)->withLocale('tr-TR'));
381
382
        $this->assertInstanceOf('Geocoder\Model\AddressCollection', $results);
383
        $this->assertCount(5, $results);
384
385
        /** @var Location $result */
386
        $result = $results->first();
387
        $this->assertInstanceOf('Geocoder\Model\Address', $result);
388
        $this->assertEquals(40.874651, $result->getCoordinates()->getLatitude(), '', 0.01);
389
        $this->assertEquals(29.129562, $result->getCoordinates()->getLongitude(), '', 0.01);
390
        $this->assertNotNull($result->getBounds());
391
        $this->assertEquals(40.860413, $result->getBounds()->getSouth(), '', 0.01);
392
        $this->assertEquals(29.107230, $result->getBounds()->getWest(), '', 0.01);
393
        $this->assertEquals(40.876111, $result->getBounds()->getNorth(), '', 0.01);
394
        $this->assertEquals(29.139021, $result->getBounds()->getEast(), '', 0.01);
395
        $this->assertNull($result->getStreetName());
396
        $this->assertNull($result->getStreetNumber());
397
        $this->assertEquals('Büyükada', $result->getLocality());
398
        $this->assertCount(2, $result->getAdminLevels());
399
        $this->assertEquals('Adalar', $result->getAdminLevels()->get(2)->getName());
400
        $this->assertEquals('İstanbul', $result->getAdminLevels()->get(1)->getName());
401
        $this->assertEquals('Türkiye', $result->getCountry()->getName());
402
        $this->assertEquals('TR', $result->getCountry()->getCode());
403
404
        // not provided
405
        $this->assertNull($result->getPostalCode());
406
        $this->assertNull($result->getSubLocality());
407
        $this->assertNull($result->getAdminLevels()->get(2)->getCode());
408
        $this->assertNull($result->getAdminLevels()->get(1)->getCode());
409
        $this->assertNull($result->getTimezone());
410
    }
411
412
    public function testReverseMetroStationToGetName()
413
    {
414
        $provider = new Yandex($this->getHttpClient(), 'metro');
415
        $results = $provider->reverseQuery(ReverseQuery::fromCoordinates(60.036843, 30.324285));
416
417
        /** @var YandexAddress $first */
418
        $first = $results->first();
419
        $this->assertEquals('метро Озерки', $first->getName());
420
    }
421
}
422