array( 'continent_code' => 'NA', 'geoname_id' => 42, 'names' => array( 'en' => 'North America' ), ), 'country' => array( 'geoname_id' => 1, 'iso_code' => 'US', 'names' => array( 'en' => 'United States of America' ), ), 'traits' => array( 'ip_address' => '1.2.3.4', ), ); private function getResponse($ip) { $responses = array( '1.2.3.4' => $this->response( 'country', 200, $this->country ), 'me' => $this->response( 'country', 200, $this->country ), '1.2.3.5' => $this->response('country', 200), '2.2.3.5' => $this->response('country', 200, 'bad body'), '1.2.3.6'=> $this->response( 'error', 400, array( 'code' => 'IP_ADDRESS_INVALID', 'error' => 'The value "1.2.3" is not a valid ip address' ) ), '1.2.3.7' => $this->response( 'error', 400 ), '1.2.3.8' => $this->response( 'error', 400, array( 'weird' => 42 ) ), '1.2.3.9' => $this->response( 'error', 400, null, 'bad body' ), '1.2.3.10' => $this->response( null, 500 ), '1.2.3.11' => $this->response( null, 300 ), '1.2.3.12' => $this->response( 'error', 406, 'Cannot satisfy your Accept-Charset requirements', null, 'text/plain' ), ); return $responses[$ip]; } public function testCountry() { $country = $this->client($this->getResponse('1.2.3.4'))->country('1.2.3.4' ); $this->assertInstanceOf('GeoIP2\Model\Country', $country); $this->assertEquals(42, $country->continent->geonameId, 'continent geoname_id is 42'); $this->assertEquals('NA', $country->continent->continentCode, 'continent continent_code is NA'); $this->assertEquals(array('en' => 'North America'), $country->continent->names, 'continent names'); $this->assertEquals('North America', $country->continent->name, 'continent name is North America'); $this->assertEquals(1, $country->country->geonameId, 'country geoname_id is 1'); $this->assertEquals('US', $country->country->isoCode, 'country iso_code is US'); $this->assertEquals(array( 'en' => 'United States of America' ), $country->country->names, 'country names'); $this->assertEquals('United States of America', $country->country->name, 'country name is United States of America'); } public function testMe() { $client = $this->client($this->getResponse('me')); $this->assertInstanceOf('GeoIP2\Model\CityIspOrg', $client->cityIspOrg('me' ), 'can set ip parameter to me'); } /** * @expectedException GeoIP2\Exception\GenericException * @expectedExceptionMessage Received a 200 response for https://geoip.maxmind.com/geoip/v2.0/country/1.2.3.5 but did not receive a HTTP body. */ public function testNoBodyException() { $client = $this->client($this->getResponse('1.2.3.5')); $client->country('1.2.3.5'); } /** * @expectedException GeoIP2\Exception\GenericException * @expectedExceptionMessage Received a 200 response for https://geoip.maxmind.com/geoip/v2.0/country/2.2.3.5 but could not decode the response as JSON: */ public function testBadBodyException() { $client = $this->client($this->getResponse('2.2.3.5')); $client->country('2.2.3.5'); } /** * @expectedException GeoIP2\Exception\WebserviceException * @expectedExceptionCode IP_ADDRESS_INVALID * @expectedExceptionMessage The value "1.2.3" is not a valid ip address */ public function testInvalidIPException() { $client = $this->client($this->getResponse('1.2.3.6')); $client->country('1.2.3.6'); } /** * @expectedException GeoIP2\Exception\HttpException * @expectedExceptionCode 400 * @expectedExceptionMessage with no body */ public function testNoErrorBodyIPException() { $client = $this->client($this->getResponse('1.2.3.7')); $client->country('1.2.3.7'); } /** * @expectedException GeoIP2\Exception\GenericException * @expectedExceptionMessage Response contains JSON but it does not specify code or error keys */ public function testWeirdErrorBodyIPException() { $client = $this->client($this->getResponse('1.2.3.8')); $client->country('1.2.3.8'); } /** * @expectedException GeoIP2\Exception\HttpException * @expectedExceptionCode 400 * @expectedExceptionMessage did not include the expected JSON body */ public function testInvalidErrorBodyIPException() { $client = $this->client($this->getResponse('1.2.3.9')); $client->country('1.2.3.9'); } /** * @expectedException GeoIP2\Exception\HttpException * @expectedExceptionCode 500 * @expectedExceptionMessage Received a server error (500) */ public function test500PException() { $client = $this->client($this->getResponse('1.2.3.10')); $client->country('1.2.3.10'); } /** * @expectedException GeoIP2\Exception\HttpException * @expectedExceptionCode 300 * @expectedExceptionMessage Received a very surprising HTTP status (300) */ public function test3xxException() { $client = $this->client($this->getResponse('1.2.3.11')); $client->country('1.2.3.11'); } /** * @expectedException GeoIP2\Exception\HttpException * @expectedExceptionCode 406 * @expectedExceptionMessage Received a 406 error for https://geoip.maxmind.com/geoip/v2.0/country/1.2.3.12 with the following body: Cannot satisfy your Accept-Charset requirements */ public function test406Exception() { $client = $this->client($this->getResponse('1.2.3.12')); $client->country('1.2.3.12'); } public function testParams() { $plugin = new MockPlugin(); $plugin->addResponse($this->getResponse('1.2.3.4')); $guzzleClient = new GuzzleClient(); $guzzleClient->addSubscriber($plugin); $client = new Client(42, 'abcdef123456', array('en'), $guzzleClient); $client->country('1.2.3.4'); $request = $plugin->getReceivedRequests()[0]; $this->assertEquals('https://geoip.maxmind.com/geoip/v2.0/country/1.2.3.4', $request->getUrl(), 'got expected URI for Country request'); $this->assertEquals('GET', $request->getMethod(), 'request is a GET'); $this->assertEquals('application/json', $request->getHeader('Accept'), 'request sets Accept header to application/json'); $this->assertStringMatchesFormat('GeoIP2 PHP API (Guzzle%s)', $request->getHeader('User-Agent') . '', 'request sets Accept header to application/json'); } private function client($response, $languages=array('en')) { $plugin = new MockPlugin(); $plugin->addResponse($response); $guzzleClient = new GuzzleClient(); $guzzleClient->addSubscriber($plugin); $client = new Client(42, 'abcdef123456', $languages, $guzzleClient); return $client; } private function response($endpoint, $status, $body=null, $bad=null, $contentType=null) { $headers = Array(); if( $contentType) { $headers['Content-Type'] = $contentType; } elseif ( $status == 200 || ( $status >= 400 && $status < 500 ) ) { $headers['Content-Type'] = 'application/vnd.maxmind.com-' . $endpoint . '+json; charset=UTF-8; version=1.0;'; } if ($bad) { $body = '{ invalid: }'; } elseif (is_array($body)) { $body = json_encode($body); } $headers['Content-Length'] = strlen($body); return new Response($status, $headers, $body); } public function testTest() { $this->assertEquals(1,1); } }