geocoder-php/provider-integration-tests
Integration test suite for Geocoder PHP providers. Shared tests and fixtures to validate provider implementations and ensure consistent behavior across services, making it easier to verify compliance and prevent regressions.
Installation:
composer require geocoder-php/provider-integration-tests --dev
(Note: This is primarily a test package; install only in test environments.)
First Use Case:
tests/Feature/Geocoder/ directory.GeocoderProviderTestCase base class to bootstrap tests for your custom geocoding provider (e.g., GoogleMapsProvider, OpenStreetMapProvider).Key Files:
src/GeocoderProviderTestCase.php: Base test class with shared assertions.src/Providers/: Example provider test classes (e.g., GoogleMapsProviderTest.php).use Geocoder\Provider\GoogleMapsProvider;
use Geocoder\Provider\IntegrationTests\GeocoderProviderTestCase;
class CustomGoogleMapsProviderTest extends GeocoderProviderTestCase
{
protected function getProvider(): GoogleMapsProvider
{
return new GoogleMapsProvider('YOUR_API_KEY');
}
// Inherits assertions from GeocoderProviderTestCase
}
Test-Driven Provider Development:
GeocoderProviderTestCase to validate:
"1600 Amphitheatre Parkway, Mountain View" → {lat, lng}).{lat, lng} → formatted address).public function testGeocodeAddress()
{
$result = $this->geocode('Paris');
$this->assertNotNull($result->getCoordinates());
}
Provider-Specific Customization:
GeocoderProviderTestCase to mock API responses or adjust assertions:
protected function getExpectedCoordinatesForAddress(string $address): array
{
return ['lat' => 48.8566, 'lng' => 2.3522]; // Paris coordinates
}
CI/CD Integration:
- name: Run Geocoder Tests
run: php vendor/bin/phpunit --env API_KEY=${{ secrets.GOOGLE_MAPS_API_KEY }}
Mocking API Responses:
Use HttpMock (from geocoder-php/http-adapter-guzzle) to simulate network calls:
$this->httpMock->append(
'https://maps.googleapis.com/...',
json_encode(['results' => [...]])
);
Provider-Specific Assertions:
Add custom assertions for provider quirks (e.g., Google’s geometry.location vs. OpenStreetMap’s lat/lng):
protected function assertCoordinates(array $actual, array $expected): void
{
$this->assertEquals($expected['lat'], $actual['geometry']['location']['lat']);
}
API Key Leaks:
.env.testing or CI secrets:
$provider = new GoogleMapsProvider(env('GOOGLE_MAPS_API_KEY'));
Rate Limits:
HttpMock to bypass live API calls or implement exponential backoff.Response Schema Mismatches:
location vs. flat lat/lng).parseResponse() in your provider or extend test assertions.$provider->setLogger(new \Monolog\Logger('test', ['handler' => new \Monolog\Handler\StreamHandler('php://stdout')]));
$this->httpMock->append('...', $rawResponse);
$this->assertStringContainsString('error', $rawResponse); // Debug failures
Custom Providers:
GeocoderProviderTestCase for unsupported providers (e.g., Mapbox, TomTom):
class MapboxProviderTest extends GeocoderProviderTestCase
{
protected function getProvider(): MapboxProvider { ... }
protected function getExpectedCoordinatesForAddress(string $address): array { ... }
}
Test Data Fixtures:
setUp():
protected function loadTestData(): void
{
$this->testAddresses = [
'Paris' => ['lat' => 48.8566, 'lng' => 2.3522],
'New York' => ['lat' => 40.7128, 'lng' => -74.0060],
];
}
Performance Testing:
microtime():
$start = microtime(true);
$this->geocode('Berlin');
$this->assertLessThan(1.0, microtime(true) - $start); // <1s threshold
How can I help you explore Laravel packages today?