Files
portal/app/tests/Unit/GeoResolverTest.php
T
Дмитрий 42adebcc5b feat(visitors): определение города и оператора по офлайн-базе + признак VPN/хостинга
Гео читается из локального файла (DB-IP Lite) — IP посетителя наружу не уходит.
Нет файла базы → город не определяется, учёт продолжает работать (fail-open).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 19:32:34 +03:00

29 lines
1.3 KiB
PHP

<?php
declare(strict_types=1);
use App\Services\Tracking\GeoResolver;
// GeoResolver читает пути к базам через config() → нужен поднятый контейнер приложения.
// Юнит-набор его не поднимает, поэтому явно подключаем TestCase (БД не трогаем).
uses(Tests\TestCase::class);
test('без гео-базы возвращает пустой результат и не падает', function () {
config()->set('services.geoip.city_db', '/nope/city.mmdb');
config()->set('services.geoip.asn_db', '/nope/asn.mmdb');
$res = (new GeoResolver())->lookup('8.8.8.8');
expect($res)->toMatchArray([
'city' => null, 'region' => null, 'asn_org' => null, 'is_datacenter' => false,
]);
});
test('организация-хостинг помечается как дата-центр/VPN', function () {
expect(GeoResolver::looksLikeDatacenter('Tencent Cloud Computing'))->toBeTrue();
expect(GeoResolver::looksLikeDatacenter('DigitalOcean, LLC'))->toBeTrue();
expect(GeoResolver::looksLikeDatacenter('NordVPN'))->toBeTrue();
expect(GeoResolver::looksLikeDatacenter('Tele2 Russia'))->toBeFalse();
expect(GeoResolver::looksLikeDatacenter('Rostelecom'))->toBeFalse();
expect(GeoResolver::looksLikeDatacenter(null))->toBeFalse();
});