dev/core#1282, 1324 unit test for bug
authoreileen <emcnaughton@wikimedia.org>
Mon, 28 Oct 2019 08:09:29 +0000 (21:09 +1300)
committereileen <emcnaughton@wikimedia.org>
Mon, 28 Oct 2019 08:35:17 +0000 (21:35 +1300)
CRM/Core/BAO/CustomField.php
CRM/Core/BAO/UFGroup.php
api/v3/Profile.php
tests/phpunit/api/v3/ProfileTest.php

index f0687c82e7b6c9be98927877a91c07c40bc80e78..2f7910611b0e085e5f32886133f4111156367b8a 100644 (file)
@@ -159,6 +159,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     CRM_Utils_Hook::post(($op === 'add' ? 'create' : 'edit'), 'CustomField', $customField->id, $customField);
 
     CRM_Utils_System::flushCache();
+    // Flush caches is not aggressive about clearing the specific cache we know we want to clear
+    // so do it manually. Ideally we wouldn't need to clear others...
+    Civi::cache('metadata')->clear();
 
     return $customField;
   }
index fca57c0d9c8f3a72a81474dd8ae49d2027d2d329..00654a3c202ebd0d5882a5ac1921be8b39d841f1 100644 (file)
@@ -741,8 +741,8 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
    * @return mixed
    */
   protected static function getCustomFields($ctype) {
-    static $customFieldCache = [];
-    if (!isset($customFieldCache[$ctype])) {
+    $cacheKey = 'uf_group_custom_fields_' . $ctype;
+    if (!Civi::cache('metadata')->has($cacheKey)) {
       $customFields = CRM_Core_BAO_CustomField::getFieldsForImport($ctype, FALSE, FALSE, FALSE, TRUE, TRUE);
 
       // hack to add custom data for components
@@ -752,9 +752,9 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
       }
       $addressCustomFields = CRM_Core_BAO_CustomField::getFieldsForImport('Address');
       $customFields = array_merge($customFields, $addressCustomFields);
-      $customFieldCache[$ctype] = [$customFields, $addressCustomFields];
+      Civi::cache('metadata')->set($cacheKey, [$customFields, $addressCustomFields]);
     }
-    return $customFieldCache[$ctype];
+    return Civi::cache('metadata')->get($cacheKey);
   }
 
   /**
index 1d6cfe80b95ade26f32ef7d56f5b398d807cfb45..e5fe71f802e8f9281dadf1f126477811a01c155d 100644 (file)
@@ -47,8 +47,9 @@
  *   Associative array of property name/value.
  *   pairs to get profile field values
  *
- * @throws API_Exception
  * @return array
+ * @throws \CRM_Core_Exception
+ * @throws API_Exception
  */
 function civicrm_api3_profile_get($params) {
   $nonStandardLegacyBehaviour = is_numeric($params['profile_id']) ? TRUE : FALSE;
index 31e8cbf89b8b7f74264e030919551ac04c3392cc..9c9945ed6febdba98cc73cd9f33d57029fa1783a 100644 (file)
@@ -32,6 +32,7 @@
  * @group headless
  */
 class api_v3_ProfileTest extends CiviUnitTestCase {
+  use CRMTraits_Custom_CustomDataTrait;
 
   protected $_profileID = 0;
 
@@ -94,6 +95,8 @@ class api_v3_ProfileTest extends CiviUnitTestCase {
 
   /**
    * Check with success.
+   *
+   * @throws \CRM_Core_Exception
    */
   public function testProfileGet() {
     $profileFieldValues = $this->_createIndividualContact();
@@ -109,6 +112,29 @@ class api_v3_ProfileTest extends CiviUnitTestCase {
     }
   }
 
+  /**
+   * Test retrieving a profile with an address custom field in it.
+   *
+   * We are checking that there is no error.
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public function testProfileGetWithAddressCustomData() {
+    $this->_createIndividualContact();
+    $this->entity = 'Address';
+    $this->createCustomGroupWithFieldOfType(['extends' => 'Address']);
+    $this->callAPISuccess('UFField', 'create', [
+      'uf_group_id' => $this->_profileID,
+      'field_name' => $this->getCustomFieldName('text'),
+      'visibility' => 'Public Pages and Listings',
+      'label' => 'My custom field',
+      'field_type' => 'Contact',
+    ]);
+    $this->callAPISuccess('Address', 'get', ['contact_id' => $this->_contactID, 'api.Address.create' => [$this->getCustomFieldName('text') => 'my field']]);
+    $result = $this->callAPISuccess('Profile', 'get', ['profile_id' => $this->_profileID, 'contact_id' => $this->_contactID])['values'];
+    // $this->assertEquals('my field', $result[$this->getCustomFieldName('text')]);
+  }
+
   /**
    * Test getting multiple profiles.
    */