Action schedule API modifications
[civicrm-core.git] / tests / phpunit / api / v3 / CustomFieldTest.php
index 4d46010dc19ab324221298e0f9025a99af8d38e4..1ebbfac91cd85851548ca7790555f37b18eed583 100644 (file)
@@ -1,8 +1,7 @@
 <?php
-
 /*
  +--------------------------------------------------------------------+
-| CiviCRM version 4.3                                                |
+| CiviCRM version 4.4                                                |
 +--------------------------------------------------------------------+
 | Copyright CiviCRM LLC (c) 2004-2013                                |
 +--------------------------------------------------------------------+
@@ -67,8 +66,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
   function testCustomFieldCreateNoArray() {
     $fieldParams = NULL;
 
-    $customField = civicrm_api('custom_field', 'create', $fieldParams);
-    $this->assertEquals($customField['is_error'], 1);
+    $customField = $this->callAPIFailure('custom_field', 'create', $fieldParams);
     $this->assertEquals($customField['error_message'], 'Input variable `params` is not an array');
   }
 
@@ -76,7 +74,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * check with no label
    */
   function testCustomFieldCreateWithoutLabel() {
-    $customGroup = $this->customGroupCreate('Individual', 'text_test_group', 3);
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'text_test_group'));
     $params = array(
       'custom_group_id' => $customGroup['id'],
       'name' => 'test_textfield2',
@@ -87,11 +85,9 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_required' => 1,
       'is_searchable' => 0,
       'is_active' => 1,
-      'version' => $this->_apiversion,
     );
 
-    $customField = civicrm_api('custom_field', 'create', $params);
-    $this->assertEquals($customField['is_error'], 1);
+    $customField = $this->callAPIFailure('custom_field', 'create', $params);
     $this->assertEquals($customField['error_message'], 'Mandatory key(s) missing from params array: label');
   }
 
@@ -99,7 +95,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * check with edit
    */
   function testCustomFieldCreateWithEdit() {
-    $customGroup = $this->customGroupCreate('Individual', 'text_test_group', 3);
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'text_test_group'));
     $params = array(
       'custom_group_id' => $customGroup['id'],
       'name' => 'test_textfield2',
@@ -111,14 +107,12 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_required' => 1,
       'is_searchable' => 0,
       'is_active' => 1,
-      'version' => $this->_apiversion,
     );
 
-    $customField  = civicrm_api('custom_field', 'create', $params);
+    $customField  = $this->callAPIAndDocument('custom_field', 'create', $params, __FUNCTION__, __FILE__);
     $params['id'] = $customField['id'];
-    $customField  = civicrm_api('custom_field', 'create', $params);
+    $customField  = $this->callAPISuccess('custom_field', 'create', $params);
 
-    $this->assertEquals($customField['is_error'], 0, 'in line ' . __LINE__);
     $this->assertNotNull($customField['id'], 'in line ' . __LINE__);
   }
 
@@ -136,11 +130,10 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_required' => 1,
       'is_searchable' => 0,
       'is_active' => 1,
-      'version' => $this->_apiversion,
+
     );
 
-    $customField = civicrm_api('custom_field', 'create', $fieldParams);
-    $this->assertEquals($customField['is_error'], 1);
+    $customField = $this->callAPIFailure('custom_field', 'create', $fieldParams);
     $this->assertEquals($customField['error_message'], 'Mandatory key(s) missing from params array: custom_group_id');
   }
 
@@ -148,7 +141,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * Check for Each data type: loop through available form input types
    **/
   function testCustomFieldCreateAllAvailableFormInputs() {
-    $gid = $this->customGroupCreate('Individual', 'testAllFormInputs');
+    $gid = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'testAllFormInputs'));
 
     $dtype = CRM_Core_BAO_CustomField::dataType();
     $htype = CRM_Core_BAO_CustomField::dataToHtml();
@@ -166,8 +159,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
  * Can't figure out the point of this?
  */
   function _loopingCustomFieldCreateTest($params) {
-    $customField = civicrm_api('custom_field', 'create', $params);
-    $this->assertEquals(0, $customField['is_error'], var_export($customField, TRUE));
+    $customField = $this->callAPISuccess('custom_field', 'create', $params);
     $this->assertNotNull($customField['id']);
     $this->getAndCheck($params, $customField['id'], 'CustomField');
   }
@@ -199,7 +191,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_required' => 0,
       'is_searchable' => 0,
       'is_active' => 1,
-      'version' => $this->_apiversion,
+
     );
   }
 
@@ -221,7 +213,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * check with data type - Options with option_values
    */
   function testCustomFieldCreateWithEmptyOptionGroup() {
-    $customGroup = $this->customGroupCreate('Contact', 'select_test_group', 3);
+    $customGroup = $this->customGroupCreate(array('extends' => 'Contact', 'title' => 'select_test_group'));
     $params = array(
       'custom_group_id' => $customGroup['id'],
       'label' => 'Country',
@@ -231,24 +223,21 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_required' => 1,
       'is_searchable' => 0,
       'is_active' => 1,
-      'version' => $this->_apiversion,
     );
 
-    $customField = civicrm_api('custom_field', 'create', $params);
-    $this->assertAPISuccess($customField);
+    $customField = $this->callAPISuccess('custom_field', 'create', $params);
     $this->assertNotNull($customField['id']);
-    $optionGroupID = civicrm_api('custom_field', 'getvalue', array(
-      'version' => 3,
+    $optionGroupID = $this->callAPISuccess('custom_field', 'getvalue', array(
       'id' => $customField['id'],
       'return' => 'option_group_id',
     ));
 
     $this->assertTrue(is_numeric($optionGroupID) && ($optionGroupID > 0));
-    $optionGroup = civicrm_api('option_group', 'getsingle', array(
-      'version' => 3, 'id' => $optionGroupID));
+    $optionGroup = $this->callAPISuccess('option_group', 'getsingle', array(
+      'id' => $optionGroupID));
     $this->assertEquals($optionGroup['title'],'Country');
-    $optionValueCount = civicrm_api('option_value', 'getcount', array(
-      'version' => 3, 'option_group_id' => $optionGroupID));
+    $optionValueCount = $this->callAPISuccess('option_value', 'getcount', array(
+      'option_group_id' => $optionGroupID));
     $this->assertEquals(0, $optionValueCount);
   }
 
@@ -257,11 +246,10 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * Test custom field get works & return param works
    */
   function testCustomFieldGetReturnOptions(){
-    $customGroup = $this->customGroupCreate('Individual', 'test_group');
-    $customField = $this->customFieldCreate($customGroup['id'], 'test_name');
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'test_group'));
+    $customField = $this->customFieldCreate(array('custom_group_id' => $customGroup['id']));
 
-    $result = civicrm_api('custom_field', 'getsingle', array(
-      'version' => 3,
+    $result = $this->callAPISuccess('custom_field', 'getsingle', array(
       'id' => $customField['id'],
       'return' => 'data_type',
     ));
@@ -273,12 +261,11 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * Test custom field get works & return param works
    */
   function testCustomFieldGetReturnArray(){
-    $customGroup = $this->customGroupCreate('Individual', 'test_group');
-    $customField = $this->customFieldCreate($customGroup['id'], 'test_name');
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'test_group'));
+    $customField = $this->customFieldCreate(array('custom_group_id' => $customGroup['id']));
 
-    $result = civicrm_api('custom_field', 'getsingle', array(
-      'version' => 3,
-      'id' => $customField['id'],
+    $result = $this->callAPISuccess('custom_field', 'getsingle', array(
+           'id' => $customField['id'],
       'return' => array('data_type'),
     ));
     $this->assertTrue(array_key_exists('data_type', $result));
@@ -289,12 +276,11 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * Test custom field get works & return param works
    */
   function testCustomFieldGetReturnTwoOptions(){
-    $customGroup = $this->customGroupCreate('Individual', 'test_group');
-    $customField = $this->customFieldCreate($customGroup['id'], 'test_name');
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'test_group'));
+    $customField = $this->customFieldCreate(array('custom_group_id' => $customGroup['id']));
 
-    $result = civicrm_api('custom_field', 'getsingle', array(
-      'version' => 3,
-      'id' => $customField['id'],
+    $result = $this->callAPISuccess('custom_field', 'getsingle', array(
+           'id' => $customField['id'],
       'return' => 'data_type, custom_group_id',
     ));
     $this->assertTrue(array_key_exists('data_type', $result));
@@ -303,7 +289,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
   }
 
   function testCustomFieldCreateWithOptionValues() {
-    $customGroup = $this->customGroupCreate('Contact', 'select_test_group', 3);
+    $customGroup = $this->customGroupCreate(array('extends' => 'Contact', 'title' => 'select_test_group'));
 
     $option_values = array(
       array('weight' => 1,
@@ -329,33 +315,29 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
       'is_searchable' => 0,
       'is_active' => 1,
       'option_values' => $option_values,
-      'version' => $this->_apiversion,
+
     );
 
-    $customField = civicrm_api('custom_field', 'create', $params);
+    $customField = $this->callAPISuccess('custom_field', 'create', $params);
 
     $this->assertAPISuccess($customField);
     $this->assertNotNull($customField['id']);
     $getFieldsParams = array(
       'options' => array('get_options' => 'custom_' . $customField['id']),
-      'version' => 3,
-      'action' => 'create',
+           'action' => 'create',
     );
     $description  = "Demonstrate retrieving metadata with custom field options";
     $subfile = "GetFieldsOptions";
-    $fields = civicrm_api('contact', 'getfields', $getFieldsParams);
-    $this->documentMe($getFieldsParams, $fields, __FUNCTION__, 'ContactTest.php', $description,$subfile,'GetFields');
+    $fields = $this->callAPIAndDocument('contact', 'getfields', $getFieldsParams, __FUNCTION__, 'ContactTest.php', $description,$subfile,'GetFields');
     $this->assertArrayHasKey('options', $fields['values']['custom_' . $customField['id']]);
     $this->assertEquals('Label1', $fields['values']['custom_' . $customField['id']]['options'][1]);
     $getOptionsArray = array(
       'field' => 'custom_' . $customField['id'],
-      'version' => 3,
-    );
+         );
     $description = "Demonstrates retrieving options for a custom field";
     $subfile = "GetOptions";
-    $result = civicrm_api('contact', 'getoptions', $getOptionsArray);
+    $result = $this->callAPIAndDocument('contact', 'getoptions', $getOptionsArray, __FUNCTION__, 'ContactTest.php', $description, '', 'getoptions');
     $this->assertEquals('Label1', $result['values'][1]);
-    $this->documentMe($getOptionsArray, $result, __FUNCTION__, 'ContactTest.php', $description, '', 'getoptions');
   }
 
   ///////////////// civicrm_custom_field_delete methods
@@ -365,8 +347,7 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    */
   function testCustomFieldDeleteNoArray() {
     $params = NULL;
-    $customField = civicrm_api('custom_field', 'delete', $params);
-    $this->assertEquals($customField['is_error'], 1);
+    $customField = $this->callAPIFailure('custom_field', 'delete', $params);
     $this->assertEquals($customField['error_message'], 'Input variable `params` is not an array');
   }
 
@@ -374,44 +355,103 @@ class api_v3_CustomFieldTest extends CiviUnitTestCase {
    * check without Field ID
    */
   function testCustomFieldDeleteWithoutFieldID() {
-    $params = array('version' => $this->_apiversion);
-    $customField = civicrm_api('custom_field', 'delete', $params);
-    $this->assertEquals($customField['is_error'], 1);
-    $this->assertEquals($customField['error_message'], 'Mandatory key(s) missing from params array: id');
+    $params = array();
+    $customField = $this->callAPIFailure('custom_field', 'delete', $params,
+      'Mandatory key(s) missing from params array: id');
   }
 
   /**
    * check without valid array
    */
   function testCustomFieldDelete() {
-    $customGroup = $this->customGroupCreate('Individual', 'test_group');
-    $customField = $this->customFieldCreate($customGroup['id'], 'test_name');
+    $customGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'test_group'));
+    $customField = $this->customFieldCreate(array('custom_group_id' => $customGroup['id']));
     $this->assertNotNull($customField['id'], 'in line ' . __LINE__);
 
     $params = array(
-      'version' => $this->_apiversion,
       'id' => $customField['id'],
     );
-    $result = civicrm_api('custom_field', 'delete', $params);
-    $this->documentMe($params, $result, __FUNCTION__, __FILE__);
+    $result = $this->callAPIAndDocument('custom_field', 'delete', $params, __FUNCTION__, __FILE__);
 
-    $this->assertEquals($result['is_error'], 0, 'in line ' . __LINE__);
+    $this->assertAPISuccess($result, 'in line ' . __LINE__);
   }
 
   /**
    * check for Option Value
    */
   function testCustomFieldOptionValueDelete() {
-    $customGroup = $this->customGroupCreate('Contact', 'ABC');
+    $customGroup = $this->customGroupCreate(array('extends' => 'Contact', 'title' => 'ABC'));
     $customOptionValueFields = $this->customFieldOptionValueCreate($customGroup, 'fieldABC');
-    $customOptionValueFields['version'] = $this->_apiversion;
     $params = array(
-      'version' => $this->_apiversion,
       'id' => $customOptionValueFields,
     );
 
-    $customField = civicrm_api('custom_field', 'delete', $customOptionValueFields);
-    $this->assertAPISuccess($customField);
+    $customField = $this->callAPISuccess('custom_field', 'delete', $customOptionValueFields);
+  }
+
+  /**
+   * If there's one custom group for "Contact" and one for "Activity", then "Contact.getfields"
+   * and "Activity.getfields" should return only their respective fields (not the other's fields),
+   * and unrelated entities should return no custom fields.
+   */
+  function testGetfields_CrossEntityPollution() {
+    $auxEntities = array('Email', 'Address', 'LocBlock', 'Membership', 'ContributionPage', 'ReportInstance');
+    $allEntities = array_merge(array('Contact', 'Activity'), $auxEntities);
+
+    // Baseline - getfields doesn't reporting any customfields for any entities
+    foreach ($allEntities as $entity) {
+      $this->assertEquals(
+        array(),
+        $this->getCustomFieldKeys($this->callAPISuccess($entity, 'getfields', array())),
+        "Baseline custom fields for $entity should be empty"
+      );
+    }
+
+    // Add some fields
+    $contactGroup = $this->customGroupCreate(array('extends' => 'Contact', 'title' => 'test_group_c'));
+    $contactField = $this->customFieldCreate(array('custom_group_id' => $contactGroup['id'], 'label' => 'For Contacts'));
+    $indivGroup = $this->customGroupCreate(array('extends' => 'Individual', 'title' => 'test_group_i'));
+    $indivField = $this->customFieldCreate(array('custom_group_id' => $indivGroup['id'], 'label' => 'For Individuals'));
+    $activityGroup = $this->customGroupCreate(array('extends' => 'Activity', 'title' => 'test_group_a'));
+    $activityField = $this->customFieldCreate(array('custom_group_id' => $activityGroup['id'], 'label' => 'For Activities'));
+
+    // Check getfields
+    $this->assertEquals(
+      array('custom_' . $contactField['id'], 'custom_' . $indivField['id']),
+      $this->getCustomFieldKeys($this->callAPISuccess('Contact', 'getfields', array())),
+      'Contact custom fields'
+    );
+    $this->assertEquals(
+      array('custom_' . $contactField['id'], 'custom_' . $indivField['id']),
+      $this->getCustomFieldKeys($this->callAPISuccess('Individual', 'getfields', array())),
+      'Individual custom fields'
+    );
+    $this->assertEquals(
+      array('custom_' . $contactField['id']),
+      $this->getCustomFieldKeys($this->callAPISuccess('Organization', 'getfields', array())),
+      'Organization custom fields'
+    );
+    $this->assertEquals(
+      array('custom_' . $activityField['id']),
+      $this->getCustomFieldKeys($this->callAPISuccess('Activity', 'getfields', array())),
+      'Activity custom fields'
+    );
+    foreach ($auxEntities as $entity) {
+      $this->assertEquals(
+        array(),
+        $this->getCustomFieldKeys($this->callAPISuccess($entity, 'getfields', array())),
+        "Custom fields for $entity should be empty"
+      );
+    }
+  }
+
+  function getCustomFieldKeys($getFieldsResult) {
+    $isCustom = function($key) {
+      return preg_match('/^custom_/', $key);
+    };
+    $r = array_values(array_filter(array_keys($getFieldsResult['values']), $isCustom));
+    sort($r);
+    return $r;
   }
 }