ebs/tests/Unit/Geocoder/GeoProviderTest.php
2023-12-21 08:49:38 +01:00

70 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Tests\Unit\Geocoder;
use App\Geocoder\Adapter\NominatimToAddressAdapter;
use App\Geocoder\GeoProvider;
use Geocoder\Exception\InvalidServerResponse;
use Geocoder\Model\AddressCollection;
use Geocoder\Model\AdminLevelCollection;
use Geocoder\Model\Coordinates;
use Geocoder\Provider\Nominatim\Model\NominatimAddress;
use Geocoder\Provider\Provider;
use PHPUnit\Framework\TestCase;
/**
* Complete code coverage because we have mocked the geocoder HTTP calls to avoid
* making the CI unstable.
*/
final class GeoProviderTest extends TestCase
{
public function testServerException(): void
{
$nominatimGeocoder = $this->getMockBuilder(Provider::class)
->disableOriginalConstructor()
->getMock();
$nominatimGeocoder->method('geocodeQuery')
->willThrowException(new InvalidServerResponse());
$geoProvider = new GeoProvider($nominatimGeocoder, new NominatimToAddressAdapter());
$this->expectException(\RuntimeException::class);
$this->expectExceptionMessage('Unable to get geoloc');
$geoProvider->getAddressCollection('foo', 1);
}
public function testEmptyCollectionSuccess(): void
{
$nominatimGeocoder = $this->getMockBuilder(Provider::class)
->disableOriginalConstructor()
->getMock();
$nominatimGeocoder->method('geocodeQuery')
->willReturn(new AddressCollection());
$geoProvider = new GeoProvider($nominatimGeocoder, new NominatimToAddressAdapter());
self::assertNull($geoProvider->getAddress('foo'));
}
public function testGetAddressSuccess(): void
{
$nominatimAddress = new NominatimAddress(
providedBy: 'mock',
adminLevels: new AdminLevelCollection(),
coordinates: new Coordinates(50.63, 3.01),
locality: 'Lille',
);
$nominatimAddress = $nominatimAddress
->withOSMId(6576374058)
->withOSMType('node');
$addressCollection = new AddressCollection([$nominatimAddress]);
$nominatimGeocoder = $this->getMockBuilder(Provider::class)
->disableOriginalConstructor()
->getMock();
$nominatimGeocoder->method('geocodeQuery')
->willReturn($addressCollection);
$geoProvider = new GeoProvider($nominatimGeocoder, new NominatimToAddressAdapter());
self::assertNotNull($geoProvider->getAddress('Lille'));
}
}