Completed
Push — NominatimGeocoder ( c3ddd5 )
by Jeroen De
09:41
created

testWhenFetcherThrowsException_nullIsReturned()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 5
rs 9.4285
cc 1
eloc 3
nc 1
nop 0
1
<?php
2
3
namespace Maps\Test;
4
5
use FileFetcher\InMemoryFileFetcher;
6
use Maps\Geocoders\NominatimGeocoder;
7
8
/**
9
 * @covers Maps\Geocoders\NominatimGeocoder
10
 *
11
 * @licence GNU GPL v2+
12
 * @author Peter Grassberger < [email protected] >
13
 * @author Jeroen De Dauw < [email protected] >
14
 */
15
class NominatimGeocoderTest extends \PHPUnit_Framework_TestCase {
16
17
	const NEW_YORK_FETCH_URL = 'https://nominatim.openstreetmap.org/search?format=jsonv2&limit=1&q=New+York';
18
19
	public function testHappyPath() {
20
		$fileFetcher = new InMemoryFileFetcher( [
21
			self::NEW_YORK_FETCH_URL
22
				=> '[{"place_id":"97961780","licence":"Data © OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"way","osm_id":"161387758","boundingbox":["40.763858","40.7642664","-73.9548572","-73.954092"],"lat":"40.7642499","lon":"-73.9545249","display_name":"NewYork Hospital Drive, Upper East Side, Manhattan, New York County, New York City, New York, 10021, United States of America","place_rank":"27","category":"highway","type":"service","importance":0.275}]'
23
		] );
24
25
		$geocoder = new NominatimGeocoder( $fileFetcher );
26
27
		$this->assertSame( 40.7642499, $geocoder->geocode( 'New York' )->getLatitude() );
28
		$this->assertSame( -73.9545249, $geocoder->geocode( 'New York' )->getLongitude() );
29
	}
30
31
	public function testWhenFetcherThrowsException_nullIsReturned() {
32
		$geocoder = new NominatimGeocoder( new InMemoryFileFetcher( [] ) );
33
34
		$this->assertNull( $geocoder->geocode( 'New York' ) );
35
	}
36
37
	/**
38
	 * @dataProvider invalidResponseProvider
39
	 */
40
	public function testWhenFetcherReturnsInvalidResponse_nullIsReturned( $invalidResponse ) {
41
		$geocoder = new NominatimGeocoder( new InMemoryFileFetcher( [
42
			self::NEW_YORK_FETCH_URL => $invalidResponse
43
		] ) );
44
45
		$this->assertNull( $geocoder->geocode( 'New York' ) );
46
	}
47
48
	public function invalidResponseProvider() {
49
		return [
50
			'Not JSON' => '~=[,,_,,]:3',
51
			'Not a JSON array' => '42',
52
			'Empty JSON array' => '[]',
53
			'Missing lon key' => '[{"lat":"40.7642499","FOO":"-73.9545249"}]',
54
			'Missing lat key' => '[{"FOO":"40.7642499","lon":"-73.9545249"}]',
55
		];
56
	}
57
58
	// TODO: test malicious address escaping
59
60
}
61