Files
ladill-link/tests/Unit/LinkGeoResolverTest.php
isaaccladandCursor 344bf76391
Deploy Ladill Link / deploy (push) Successful in 39s
Add GeoIP country fallback for link click analytics.
Resolve countries from CDN headers first, then MaxMind GeoLite2 via visitor IP, with an artisan command to download and refresh the database.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 23:36:01 +00:00

63 lines
1.7 KiB
PHP

<?php
namespace Tests\Unit;
use App\Support\Link\LinkGeoResolver;
use Illuminate\Http\Request;
use Tests\TestCase;
class LinkGeoResolverTest extends TestCase
{
protected function setUp(): void
{
parent::setUp();
LinkGeoResolver::resetReader();
config(['link.geoip_database' => base_path('tests/fixtures/GeoLite2-Country-Test.mmdb')]);
}
protected function tearDown(): void
{
LinkGeoResolver::resetReader();
parent::tearDown();
}
public function test_prefers_proxy_country_header_over_ip_lookup(): void
{
$request = Request::create('/', 'GET', server: [
'REMOTE_ADDR' => '81.2.69.142',
'HTTP_CF_IPCOUNTRY' => 'GH',
]);
$this->assertSame('GH', LinkGeoResolver::countryCode($request));
}
public function test_resolves_country_from_public_ip_when_header_missing(): void
{
$request = Request::create('/', 'GET', server: [
'REMOTE_ADDR' => '81.2.69.142',
]);
$this->assertSame('GB', LinkGeoResolver::countryCode($request));
}
public function test_ignores_private_ips(): void
{
$this->assertNull(LinkGeoResolver::countryFromIp('127.0.0.1'));
$this->assertNull(LinkGeoResolver::countryFromIp('10.0.0.4'));
}
public function test_returns_null_when_geoip_database_is_missing(): void
{
config(['link.geoip_database' => storage_path('app/geoip/missing.mmdb')]);
LinkGeoResolver::resetReader();
$request = Request::create('/', 'GET', server: [
'REMOTE_ADDR' => '81.2.69.142',
]);
$this->assertNull(LinkGeoResolver::countryCode($request));
}
}