Add in unit test of getCoordinates Address action and update TestProvider to be like...
authorSeamus Lee <seamuslee001@gmail.com>
Wed, 1 Jun 2022 01:54:31 +0000 (11:54 +1000)
committerColeman Watts <coleman@civicrm.org>
Thu, 2 Jun 2022 18:27:14 +0000 (14:27 -0400)
Fix Tear down of geoProvider setting

CRM/Utils/GeocodeProvider.php
Civi/Api4/Action/Address/GetCoordinates.php
settings/Map.setting.php
tests/phpunit/CRM/Utils/Geocode/TestProvider.php
tests/phpunit/api/v3/AddressTest.php
tests/phpunit/api/v4/Action/AddressGetCoordinatesTest.php [new file with mode: 0644]
tests/phpunit/api/v4/Entity/AddressTest.php

index 5f6a6027a61fc18e5354272c3e33d2e527454f5e..8a0acc4badfb571665733c90d3895bb2f179ce0b 100644 (file)
@@ -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();
   }
 
 }
index 4146edf4e6b2dfd684eafd2a5d3266ac9e6fdccb..bf9ad89c403a60b57a1dc7a98816c11664b3f134 100644 (file)
@@ -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;
     }
index 5dee60b77733e4f9e5352a4ddd73e0dbd1e51876..cf6af9b7acd487249a159746e5e277250ceb4fb5 100644 (file)
@@ -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.'),
index fca9ec36fbbbfbaea35a3c75e190df8659bf7300..580ffaa3186932f6c9c4d3162f5a7016c3fd4a87 100644 (file)
@@ -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 [];
   }
 
 }
index f8a55cde2aad150185df9b2244ba882c9eba764a..6ea58248e58bfdaaad2dc92bd2d870036da5031d 100644 (file)
@@ -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 (file)
index 0000000..ed0a37d
--- /dev/null
@@ -0,0 +1,56 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+
+namespace api\v4\Action;
+
+use api\v4\Api4TestBase;
+use Civi\Api4\Address;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * @group headless
+ */
+class AddressGetCoordinatesTest extends Api4TestBase implements TransactionalInterface {
+
+  public function setUp(): void {
+    parent::setUp();
+    \Civi\Api4\Setting::set()
+      ->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);
+  }
+
+}
index 087bf350637cabba18517fee842268d04731f297..c03f6a14e42c69824bc5d4ca4f4a85bbf329fbea 100644 (file)
@@ -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
    */