Projeto inicial
commit
3780c10848
@ -0,0 +1,9 @@
|
|||||||
|
### Laravel template
|
||||||
|
/vendor
|
||||||
|
storage/*.key
|
||||||
|
.env
|
||||||
|
.idea
|
||||||
|
.phpunit.result.cache
|
||||||
|
.php-cs-fixer.cache
|
||||||
|
tools/php-cs-fixer/vendor
|
||||||
|
tools/php-cs-fixer/.php_cs.cache
|
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"name": "tobias/laravel-geo",
|
||||||
|
"description": "Biblioteca para converter endereços em coordenadas geográficas (latitude e longitude) e vice-versa.",
|
||||||
|
"type": "project",
|
||||||
|
"license": "MIT",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Ae3\\LaravelGeoLayer\\": "src/",
|
||||||
|
"Ae3\\LaravelGeoLayer\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "José Tobias de Freitas Neto",
|
||||||
|
"email": "tobias@ae3tecnologia.com.br"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": "^7.4",
|
||||||
|
"laravel/framework": ">=5.8",
|
||||||
|
"spatie/geocoder": "^3.15"
|
||||||
|
},
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"Ae3\\LaravelGeoLayer\\app\\Providers\\LaravelGeoServiceProvider"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9.6",
|
||||||
|
"orchestra/testbench": "^6.41"
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<phpunit backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false">
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Unit">
|
||||||
|
<directory suffix="Test.php">./tests/Unit</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
<filter>
|
||||||
|
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||||
|
<directory suffix=".php">src</directory>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
<php>
|
||||||
|
<server name="APP_ENV" value="testing"/>
|
||||||
|
</php>
|
||||||
|
</phpunit>
|
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ae3\LaravelGeoLayer\app\Providers;
|
||||||
|
|
||||||
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
|
class LaravelGeoServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register any application services.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
$this->mergeConfigFrom(__DIR__ . '/../../config/config.php', 'laravel-geo-layer');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bootstrap any application services.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function boot()
|
||||||
|
{
|
||||||
|
if ($this->app->runningInConsole()) {
|
||||||
|
$this->publishes([
|
||||||
|
__DIR__ . '/../../config/config.php' => config_path('laravel-geo-layer.php'),
|
||||||
|
], 'config');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ae3\LaravelGeoLayer\app\Services\Contracts;
|
||||||
|
|
||||||
|
interface GeocodingServiceContract
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param string $address
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getCoordinatesForAddress(string $address): array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param float $latitude
|
||||||
|
* @param float $longitude
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAddressForCoordinates(float $latitude, float $longitude): array;
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ae3\LaravelGeoLayer\app\Services;
|
||||||
|
|
||||||
|
use Ae3\LaravelGeoLayer\app\Services\Contracts\GeocodingServiceContract;
|
||||||
|
use GuzzleHttp\Client;
|
||||||
|
use Spatie\Geocoder\Geocoder;
|
||||||
|
|
||||||
|
class GeocodingService implements GeocodingServiceContract
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Geocoder
|
||||||
|
*/
|
||||||
|
protected Geocoder $geocoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new instance of the class.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$client = new Client();
|
||||||
|
$this->geocoder = new Geocoder($client);
|
||||||
|
$this->geocoder->setApiKey(config('laravel-geo-layer.key'));
|
||||||
|
$this->geocoder->setRegion(config('laravel-geo-layer.region'));
|
||||||
|
$this->geocoder->setCountry(config('laravel-geo-layer.country'));
|
||||||
|
$this->geocoder->setBounds(config('laravel-geo-layer.bounds'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the coordinates for the given address.
|
||||||
|
*
|
||||||
|
* @param string $address The address to retrieve coordinates for.
|
||||||
|
*
|
||||||
|
* @return array An array containing the latitude and longitude coordinates.
|
||||||
|
*/
|
||||||
|
public function getCoordinatesForAddress(string $address): array
|
||||||
|
{
|
||||||
|
return $this->geocoder->getCoordinatesForAddress($address);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the address for the given coordinates.
|
||||||
|
*
|
||||||
|
* @param float $latitude The latitude of the coordinates.
|
||||||
|
* @param float $longitude The longitude of the coordinates.
|
||||||
|
*
|
||||||
|
* @return array The address information for the given coordinates.
|
||||||
|
*/
|
||||||
|
public function getAddressForCoordinates(float $latitude, float $longitude): array
|
||||||
|
{
|
||||||
|
return $this->geocoder->getAddressForCoordinates($latitude, $longitude);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
/*
|
||||||
|
* The api key used when sending Geocoding requests to Google.
|
||||||
|
*/
|
||||||
|
'key' => env('GOOGLE_MAPS_GEOCODING_API_KEY', ''),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The language param used to set response translations for textual data.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/faq#languagesupport
|
||||||
|
*/
|
||||||
|
|
||||||
|
'language' => '',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The region param used to finetune the geocoding process.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/geocoding/requests-geocoding#RegionCodes
|
||||||
|
*/
|
||||||
|
'region' => 'br',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The bounds param used to finetune the geocoding process.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/geocoding/requests-geocoding#Viewports
|
||||||
|
*/
|
||||||
|
'bounds' => 'Roraima',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The country param used to limit results to a specific country.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/javascript/geocoding#GeocodingRequests
|
||||||
|
*/
|
||||||
|
'country' => 'Brazil',
|
||||||
|
];
|
@ -0,0 +1,39 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The api key used when sending Geocoding requests to Google.
|
||||||
|
*/
|
||||||
|
'key' => env('GOOGLE_MAPS_GEOCODING_API_KEY', ''),
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The language param used to set response translations for textual data.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/faq#languagesupport
|
||||||
|
*/
|
||||||
|
|
||||||
|
'language' => '',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The region param used to finetune the geocoding process.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/geocoding/requests-geocoding#RegionCodes
|
||||||
|
*/
|
||||||
|
'region' => 'br',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The bounds param used to finetune the geocoding process.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/geocoding/requests-geocoding#Viewports
|
||||||
|
*/
|
||||||
|
'bounds' => 'Roraima',
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The country param used to limit results to a specific country.
|
||||||
|
*
|
||||||
|
* More info: https://developers.google.com/maps/documentation/javascript/geocoding#GeocodingRequests
|
||||||
|
*/
|
||||||
|
'country' => 'Brazil',
|
||||||
|
|
||||||
|
];
|
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Ae3\LaravelGeoLayer\Tests;
|
||||||
|
|
||||||
|
use Ae3\LaravelGeoLayer\app\Providers\LaravelGeoServiceProvider;
|
||||||
|
use Orchestra\Testbench\TestCase as OrchestraTestCase;
|
||||||
|
|
||||||
|
class TestCase extends OrchestraTestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $app
|
||||||
|
* @return string[]
|
||||||
|
*/
|
||||||
|
protected function getPackageProviders($app): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
LaravelGeoServiceProvider::class,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $app
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function getEnvironmentSetUp($app)
|
||||||
|
{
|
||||||
|
$app['config']->set('laravel-geo-layer.key', 'sua_chave_api');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Unit;
|
||||||
|
|
||||||
|
use Ae3\LaravelGeoLayer\app\Services\GeocodingService;
|
||||||
|
use Ae3\LaravelGeoLayer\Tests\TestCase;
|
||||||
|
use Mockery;
|
||||||
|
|
||||||
|
class GeocodingServiceTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var GeocodingService
|
||||||
|
*/
|
||||||
|
private GeocodingService $geocodingService;
|
||||||
|
|
||||||
|
private $mockedGeocoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set up the test
|
||||||
|
*/
|
||||||
|
public function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
$this->mockedGeocoder = Mockery::mock('overload:Spatie\Geocoder\Geocoder');
|
||||||
|
|
||||||
|
// Configurando o mock para esperar a chamada de setApiKey
|
||||||
|
$this->mockedGeocoder->shouldReceive('setApiKey')->once()->withAnyArgs();
|
||||||
|
$this->mockedGeocoder->shouldReceive('setRegion')->once()->withAnyArgs();
|
||||||
|
$this->mockedGeocoder->shouldReceive('setCountry')->once()->withAnyArgs();
|
||||||
|
$this->mockedGeocoder->shouldReceive('setBounds')->once()->withAnyArgs();
|
||||||
|
|
||||||
|
// Configurando o mock para esperar a chamada de getCoordinatesForAddress
|
||||||
|
$this->mockedGeocoder->shouldReceive('getCoordinatesForAddress')
|
||||||
|
->once()
|
||||||
|
->with('Brussels, Belgium')
|
||||||
|
->andReturn(['lat' => '50.85045', 'lng' => '4.34878']);
|
||||||
|
|
||||||
|
$this->geocodingService = new GeocodingService();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test getCoordinatesForAddress function
|
||||||
|
*/
|
||||||
|
public function testGetCoordinatesForAddress(): void
|
||||||
|
{
|
||||||
|
// Mocking Geocoder response
|
||||||
|
$this->mockedGeocoder->shouldReceive('getCoordinatesForAddress')
|
||||||
|
->once()
|
||||||
|
->with('Brussels, Belgium')
|
||||||
|
->andReturn(['lat' => '50.85045', 'lng' => '4.34878']);
|
||||||
|
|
||||||
|
// Testing the function
|
||||||
|
$result = $this->geocodingService->getCoordinatesForAddress('Brussels, Belgium');
|
||||||
|
$this->assertEquals(['lat' => '50.85045', 'lng' => '4.34878'], $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tear down the test
|
||||||
|
*/
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
Mockery::close();
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue