55 lines
1.8 KiB
PHP
55 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Support\VisitorIp;
|
|
use Illuminate\Http\Request;
|
|
use PHPUnit\Framework\Attributes\Test;
|
|
use Tests\TestCase;
|
|
|
|
class VisitorIpTest extends TestCase
|
|
{
|
|
#[Test]
|
|
public function prefers_cf_connecting_ip_over_xff_and_true_client_ip(): void
|
|
{
|
|
$request = Request::create('/', 'GET', [], [], [], [
|
|
'REMOTE_ADDR' => '104.16.1.1',
|
|
'HTTP_X_FORWARDED_FOR' => '1.2.3.4, 203.0.113.50',
|
|
'HTTP_TRUE_CLIENT_IP' => '198.51.100.9',
|
|
'HTTP_CF_CONNECTING_IP' => '203.0.113.77',
|
|
]);
|
|
|
|
$this->assertSame('203.0.113.77', VisitorIp::fromRequest($request));
|
|
}
|
|
|
|
#[Test]
|
|
public function falls_back_to_true_client_ip_then_remote_addr(): void
|
|
{
|
|
$trueClient = Request::create('/', 'GET', [], [], [], [
|
|
'REMOTE_ADDR' => '104.16.1.1',
|
|
'HTTP_X_FORWARDED_FOR' => '1.2.3.4',
|
|
'HTTP_TRUE_CLIENT_IP' => '198.51.100.9',
|
|
]);
|
|
$this->assertSame('198.51.100.9', VisitorIp::fromRequest($trueClient));
|
|
|
|
$direct = Request::create('/', 'GET', [], [], [], [
|
|
'REMOTE_ADDR' => '127.0.0.1',
|
|
]);
|
|
$this->assertSame('127.0.0.1', VisitorIp::fromRequest($direct));
|
|
}
|
|
|
|
#[Test]
|
|
public function ignores_invalid_cf_header_and_unwraps_mapped_ipv6(): void
|
|
{
|
|
$invalid = Request::create('/', 'GET', [], [], [], [
|
|
'REMOTE_ADDR' => '127.0.0.1',
|
|
'HTTP_CF_CONNECTING_IP' => 'not-an-ip',
|
|
]);
|
|
$this->assertSame('127.0.0.1', VisitorIp::fromRequest($invalid));
|
|
|
|
$this->assertSame('203.0.113.9', VisitorIp::normalize('::ffff:203.0.113.9'));
|
|
$this->assertSame('203.0.113.9', VisitorIp::normalize('203.0.113.9, 10.0.0.1'));
|
|
$this->assertSame('', VisitorIp::normalize('unknown'));
|
|
}
|
|
}
|