1
0
قرینه از https://github.com/matomo-org/matomo.git synced 2025-08-22 06:57:53 +00:00
Files
matomo/plugins/GeoIp2/tests/Integration/LocationProviderTest.php
Nathan Gavin 59d8fa4344 Update Lat Long storage to 2dp to meet privacy requirements (#23155)
* Update Lat Long storgage to 2dp to meet privacy requirements

* Fix UI test broken by Lat Long accuracy change

* Update tests to work with Lat Long 2dp

* Update tests to work with Lat Long 2dp

* Update tests to work with Lat Long 2dp

* Update tests to work with Lat Long 2dp

* Update tests to work with Lat Long 2dp

* Update tests to work with Lat Long 2dp

---------

Co-authored-by: Michal Kleiner <michal@innocraft.com>
Co-authored-by: Stefan Giehl <stefan@matomo.org>
2025-03-25 16:39:24 +01:00

199 خطوط
6.5 KiB
PHP

<?php
/**
* Matomo - free/libre analytics platform
*
* @link https://matomo.org
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
namespace Piwik\Plugins\GeoIp2\tests\Integration;
use Piwik\Config;
use Piwik\Container\StaticContainer;
use Piwik\Plugins\GeoIp2\LocationProvider\GeoIp2;
use Piwik\Plugins\UserCountry\LocationProvider\DefaultProvider;
use Piwik\Plugins\UserCountry\VisitorGeolocator;
use Piwik\Tests\Framework\Fixture;
/**
* @group GeoIp2
*/
class LocationProviderTest extends \PHPUnit\Framework\TestCase
{
public function testGeoIP2City()
{
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => []]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->assertEquals([
'continent_name' => 'Europe',
'continent_code' => 'EU',
'country_code' => 'FR',
'country_name' => 'France',
'city_name' => 'Besançon',
'lat' => 47.25,
'long' => 6.02,
'postal_code' => '25000',
'region_code' => 'BFC',
'region_name' => 'Bourgogne-Franche-Comte',
], $result);
}
public function testGeoIP2CityWithoutRegionIsoCode()
{
// The IP 99.99.99.99 will only return a region name, based on that the region code should be determined
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => []]);
$result = $locationProvider->getLocation(['ip' => '99.99.99.99']);
$this->assertEquals([
'continent_name' => 'North America',
'continent_code' => 'NA',
'country_code' => 'US',
'country_name' => 'United States',
'city_name' => 'Englewood Cliffs',
'lat' => 40.89,
'long' => -73.95,
'postal_code' => null,
'region_code' => 'NJ',
'region_name' => 'New Jersey',
], $result);
}
public function testGeoIP2CityWithIncorrectlyPrefixedRegionIsoCode()
{
// The IP 88.88.88.88 will return a region code that is prefixed with the country code, e.g. US-NJ instead of NJ
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => []]);
$result = $locationProvider->getLocation(['ip' => '88.88.88.88']);
$this->assertEquals([
'continent_name' => 'North America',
'continent_code' => 'NA',
'country_code' => 'US',
'country_name' => 'United States',
'city_name' => 'Englewood Cliffs',
'lat' => 40.89,
'long' => -73.95,
'postal_code' => null,
'region_code' => 'NJ',
'region_name' => 'New Jersey',
], $result);
}
public function testGeoIP2Country()
{
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-Country.mmdb'], 'isp' => []]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->assertEquals([
'continent_name' => 'Europe',
'continent_code' => 'EU',
'country_code' => 'FR',
'country_name' => 'France',
], $result);
}
public function testGeoIP2ASN()
{
$locationProvider = new GeoIp2\Php(['loc' => [], 'isp' => ['GeoLite2-ASN.mmdb']]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->assertEquals([
'isp' => 'Matomo Internet',
'org' => 'Matomo Internet',
], $result);
}
public function testGeoIP2ISP()
{
$locationProvider = new GeoIp2\Php(['loc' => [], 'isp' => ['GeoIP2-ISP.mmdb']]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->assertEquals([
'isp' => 'Matomo Internet',
'org' => 'Innocraft'
], $result);
}
public function testGeoIP2ISPWhenIspDisabledIspNotReturnsAnyResult()
{
$this->setIspEnabled(false);
$locationProvider = new GeoIp2\Php(['loc' => [], 'isp' => ['GeoIP2-ISP.mmdb']]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->setIspEnabled(true);
$this->assertFalse($result);
}
public function testGeoIP2ISPWhenIspDisabledLocStillReturnsResult()
{
$this->setIspEnabled(false);
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-Country.mmdb'], 'isp' => []]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->setIspEnabled(true);
$this->assertNotEmpty($result);
}
private function setIspEnabled($enabled)
{
StaticContainer::getContainer()->set('geopip2.ispEnabled', $enabled);
}
public function testGeoIP2CityAndISP()
{
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => ['GeoIP2-ISP.mmdb']]);
$result = $locationProvider->getLocation(['ip' => '194.57.91.215']);
$this->assertEquals([
'continent_name' => 'Europe',
'continent_code' => 'EU',
'country_code' => 'FR',
'country_name' => 'France',
'city_name' => 'Besançon',
'lat' => 47.25,
'long' => 6.02,
'postal_code' => '25000',
'region_code' => 'BFC',
'region_name' => 'Bourgogne-Franche-Comte',
'isp' => 'Matomo Internet',
'org' => 'Innocraft'
], $result);
}
public function testGeoIP2NoResultFallback()
{
Fixture::loadAllTranslations();
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => []]);
$geolocator = new VisitorGeolocator($locationProvider, new DefaultProvider());
$result = $geolocator->getLocation(['ip' => '221.0.0.9', 'lang' => 'de-ch'], false);
$this->assertEquals([
'country_code' => 'ch',
'country_name' => 'Switzerland',
'continent_code' => 'eur',
'continent_name' => 'Europe',
], $result);
}
public function testGeoIP2NoResultFallbackDisabled()
{
Fixture::loadAllTranslations();
Config::getInstance()->Tracker['enable_default_location_provider'] = 0;
$locationProvider = new GeoIp2\Php(['loc' => ['GeoIP2-City.mmdb'], 'isp' => []]);
$geolocator = new VisitorGeolocator($locationProvider);
$result = $geolocator->getLocation(['ip' => '221.0.0.9', 'lang' => 'de-ch'], false);
$this->assertEquals([
'country_code' => 'xx',
], $result);
}
}