From 91c36b90459fea0fc7bc46d712aba66f6803db03 Mon Sep 17 00:00:00 2001 From: Development Date: Fri, 17 Oct 2025 13:33:11 +0200 Subject: [PATCH 1/5] Add premium endpoint and token authentication support for Geonames provider - Add optional token parameter to Geonames constructor - Add secure flag to enable https://secure.geonames.net endpoint - Support dynamic base URL (api.geonames.org or secure.geonames.net) - Append token parameter to all API requests when provided - Maintain backward compatibility with existing username-only authentication --- src/Provider/Geonames/Geonames.php | 60 ++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/src/Provider/Geonames/Geonames.php b/src/Provider/Geonames/Geonames.php index ec999bf1b..581691dca 100644 --- a/src/Provider/Geonames/Geonames.php +++ b/src/Provider/Geonames/Geonames.php @@ -52,17 +52,38 @@ final class Geonames extends AbstractHttpProvider implements Provider */ private $username; + /** + * @var string|null + */ + private $token; + + /** + * @var string + */ + private $baseUrl; + /** * @param ClientInterface $client An HTTP adapter * @param string $username Username login (Free registration at http://www.geonames.org/login) + * @param string|null $token Optional token for premium accounts + * @param bool $secure Use secure endpoint (https://secure.geonames.net) for premium accounts */ - public function __construct(ClientInterface $client, string $username) + public function __construct(ClientInterface $client, string $username, ?string $token = null, bool $secure = false) { if (empty($username)) { throw new InvalidCredentials('No username provided.'); } $this->username = $username; + $this->token = $token; + + // Determine base URL based on secure flag + if ($secure) { + $this->baseUrl = 'https://secure.geonames.net'; + } else { + $this->baseUrl = 'http://api.geonames.org'; + } + parent::__construct($client); } @@ -75,7 +96,15 @@ public function geocodeQuery(GeocodeQuery $query): Collection throw new UnsupportedOperation('The Geonames provider does not support IP addresses.'); } - $url = sprintf(self::GEOCODE_ENDPOINT_URL, urlencode($address), $query->getLimit(), $this->username); + $url = sprintf( + '%s/searchJSON?q=%s&maxRows=%d&style=full&username=%s', + $this->baseUrl, + urlencode($address), + $query->getLimit(), + $this->username + ); + + $url = $this->appendToken($url); return $this->executeQuery($url, $query->getLocale()); } @@ -86,7 +115,16 @@ public function reverseQuery(ReverseQuery $query): Collection $longitude = $coordinates->getLongitude(); $latitude = $coordinates->getLatitude(); - $url = sprintf(self::REVERSE_ENDPOINT_URL, $latitude, $longitude, $query->getLimit(), $this->username); + $url = sprintf( + '%s/findNearbyPlaceNameJSON?lat=%F&lng=%F&style=full&maxRows=%d&username=%s', + $this->baseUrl, + $latitude, + $longitude, + $query->getLimit(), + $this->username + ); + + $url = $this->appendToken($url); return $this->executeQuery($url, $query->getLocale()); } @@ -96,7 +134,7 @@ public function reverseQuery(ReverseQuery $query): Collection */ public function getCountryInfo(?string $country = null, ?string $locale = null): array { - $url = sprintf(self::BASE_ENDPOINT_URL, 'countryInfoJSON', $this->username); + $url = sprintf('%s/countryInfoJSON?username=%s', $this->baseUrl, $this->username); if (isset($country)) { $url = sprintf('%s&country=%s', $url, $country); @@ -109,6 +147,8 @@ public function getCountryInfo(?string $country = null, ?string $locale = null): $url = sprintf('%s&lang=%s', $url, substr($locale, 0, 2)); } + $url = $this->appendToken($url); + $content = $this->getUrlContents($url); if (null === $json = json_decode($content)) { throw InvalidServerResponse::create($url); @@ -217,4 +257,16 @@ private function executeQuery(string $url, ?string $locale = null): AddressColle return new AddressCollection($results); } + + /** + * Append token parameter to URL if token is provided. + */ + private function appendToken(string $url): string + { + if (null !== $this->token && '' !== $this->token) { + $url = sprintf('%s&token=%s', $url, $this->token); + } + + return $url; + } } From 9ac9f011ceacfa4e62e69220c8122e4bdb68b7ee Mon Sep 17 00:00:00 2001 From: Aron Novak Date: Mon, 20 Oct 2025 15:02:53 +0200 Subject: [PATCH 2/5] use consts properly, cleanup --- .gitignore | 1 + src/Provider/Geonames/Geonames.php | 24 +++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index c5a5e4581..61a50ebec 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ phpunit.xml .phpunit.result.cache .php-cs-fixer.cache .puli/ +.idea diff --git a/src/Provider/Geonames/Geonames.php b/src/Provider/Geonames/Geonames.php index 581691dca..b32e9f8a1 100644 --- a/src/Provider/Geonames/Geonames.php +++ b/src/Provider/Geonames/Geonames.php @@ -32,20 +32,26 @@ */ final class Geonames extends AbstractHttpProvider implements Provider { + + /** + * @var string + */ + public const PREMIUM_WEBSERVICE_BASE_URL = 'https://secure.geonames.net'; + /** * @var string */ - public const GEOCODE_ENDPOINT_URL = 'http://api.geonames.org/searchJSON?q=%s&maxRows=%d&style=full&username=%s'; + public const FREE_WEBSERVICE_BASE_URL = 'http://api.geonames.net'; /** * @var string */ - public const REVERSE_ENDPOINT_URL = 'http://api.geonames.org/findNearbyPlaceNameJSON?lat=%F&lng=%F&style=full&maxRows=%d&username=%s'; + public const GEOCODE_ENDPOINT_PATH = '%s/searchJSON?q=%s&maxRows=%d&style=full&username=%s'; /** * @var string */ - public const BASE_ENDPOINT_URL = 'http://api.geonames.org/%s?username=%s'; + public const REVERSE_ENDPOINT_PATH = '%s/findNearbyPlaceNameJSON?lat=%F&lng=%F&style=full&maxRows=%d&username=%s'; /** * @var string @@ -77,11 +83,11 @@ public function __construct(ClientInterface $client, string $username, ?string $ $this->username = $username; $this->token = $token; - // Determine base URL based on secure flag - if ($secure) { - $this->baseUrl = 'https://secure.geonames.net'; + // Determine base URL based on secure flag. + if ($secure === TRUE) { + $this->baseUrl = self::PREMIUM_WEBSERVICE_BASE_URL; } else { - $this->baseUrl = 'http://api.geonames.org'; + $this->baseUrl = self::FREE_WEBSERVICE_BASE_URL; } parent::__construct($client); @@ -97,7 +103,7 @@ public function geocodeQuery(GeocodeQuery $query): Collection } $url = sprintf( - '%s/searchJSON?q=%s&maxRows=%d&style=full&username=%s', + self::GEOCODE_ENDPOINT_PATH, $this->baseUrl, urlencode($address), $query->getLimit(), @@ -116,7 +122,7 @@ public function reverseQuery(ReverseQuery $query): Collection $latitude = $coordinates->getLatitude(); $url = sprintf( - '%s/findNearbyPlaceNameJSON?lat=%F&lng=%F&style=full&maxRows=%d&username=%s', + self::REVERSE_ENDPOINT_PATH, $this->baseUrl, $latitude, $longitude, From 89b7fe670a5dca81451ce2beb9d7d60f867693d9 Mon Sep 17 00:00:00 2001 From: Aron Novak Date: Mon, 20 Oct 2025 15:22:16 +0200 Subject: [PATCH 3/5] test coverage --- src/Provider/Geonames/Geonames.php | 2 +- src/Provider/Geonames/Tests/GeonamesTest.php | 33 ++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Provider/Geonames/Geonames.php b/src/Provider/Geonames/Geonames.php index b32e9f8a1..2393079c9 100644 --- a/src/Provider/Geonames/Geonames.php +++ b/src/Provider/Geonames/Geonames.php @@ -84,7 +84,7 @@ public function __construct(ClientInterface $client, string $username, ?string $ $this->token = $token; // Determine base URL based on secure flag. - if ($secure === TRUE) { + if ($secure === true) { $this->baseUrl = self::PREMIUM_WEBSERVICE_BASE_URL; } else { $this->baseUrl = self::FREE_WEBSERVICE_BASE_URL; diff --git a/src/Provider/Geonames/Tests/GeonamesTest.php b/src/Provider/Geonames/Tests/GeonamesTest.php index 9f6b1e06d..55a885b3b 100644 --- a/src/Provider/Geonames/Tests/GeonamesTest.php +++ b/src/Provider/Geonames/Tests/GeonamesTest.php @@ -22,9 +22,13 @@ class GeonamesTest extends BaseTestCase { - protected function getCacheDir(): string + protected function getCacheDir(): ?string { - return __DIR__.'/.cached_responses'; + if (isset($_SERVER['USE_CACHED_RESPONSES']) && true === $_SERVER['USE_CACHED_RESPONSES']) { + return __DIR__.'/.cached_responses'; + } + + return null; } public function testGetName(): void @@ -368,4 +372,29 @@ public function testReverseWithBadCoordinates(): void $this->assertInstanceOf(Collection::class, $result); $this->assertEquals(0, $result->count()); } + + public function testGeocodeWithPremiumEndpointAndToken(): void + { + if (!isset($_SERVER['GEONAMES_USERNAME']) || !isset($_SERVER['GEONAMES_TOKEN'])) { + $this->markTestSkipped('You need to configure the GEONAMES_USERNAME and GEONAMES_TOKEN values in phpunit.xml'); + } + + $provider = new Geonames( + $this->getHttpClient($_SERVER['GEONAMES_USERNAME']), + $_SERVER['GEONAMES_USERNAME'], + $_SERVER['GEONAMES_TOKEN'], + true + ); + $results = $provider->geocodeQuery(GeocodeQuery::create('London')); + + $this->assertInstanceOf(\Geocoder\Model\AddressCollection::class, $results); + $this->assertGreaterThan(0, $results->count()); + + /** @var Location $result */ + $result = $results->first(); + $this->assertInstanceOf(\Geocoder\Model\Address::class, $result); + $this->assertNotNull($result->getCoordinates()); + $this->assertEquals('United Kingdom', $result->getCountry()->getName()); + $this->assertEquals('GB', $result->getCountry()->getCode()); + } } From 4e1f258ea807f1f8c3d0ef8f01bfa8fd12212e03 Mon Sep 17 00:00:00 2001 From: Aron Novak Date: Mon, 20 Oct 2025 15:41:23 +0200 Subject: [PATCH 4/5] initial test --- phpunit.xml.dist | 1 + src/Provider/Geonames/Geonames.php | 2 +- ...names.net_b99709bd2958d3741d56d07d79b73bc183adfdb3 | 1 + src/Provider/Geonames/Tests/GeonamesTest.php | 11 +++++++---- 4 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 src/Provider/Geonames/Tests/.cached_responses/secure.geonames.net_b99709bd2958d3741d56d07d79b73bc183adfdb3 diff --git a/phpunit.xml.dist b/phpunit.xml.dist index d01fae0f5..8c4aba1e9 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -35,6 +35,7 @@ + diff --git a/src/Provider/Geonames/Geonames.php b/src/Provider/Geonames/Geonames.php index 2393079c9..2b4cd29c1 100644 --- a/src/Provider/Geonames/Geonames.php +++ b/src/Provider/Geonames/Geonames.php @@ -41,7 +41,7 @@ final class Geonames extends AbstractHttpProvider implements Provider /** * @var string */ - public const FREE_WEBSERVICE_BASE_URL = 'http://api.geonames.net'; + public const FREE_WEBSERVICE_BASE_URL = 'http://api.geonames.org'; /** * @var string diff --git a/src/Provider/Geonames/Tests/.cached_responses/secure.geonames.net_b99709bd2958d3741d56d07d79b73bc183adfdb3 b/src/Provider/Geonames/Tests/.cached_responses/secure.geonames.net_b99709bd2958d3741d56d07d79b73bc183adfdb3 new file mode 100644 index 000000000..e2c468cc2 --- /dev/null +++ b/src/Provider/Geonames/Tests/.cached_responses/secure.geonames.net_b99709bd2958d3741d56d07d79b73bc183adfdb3 @@ -0,0 +1 @@ +s:17819:"{"totalResultsCount":10526,"geonames":[{"timezone":{"gmtOffset":0,"timeZoneId":"Europe/London","dstOffset":1},"bbox":{"east":0.2811882683122086,"south":51.297523767519486,"north":51.68293389615384,"west":-0.4991631942360928,"accuracyLevel":10},"asciiName":"London","astergdem":33,"countryId":"2635167","fcl":"P","srtm3":25,"score":114.52741241455078,"adminId2":"2648110","countryCode":"GB","adminCodes1":{"ISO3166_2":"ENG"},"adminId1":"6269131","lat":"51.50853","fcode":"PPLC","continentCode":"EU","adminCode2":"GLA","adminCode1":"ENG","lng":"-0.12574","geonameId":2643743,"toponymName":"London","population":8961989,"adminName5":"","adminName4":"","adminName3":"","alternateNames":[{"name":"Лондан","lang":"ab"},{"name":"Londen","lang":"af"},{"name":"London","lang":"als"},{"name":"ለንደን","lang":"am"},{"name":"Londres","lang":"an"},{"name":"Lunden","lang":"ang"},{"name":"لندن","lang":"ar"},{"name":"ܠܘܢܕܘܢ","lang":"arc"},{"name":"لندن","lang":"arz"},{"name":"Londres","lang":"ast"},{"name":"London","lang":"az"},{"name":"لندن","lang":"azb"},{"name":"Лондон","lang":"ba"},{"name":"Londres","lang":"bcl"},{"name":"Лёндан","lang":"be"},{"name":"Лондон","lang":"bg"},{"name":"लंदन","lang":"bh"},{"name":"লন্ডন","lang":"bn"},{"name":"ལོན་ཊོན།","lang":"bo"},{"name":"Londrez","lang":"br"},{"name":"London","lang":"bs"},{"name":"Лондон","lang":"bxr"},{"name":"Londres","lang":"ca"},{"name":"Lùng-dŭng","lang":"cdo"},{"name":"Лондон","lang":"ce"},{"name":"ᎫᎴ ᏗᏍᎪᏂᎯᏱ","lang":"chr"},{"name":"لەندەن","lang":"ckb"},{"name":"Londra","lang":"co"},{"name":"Londýn","lang":"cs"},{"name":"Londin","lang":"csb"},{"name":"Лондонъ","lang":"cu"},{"name":"Лондон","lang":"cv"},{"name":"Llundain","lang":"cy"},{"name":"London","lang":"da"},{"name":"London","lang":"de"},{"name":"Londra","lang":"diq"},{"name":"Λονδίνο","lang":"el"},{"isPreferredName":true,"name":"London","lang":"en"},{"name":"Londono","lang":"eo"},{"name":"Londres","lang":"es"},{"name":"London","lang":"et"},{"name":"Londres","lang":"eu"},{"name":"Londri","lang":"ext"},{"name":"لندن","lang":"fa"},{"name":"Lontoo","lang":"fi"},{"name":"Lodoni","lang":"fj"},{"isShortName":true,"isPreferredName":true,"name":"Londres","lang":"fr"},{"name":"Londro","lang":"frp"},{"name":"Londen","lang":"fy"},{"name":"Londain","lang":"ga"},{"name":"倫敦","lang":"gan"},{"name":"Lunnainn","lang":"gd"},{"name":"Londres","lang":"gl"},{"name":"Londye","lang":"gn"},{"name":"લંડન","lang":"gu"},{"name":"Lunnin","lang":"gv"},{"name":"Lùn-tûn","lang":"hak"},{"name":"Lākana","lang":"haw"},{"name":"London","lang":"hbs"},{"name":"לונדון","lang":"he"},{"name":"लंदन","lang":"hi"},{"name":"London","lang":"hr"},{"name":"Lonn","lang":"ht"},{"name":"London","lang":"hu"},{"name":"Լոնդոն","lang":"hy"},{"name":"London","lang":"ia"},{"name":"LON","lang":"iata"},{"name":"London","lang":"id"},{"name":"Londres","lang":"ilo"},{"name":"London","lang":"io"},{"name":"London","lang":"is"},{"name":"Londra","lang":"it"},{"name":"ロンドン","lang":"ja"},{"name":"london","lang":"jbo"},{"name":"ლონდონი","lang":"ka"},{"name":"Лондон","lang":"kbd"},{"name":"Лондон","lang":"kk"},{"name":"ಲಂಡನ್","lang":"kn"},{"name":"런던","lang":"ko"},{"name":"Лондон","lang":"koi"},{"name":"Лондон","lang":"krc"},{"name":"London","lang":"ku"},{"name":"Лондон","lang":"kv"},{"name":"Loundres","lang":"kw"},{"name":"Лондон","lang":"ky"},{"name":"Londinium","lang":"la"},{"name":"Londra","lang":"lad"},{"name":"London","lang":"lb"},{"name":"Лондон","lang":"lbe"},{"name":"Лондон","lang":"lez"},{"name":"Londe","lang":"li"},{"name":"Londra","lang":"lij"},{"name":"https://en.wikipedia.org/wiki/London","lang":"link"},{"name":"Lundra","lang":"lmo"},{"name":"Londoni","lang":"ln"},{"name":"ລອນດອນ","lang":"lo"},{"name":"لأندأن","lang":"lrc"},{"name":"Londonas","lang":"lt"},{"name":"Londona","lang":"lv"},{"name":"倫敦","lang":"lzh"},{"name":"लण्डन","lang":"mai"},{"name":"Лондон","lang":"mhr"},{"name":"Rānana","lang":"mi"},{"name":"Лондон","lang":"mk"},{"name":"ലണ്ടൻ","lang":"ml"},{"name":"Лондон","lang":"mn"},{"name":"लंडन","lang":"mr"},{"name":"Лондон","lang":"mrj"},{"name":"London","lang":"ms"},{"name":"Londra","lang":"mt"},{"name":"Londres","lang":"mwl"},{"name":"လန်ဒန်မြို့","lang":"my"},{"name":"Лондон ош","lang":"myv"},{"name":"لندن","lang":"mzn"},{"name":"Londres","lang":"nah"},{"name":"Lûn-tun","lang":"nan"},{"name":"Londra","lang":"nap"},{"name":"London","lang":"nds"},{"name":"लण्डन","lang":"ne"},{"name":"लन्दन","lang":"new"},{"name":"Londen","lang":"nl"},{"name":"London","lang":"nn"},{"name":"London","lang":"no"},{"name":"Londres","lang":"nrm"},{"name":"Londres","lang":"oc"},{"name":"Landan","lang":"om"},{"name":"ଲଣ୍ଡନ","lang":"or"},{"name":"Лондон","lang":"os"},{"name":"ਲੰਡਨ","lang":"pa"},{"name":"Londe","lang":"pcd"},{"name":"Londyn","lang":"pl"},{"name":"Londra","lang":"pms"},{"name":"لندن","lang":"pnb"},{"name":"Λονδίνο","lang":"pnt"},{"name":"لندن","lang":"ps"},{"name":"Londres","lang":"pt"},{"name":"London","lang":"qu"},{"name":"Londra","lang":"rm"},{"name":"Londra","lang":"ro"},{"name":"Лондон","lang":"ru"},{"name":"Лондон","lang":"rue"},{"name":"लन्डन्","lang":"sa"},{"name":"Лондон","lang":"sah"},{"name":"Londra","lang":"sc"},{"name":"Londra","lang":"scn"},{"name":"Lunnon","lang":"sco"},{"name":"Londons","lang":"sgs"},{"name":"ලන්ඩන්","lang":"si"},{"name":"Londýn","lang":"sk"},{"name":"London","lang":"sl"},{"name":"Londra","lang":"sq"},{"name":"Лондон","lang":"sr"},{"name":"London","lang":"sv"},{"name":"Lůndůn","lang":"szl"},{"name":"இலண்டன்","lang":"ta"},{"name":"లండన్","lang":"te"},{"name":"Londres","lang":"tet"},{"name":"Лондон","lang":"tg"},{"name":"ลอนดอน","lang":"th"},{"name":"Londres","lang":"tl"},{"name":"Landen","lang":"tpi"},{"name":"Londra","lang":"tr"},{"name":"Лондон","lang":"tt"},{"name":"Лондон","lang":"udm"},{"name":"لوندون","lang":"ug"},{"name":"Лондон","lang":"uk"},{"name":"GBLON","lang":"unlc"},{"name":"لندن","lang":"ur"},{"name":"Łondra","lang":"vec"},{"name":"Luân Đôn","lang":"vi"},{"name":"Londn","lang":"vls"},{"name":"London","lang":"vo"},{"name":"Q84","lang":"wkdt"},{"name":"Londar","lang":"wo"},{"name":"伦敦","lang":"wuu"},{"name":"ლონდონი","lang":"xmf"},{"name":"לאנדאן","lang":"yi"},{"name":"Lọndọnu","lang":"yo"},{"name":"倫敦","lang":"yue"},{"name":"Londen","lang":"zea"},{"isPreferredName":true,"name":"倫敦","lang":"zh"},{"name":"伦敦","lang":"zh-CN"},{"name":"倫敦","lang":"zh-TW"},{"name":"ILondon","lang":"zu"},{"name":"倫敦","lang":"zh-Hant"}],"adminName2":"Greater London","name":"London","fclName":"city, village,...","countryName":"United Kingdom","fcodeName":"capital of a political entity","adminName1":"England"},{"timezone":{"gmtOffset":-5,"timeZoneId":"America/New_York","dstOffset":-4},"bbox":{"east":-72.05511899999999,"south":41.276498,"north":41.386998,"west":-72.12853,"accuracyLevel":10},"asciiName":"New London","astergdem":25,"countryId":"6252001","fcl":"P","srtm3":25,"score":40.5867919921875,"adminId2":"12809024","adminId3":"4839433","countryCode":"US","adminCodes1":{"ISO3166_2":"CT"},"adminId1":"4831725","lat":"41.35565","fcode":"PPL","continentCode":"NA","elevation":17,"adminCode2":"180","adminCode3":"52350","adminCode1":"CT","lng":"-72.09952","geonameId":4839416,"toponymName":"New London","population":27179,"adminName5":"","adminName4":"","adminName3":"Town of New London","alternateNames":[{"name":"نيو لندن","lang":"ar"},{"name":"نيو لندن","lang":"arz"},{"name":"New London","lang":"ast"},{"name":"نیو لندن، کانتیکت","lang":"azb"},{"name":"Ню Лъндън","lang":"bg"},{"name":"Nova Londres","lang":"ca"},{"name":"Нью-Лондон","lang":"ce"},{"name":"New London","lang":"ceb"},{"name":"New London","lang":"cs"},{"name":"New London","lang":"cy"},{"name":"New London","lang":"da"},{"name":"New London","lang":"de"},{"isPreferredName":true,"name":"New London","lang":"en"},{"name":"Nov-Londono","lang":"eo"},{"name":"New London","lang":"es"},{"name":"New London","lang":"eu"},{"name":"نیو لاندن، کنتیکت","lang":"fa"},{"name":"New London","lang":"fi"},{"name":"New London","lang":"fit"},{"name":"New London","lang":"fr"},{"name":"New London","lang":"ga"},{"name":"New London","lang":"gd"},{"name":"New London","lang":"hbs"},{"name":"ניו לונדון","lang":"he"},{"name":"New London","lang":"hr"},{"name":"New London","lang":"ht"},{"name":"New London","lang":"hu"},{"name":"Նյու Լոնդոն","lang":"hy"},{"name":"New London","lang":"id"},{"name":"New London","lang":"it"},{"name":"ニュー・ロンドン","lang":"ja"},{"name":"Нью Лондон","lang":"kk"},{"name":"뉴런던","lang":"ko"},{"name":"Нью Лондон","lang":"ky"},{"name":"https://en.wikipedia.org/wiki/New_London%2C_Connecticut","lang":"link"},{"name":"New London","lang":"lld"},{"name":"New London","lang":"mg"},{"name":"न्यू लंडन","lang":"mr"},{"name":"New London","lang":"nan"},{"name":"New London","lang":"nb"},{"name":"न्यु लंडन","lang":"new"},{"name":"New London","lang":"nl"},{"name":"New London","lang":"oc"},{"name":"New London","lang":"pl"},{"name":"06320","lang":"post"},{"name":"New London","lang":"pt"},{"name":"New London","lang":"ro"},{"name":"Нью-Лондон","lang":"ru"},{"name":"New London","lang":"sk"},{"name":"New London","lang":"sl"},{"name":"Њу Лондон","lang":"sr"},{"name":"New London","lang":"sv"},{"name":"New London","lang":"szl"},{"name":"New London","lang":"tr"},{"name":"Нью-Лондон","lang":"tt"},{"name":"Нью-Лондон","lang":"uk"},{"name":"USNLO","lang":"unlc"},{"name":"نیو لندن، کنیکٹیکٹ","lang":"ur"},{"name":"New London","lang":"uz"},{"name":"New London","lang":"vi"},{"name":"New London","lang":"vo"},{"name":"New London","lang":"war"},{"name":"Q49146","lang":"wkdt"},{"name":"新伦敦","lang":"zh"},{"name":"新伦敦","lang":"zh-Hant"}],"adminName2":"Southeastern Connecticut Planning Region","name":"New London","fclName":"city, village,...","countryName":"United States","fcodeName":"populated place","adminName1":"Connecticut"},{"timezone":{"gmtOffset":-5,"timeZoneId":"America/Toronto","dstOffset":-4},"bbox":{"east":-81.02028556099998,"south":42.894999288000065,"north":43.06334333600006,"west":-81.37080093799995,"accuracyLevel":10},"asciiName":"London","astergdem":258,"countryId":"6251999","fcl":"P","srtm3":252,"score":37.19841003417969,"adminId2":"6073256","countryCode":"CA","adminCodes1":{"ISO3166_2":"ON"},"adminId1":"6093943","lat":"42.98339","fcode":"PPL","continentCode":"NA","adminCode2":"3539","adminCode1":"08","lng":"-81.23304","geonameId":6058560,"toponymName":"London","population":346765,"adminName5":"","adminName4":"","adminName3":"","alternateNames":[{"name":"لندن","lang":"ar"},{"name":"Лондон","lang":"bg"},{"name":"London","lang":"de"},{"name":"London","lang":"en"},{"name":"Londono","lang":"eo"},{"name":"London","lang":"es"},{"name":"London","lang":"et"},{"name":"لندن، انتاریو","lang":"fa"},{"name":"London","lang":"fi"},{"name":"London","lang":"fr"},{"name":"לונדון","lang":"he"},{"name":"London","lang":"hr"},{"name":"YXU","lang":"iata"},{"name":"ロンドン","lang":"ja"},{"name":"ლონდონი","lang":"ka"},{"name":"런던","lang":"ko"},{"name":"https://en.wikipedia.org/wiki/London%2C_Ontario","lang":"link"},{"name":"Londonas","lang":"lt"},{"name":"Landona","lang":"lv"},{"name":"London","lang":"nl"},{"name":"Лондон","lang":"os"},{"name":"London","lang":"pl"},{"name":"لندن","lang":"pnb"},{"name":"London","lang":"pt"},{"name":"Лондон","lang":"ru"},{"name":"London","lang":"sl"},{"name":"Лондон","lang":"sr"},{"name":"Лондон","lang":"uk"},{"name":"CALOD","lang":"unlc"},{"name":"لندن، اونٹاریو","lang":"ur"},{"name":"Q92561","lang":"wkdt"},{"name":"伦敦","lang":"zh"},{"name":"伦敦","lang":"zh-CN"},{"name":"伦敦","lang":"zh-Hant"}],"adminName2":"Middlesex County","name":"London","fclName":"city, village,...","countryName":"Canada","fcodeName":"populated place","adminName1":"Ontario"},{"timezone":{"gmtOffset":14,"timeZoneId":"Pacific/Kiritimati","dstOffset":14},"bbox":{"east":-157.47052373335498,"south":1.9803698745218066,"north":1.9893635232732336,"west":-157.47952280595104,"accuracyLevel":2},"asciiName":"London Village","astergdem":41,"countryId":"4030945","fcl":"P","srtm3":8,"score":25.829275131225586,"adminId2":"7521593","countryCode":"KI","adminCodes1":{"ISO3166_2":"L"},"adminId1":"4030940","lat":"1.98487","fcode":"PPL","continentCode":"OC","adminCode2":"KT","adminCode1":"02","lng":"-157.47502","geonameId":4030939,"toponymName":"London Village","population":1829,"adminName5":"","adminName4":"","adminName3":"","alternateNames":[{"name":"London Village","lang":"ceb"},{"name":"London","lang":"de"},{"name":"London","lang":"en"},{"name":"Londono","lang":"eo"},{"name":"London","lang":"es"},{"name":"لندن","lang":"fa"},{"name":"London","lang":"fr"},{"name":"London","lang":"gl"},{"name":"London","lang":"it"},{"name":"ロンドン","lang":"ja"},{"name":"https://en.wikipedia.org/wiki/London%2C_Kiribati","lang":"link"},{"name":"Londonas","lang":"lt"},{"name":"倫敦","lang":"lzh"},{"name":"London","lang":"nan"},{"name":"London","lang":"nl"},{"name":"London","lang":"pl"},{"name":"London","lang":"pt"},{"name":"Лондон","lang":"ru"},{"name":"London","lang":"sv"},{"name":"Q2477346","lang":"wkdt"},{"name":"倫敦","lang":"zh"},{"name":"倫敦","lang":"zh-Hant"}],"adminName2":"Kiritimati","name":"London","fclName":"city, village,...","countryName":"Kiribati","fcodeName":"populated place","adminName1":"Line Islands"},{"timezone":{"gmtOffset":0,"timeZoneId":"Europe/London","dstOffset":1},"asciiName":"London City Airport","astergdem":10,"countryId":"2635167","fcl":"S","srtm3":8,"score":24.6879825592041,"adminId2":"2648110","adminId3":"2641639","countryCode":"GB","adminCodes1":{"ISO3166_2":"ENG"},"adminId1":"6269131","lat":"51.50528","fcode":"AIRP","continentCode":"EU","elevation":5,"adminCode2":"GLA","adminCode3":"I8","adminCode1":"ENG","lng":"0.05528","geonameId":6296599,"toponymName":"London City Airport","population":0,"adminName5":"","adminName4":"","adminName3":"Newham","alternateNames":[{"name":"Lughawe Londen-Stad","lang":"af"},{"name":"مطار لندن سيتي","lang":"ar"},{"name":"লন্ডন সিটি বিমানবন্দর","lang":"bn"},{"name":"Aerborzh Kêr Londrez","lang":"br"},{"name":"Aeroport de la Ciutat de Londres","lang":"ca"},{"name":"London City Airport","lang":"ceb"},{"name":"Letiště London City","lang":"cs"},{"name":"Maes Awyr Dinas Llundain","lang":"cy"},{"name":"London City Airport","lang":"da"},{"isPreferredName":true,"name":"Flughafen London City","lang":"de"},{"isPreferredName":true,"name":"London City Airport","lang":"en"},{"name":"Flughaveno Londono-Urbo","lang":"eo"},{"name":"Aeropuerto de la Ciudad de Londres","lang":"es"},{"name":"London City lennujaam","lang":"et"},{"name":"Londres Hiriko aireportua","lang":"eu"},{"name":"فرودگاه لندن سی‌تی","lang":"fa"},{"name":"London City Airport","lang":"fi"},{"isPreferredName":true,"name":"Aéroport de Londres City","lang":"fr"},{"name":"Aeroporto da Cidade de Londres","lang":"gl"},{"name":"Gradski aerodrom u Londonu","lang":"hbs"},{"name":"נמל התעופה לונדון סיטי","lang":"he"},{"name":"लंदन सिटी हवाई अड्डा","lang":"hi"},{"name":"London-City repülőtér","lang":"hu"},{"name":"LCY","lang":"iata"},{"name":"EGLC","lang":"icao"},{"name":"Bandar Udara London City","lang":"id"},{"name":"aeroporto di Londra-City","lang":"it"},{"name":"ロンドン・シティ空港","lang":"ja"},{"name":"런던 시티 공항","lang":"ko"},{"name":"https://en.wikipedia.org/wiki/London_City_Airport","lang":"link"},{"name":"Londono Sičio oro uostas","lang":"lt"},{"name":"Londonas Sitijas lidosta","lang":"lv"},{"name":"Lapangan Terbang London City","lang":"ms"},{"name":"London City lufthavn","lang":"nb"},{"name":"Luchthaven Londen City","lang":"nl"},{"name":"London lufthamn","lang":"nn"},{"name":"London City lufthavn","lang":"no"},{"name":"Port lotniczy Londyn-City","lang":"pl"},{"name":"London City Airport","lang":"pms"},{"name":"لندن سٹی ایئرپورٹ","lang":"pnb"},{"name":"Aeroporto da Cidade de Londres","lang":"pt"},{"name":"Aeroportul London City","lang":"ro"},{"name":"Лондон-Сити","lang":"ru"},{"name":"London City Airport","lang":"sco"},{"name":"Gradski aerodrom u Londonu","lang":"sr"},{"name":"London City Airport","lang":"sv"},{"name":"Фурудгоҳи лондан си‌тӣ","lang":"tg"},{"name":"ท่าอากาศยานลอนดอนซิตี","lang":"th"},{"name":"Londra Şehir Havalimanı","lang":"tr"},{"name":"Лондон-Сіті","lang":"uk"},{"name":"GBLCT","lang":"unlc"},{"name":"لندن سٹی ایئرپورٹ","lang":"ur"},{"name":"Sân bay London City","lang":"vi"},{"name":"Q8982","lang":"wkdt"},{"name":"לאנדאן סיטי ערפארט","lang":"yi"},{"name":"倫敦城市機場","lang":"yue"},{"name":"倫敦城市機場","lang":"zh"},{"name":"倫敦城市機場","lang":"zh-Hant"}],"adminName2":"Greater London","name":"London City Airport","fclName":"spot, building, farm","countryName":"United Kingdom","fcodeName":"airport","adminName1":"England"}]}"; \ No newline at end of file diff --git a/src/Provider/Geonames/Tests/GeonamesTest.php b/src/Provider/Geonames/Tests/GeonamesTest.php index 55a885b3b..50abb3ef9 100644 --- a/src/Provider/Geonames/Tests/GeonamesTest.php +++ b/src/Provider/Geonames/Tests/GeonamesTest.php @@ -24,7 +24,7 @@ class GeonamesTest extends BaseTestCase { protected function getCacheDir(): ?string { - if (isset($_SERVER['USE_CACHED_RESPONSES']) && true === $_SERVER['USE_CACHED_RESPONSES']) { + if (isset($_SERVER['USE_CACHED_RESPONSES']) && 'true' === $_SERVER['USE_CACHED_RESPONSES']) { return __DIR__.'/.cached_responses'; } @@ -379,10 +379,13 @@ public function testGeocodeWithPremiumEndpointAndToken(): void $this->markTestSkipped('You need to configure the GEONAMES_USERNAME and GEONAMES_TOKEN values in phpunit.xml'); } + $username = $_SERVER['GEONAMES_USERNAME']; + $token = $_SERVER['GEONAMES_TOKEN']; + $provider = new Geonames( - $this->getHttpClient($_SERVER['GEONAMES_USERNAME']), - $_SERVER['GEONAMES_USERNAME'], - $_SERVER['GEONAMES_TOKEN'], + $this->getHttpClient($token), + $username, + $token, true ); $results = $provider->geocodeQuery(GeocodeQuery::create('London')); From d7f1d3cbd11a013511dd98bfa82d0867b36f5be4 Mon Sep 17 00:00:00 2001 From: Aron Novak Date: Fri, 31 Oct 2025 13:32:08 +0100 Subject: [PATCH 5/5] Fix cache dir check to handle boolean true from PHPUnit PHPUnit converts XML attribute value='true' to boolean true instead of string 'true', causing the cache dir check to fail and tests to make real API calls instead of using cached responses. --- src/Provider/Geonames/Tests/GeonamesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/Geonames/Tests/GeonamesTest.php b/src/Provider/Geonames/Tests/GeonamesTest.php index 50abb3ef9..271318861 100644 --- a/src/Provider/Geonames/Tests/GeonamesTest.php +++ b/src/Provider/Geonames/Tests/GeonamesTest.php @@ -24,7 +24,7 @@ class GeonamesTest extends BaseTestCase { protected function getCacheDir(): ?string { - if (isset($_SERVER['USE_CACHED_RESPONSES']) && 'true' === $_SERVER['USE_CACHED_RESPONSES']) { + if (isset($_SERVER['USE_CACHED_RESPONSES']) && ($_SERVER['USE_CACHED_RESPONSES'] === true || $_SERVER['USE_CACHED_RESPONSES'] === 'true')) { return __DIR__.'/.cached_responses'; }