From 623a6eb785c879666487e72dd258bb85976c8fcc Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Wed, 1 Jun 2022 11:54:31 +1000 Subject: [PATCH] Add in unit test of getCoordinates Address action and update TestProvider to be like the Google provider change Fix Tear down of geoProvider setting --- CRM/Utils/GeocodeProvider.php | 3 +- Civi/Api4/Action/Address/GetCoordinates.php | 6 +- settings/Map.setting.php | 3 + .../CRM/Utils/Geocode/TestProvider.php | 20 ++++++- tests/phpunit/api/v3/AddressTest.php | 1 + .../v4/Action/AddressGetCoordinatesTest.php | 56 +++++++++++++++++++ tests/phpunit/api/v4/Entity/AddressTest.php | 7 +++ 7 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 tests/phpunit/api/v4/Action/AddressGetCoordinatesTest.php diff --git a/CRM/Utils/GeocodeProvider.php b/CRM/Utils/GeocodeProvider.php index 5f6a6027a6..8a0acc4bad 100644 --- a/CRM/Utils/GeocodeProvider.php +++ b/CRM/Utils/GeocodeProvider.php @@ -89,11 +89,10 @@ class CRM_Utils_GeocodeProvider { } /** - * Reset geoprovider (after it has been disabled). + * Reset geoprovider (after settting has been changed). */ public static function reset() { self::$providerClassName = NULL; - self::getUsableClassName(); } } diff --git a/Civi/Api4/Action/Address/GetCoordinates.php b/Civi/Api4/Action/Address/GetCoordinates.php index 4146edf4e6..bf9ad89c40 100644 --- a/Civi/Api4/Action/Address/GetCoordinates.php +++ b/Civi/Api4/Action/Address/GetCoordinates.php @@ -31,12 +31,12 @@ class GetCoordinates extends \Civi\Api4\Generic\AbstractAction { protected $address; public function _run(Result $result) { - $gecodingClassName = CRM_Utils_GeocodeProvider::getUsableClassName(); - $geocodingProvider = CRM_Utils_GeocodeProvider::getConfiguredProvider(); + $geocodingClassName = \CRM_Utils_GeocodeProvider::getUsableClassName(); + $geocodingProvider = \CRM_Utils_GeocodeProvider::getConfiguredProvider(); if (!is_callable([$geocodingProvider, 'getCoordinates'])) { throw new \API_Exception('Geocoding provider does not support getCoordinates'); } - $coord = \$geocodingClassName::getCoordinates($this->address); + $coord = $geocodingClassName::getCoordinates($this->address); if (isset($coord['geo_code_1'], $coord['geo_code_2'])) { $result[] = $coord; } diff --git a/settings/Map.setting.php b/settings/Map.setting.php index 5dee60b777..cf6af9b7ac 100644 --- a/settings/Map.setting.php +++ b/settings/Map.setting.php @@ -52,6 +52,9 @@ return [ 'pseudoconstant' => [ 'callback' => 'CRM_Core_SelectValues::geoProvider', ], + 'on_change' => [ + 'CRM_Utils_GeocodeProvider::reset', + ], 'default' => NULL, 'title' => ts('Geocoding Provider'), 'description' => ts('This can be the same or different from the mapping provider selected.'), diff --git a/tests/phpunit/CRM/Utils/Geocode/TestProvider.php b/tests/phpunit/CRM/Utils/Geocode/TestProvider.php index fca9ec36fb..580ffaa318 100644 --- a/tests/phpunit/CRM/Utils/Geocode/TestProvider.php +++ b/tests/phpunit/CRM/Utils/Geocode/TestProvider.php @@ -3,9 +3,25 @@ class CRM_Utils_Geocode_TestProvider { public static function format(&$values, $stateName = FALSE) { - if ($values['street_address'] == 'Does not exist') { - $values['geo_code_1'] = $values['geo_code_2'] = 'null'; + $address = ($values['street_address'] ?? '') . ($values['city'] ?? ''); + + $coord = self::getCoordinates($address); + + $values['geo_code_1'] = $coord['geo_code_1'] ?? 'null'; + $values['geo_code_2'] = $coord['geo_code_2'] ?? 'null'; + + if (isset($coord['geo_code_error'])) { + $values['geo_code_error'] = $coord['geo_code_error']; + } + + return isset($coord['geo_code_1'], $coord['geo_code_2']); + } + + public static function getCoordinates($address): array { + if (strpos($address, '600 Pennsylvania Avenue NW, Washington') === 0) { + return ['geo_code_1' => '38.897957', 'geo_code_2' => '-77.036560']; } + return []; } } diff --git a/tests/phpunit/api/v3/AddressTest.php b/tests/phpunit/api/v3/AddressTest.php index f8a55cde2a..6ea58248e5 100644 --- a/tests/phpunit/api/v3/AddressTest.php +++ b/tests/phpunit/api/v3/AddressTest.php @@ -52,6 +52,7 @@ class api_v3_AddressTest extends CiviUnitTestCase { $this->locationTypeDelete($this->_locationTypeID); $this->contactDelete($this->_contactID); $this->quickCleanup(['civicrm_address', 'civicrm_relationship']); + $this->callAPISuccess('Setting', 'create', ['geoProvider' => NULL]); parent::tearDown(); } diff --git a/tests/phpunit/api/v4/Action/AddressGetCoordinatesTest.php b/tests/phpunit/api/v4/Action/AddressGetCoordinatesTest.php new file mode 100644 index 0000000000..ed0a37ded7 --- /dev/null +++ b/tests/phpunit/api/v4/Action/AddressGetCoordinatesTest.php @@ -0,0 +1,56 @@ +addValue('geoProvider', 'TestProvider') + ->execute(); + } + + public function tearDown(): void { + parent::tearDown(); + \Civi\Api4\Setting::revert() + ->addSelect('geoProvider') + ->execute(); + } + + public function testGetCoordinatesWhiteHouse(): void { + $coordinates = Address::getCoordinates()->setAddress('600 Pennsylvania Avenue NW, Washington, DC, USA')->execute()->first(); + $this->assertEquals('38.897957', $coordinates['geo_code_1']); + $this->assertEquals('-77.036560', $coordinates['geo_code_2']); + } + + public function testGetCoordinatesNoAddress(): void { + $coorindates = Address::getCoordinates()->setAddress('Does not exist, Washington, DC, USA')->execute()->first(); + $this->assertEmpty($coorindates); + } + +} diff --git a/tests/phpunit/api/v4/Entity/AddressTest.php b/tests/phpunit/api/v4/Entity/AddressTest.php index 087bf35063..c03f6a14e4 100644 --- a/tests/phpunit/api/v4/Entity/AddressTest.php +++ b/tests/phpunit/api/v4/Entity/AddressTest.php @@ -30,6 +30,13 @@ use Civi\Test\TransactionalInterface; */ class AddressTest extends Api4TestBase implements TransactionalInterface { + public function setUp():void { + \Civi\Api4\Setting::revert() + ->addSelect('geoProvider') + ->execute(); + parent::setUp(); + } + /** * Check that 2 addresses for the same contact can't both be primary */ -- 2.25.1