unit test fixes 4.7beta4
[civicrm-core.git] / tests / phpunit / api / v3 / CustomValueTest.php
index 75640cbd1dab293e46e3ca38672acaa7c324349b..b1fa3cb66d008394a3d938377a8ec854e018a82f 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /**
  * +--------------------------------------------------------------------+
- * | CiviCRM version 4.6                                                |
+ * | CiviCRM version 4.7                                                |
  * +--------------------------------------------------------------------+
  * | Copyright CiviCRM LLC (c) 2004-2015                                |
  * +--------------------------------------------------------------------+
@@ -39,11 +39,9 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
 
   public function setUp() {
     parent::setUp();
-
-    $this->_populateOptionAndCustomGroup();
   }
 
-  public function _populateOptionAndCustomGroup() {
+  public function _populateOptionAndCustomGroup($type = NULL) {
     $dataValues = array(
       'integer' => array(1, 2, 3),
       'number' => array(10.11, 20.22, 30.33),
@@ -52,8 +50,11 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
       'state_province' => array_rand(CRM_Core_PseudoConstant::stateProvince(FALSE, FALSE), 3),
       'date' => NULL,
       'contact' => NULL,
+      'boolean' => NULL,
     );
 
+    $dataValues = !empty($type) ? array($type => $dataValues[$type]) : $dataValues;
+
     foreach ($dataValues as $dataType => $values) {
       $this->optionGroup[$dataType] = array('values' => $values);
       if (!empty($values)) {
@@ -68,8 +69,8 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
         $this->optionGroup[$dataType]['id'] = $result['id'];
       }
       elseif ($dataType == 'contact') {
-        for ($i=0; $i < 3; $i++) {
-          $result = $this->callAPISuccess('Contact', 'create', array('contact_type' => 'Individual', 'email' => substr(sha1(rand()), 0, 7) . '@yahoo.com',));
+        for ($i = 0; $i < 3; $i++) {
+          $result = $this->callAPISuccess('Contact', 'create', array('contact_type' => 'Individual', 'email' => substr(sha1(rand()), 0, 7) . '@yahoo.com'));
           $this->optionGroup[$dataType]['values'][$i] = $result['id'];
         }
       }
@@ -88,30 +89,49 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
 
     // true tells quickCleanup to drop any tables that might have been created in the test
     $this->quickCleanup($tablesToTruncate, TRUE);
+
+    // cleanup created option group for each custom-set before running next test
+    if (!empty($this->optionGroup)) {
+      foreach ($this->optionGroup as $type => $value) {
+        if (!empty($value['id'])) {
+          $this->callAPISuccess('OptionGroup', 'delete', array('id' => $value['id']));
+        }
+      }
+    }
   }
 
   public function testCreateCustomValue() {
+    $this->_populateOptionAndCustomGroup();
+
     $customFieldDataType = CRM_Core_BAO_CustomField::dataType();
     $dataToHtmlTypes = CRM_Core_BAO_CustomField::dataToHtml();
     $count = 0;
 
     foreach ($customFieldDataType as $dataType => $label) {
       switch ($dataType) {
-        case 'Date':
-        case 'StateProvince';
+        case 'Country':
+        case 'StateProvince':
+          $this->foreignKeyChecksOff();
         case 'String':
         case 'Link':
         case 'Int':
         case 'Float':
         case 'Money':
+        case 'Date':
+        case 'Boolean':
 
+          //Based on the custom field data-type choose desired SQL operators(to test with) and basic $type
           if (in_array($dataType, array('String', 'Link'))) {
-            $validSQLOperator = array('=', '!=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', 'IS NOT NULL', 'IS NULL');
+            $validSQLOperators = array('=', '!=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', 'IS NOT NULL', 'IS NULL');
             $type = 'string';
           }
+          elseif ($dataType == 'Boolean') {
+            $validSQLOperators = array('=', '!=', 'IS NOT NULL', 'IS NULL');
+            $type = 'boolean';
+          }
           else {
             if ($dataType == 'Country') {
-              $type == 'country';
+              $type = 'country';
             }
             elseif ($dataType == 'StateProvince') {
               $type = 'state_province';
@@ -125,9 +145,10 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
             else {
               $type = $dataType == 'Int' ? 'integer' : 'number';
             }
-            $validSQLOperator = array('=', '!=', 'IN', 'NOT IN', '<=', '>=', '>', '<', 'IS NOT NULL', 'IS NULL');
+            $validSQLOperators = array('=', '!=', 'IN', 'NOT IN', '<=', '>=', '>', '<', 'IS NOT NULL', 'IS NULL');
           }
 
+          //Create custom field of $dataType and html-type $html
           foreach ($dataToHtmlTypes[$count] as $html) {
             $params = array(
               'custom_group_id' => $this->ids[$type]['custom_group_id'],
@@ -136,17 +157,18 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
               'html_type' => $html,
               'default_value' => NULL,
             );
-            if (!in_array($html, array('Text', 'TextArea')) && !in_array($dataType, array('Link', 'Date', 'ContactReference'))) {
+            if (!in_array($html, array('Text', 'TextArea')) && !in_array($dataType, array('Link', 'Date', 'ContactReference', 'Boolean'))) {
               $params += array('option_group_id' => $this->optionGroup[$type]['id']);
             }
             $customField = $this->customFieldCreate($params);
-            $this->_testCustomValue($customField['values'][$customField['id']], $validSQLOperator, $type);
+            //Now test with $validSQLOperator SQL operators against its custom value(s)
+            $this->_testCustomValue($customField['values'][$customField['id']], $validSQLOperators, $type);
           }
           $count++;
           break;
 
-          //TODO: Test case of Country fields remain as it throws foreign key contraint ONLY in test environment
         default:
+          // skipping File data-type
           $count++;
           break;
       }
@@ -183,6 +205,10 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
       $selectedValue = $this->optionGroup[$type]['values'][1];
       $notselectedValue = $this->optionGroup[$type]['values'][0];
     }
+    elseif ($type == 'boolean') {
+      $selectedValue = 1;
+      $notselectedValue = 0;
+    }
     else {
       $selectedValue = $this->optionGroup[$type]['values'][0];
       $notselectedValue = $this->optionGroup[$type]['values'][$count];
@@ -197,18 +223,15 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
 
     foreach ($sqlOps as $op) {
       $qillOp = CRM_Utils_Array::value($op, CRM_Core_SelectValues::getSearchBuilderOperators(), $op);
-      $description = "\nFind Contact where '$customField[label]' $qillOp ";
       switch ($op) {
         case '=':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => (is_array($selectedValue) ? implode(CRM_Core_DAO::VALUE_SEPARATOR, $selectedValue) : $selectedValue)));
           $this->assertEquals($contactId, $result['id']);
-          echo $description . implode("[separator]", (array) $selectedValue);
           break;
 
         case '!=':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => $notselectedValue)));
-          $this->assertEquals($contactId, $result['id']);
-          echo $description . $notselectedValue;
+          $this->assertEquals(TRUE, array_key_exists($contactId, $result['values']));
           break;
 
         case '>':
@@ -227,12 +250,10 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
           if ($op == '>') {
             $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => $lesserSelectedValue)));
             $this->assertEquals($contactId, $result['id']);
-            echo $description . $lesserSelectedValue;
           }
           elseif ($op == '<') {
             $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => $selectedValue)));
             $this->assertEquals($contactId2, $result['id']);
-            echo $description . $selectedValue;
           }
           else {
             $result = $this->callAPISuccess('Contact', 'create', array('contact_type' => 'Individual', 'email' => substr(sha1(rand()), 0, 7) . 'man3@yahoo.com'));
@@ -240,7 +261,6 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
             $this->callAPISuccess('CustomValue', 'create', array('entity_id' => $contactId3, 'custom_' . $customId => $greaterSelectedValue));
 
             $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => $selectedValue)));
-            echo $description . $selectedValue;
 
             $this->assertEquals($contactId, $result['values'][$contactId]['id']);
             if ($op == '>=') {
@@ -258,38 +278,32 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
         case 'IN':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => (array) $selectedValue)));
           $this->assertEquals($contactId, $result['id']);
-          echo $description . implode(",", (array) $selectedValue);
           break;
 
         case 'NOT IN':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => (array) $notselectedValue)));
           $this->assertEquals($contactId, $result['id']);
-          echo $description . implode(",", (array) $notselectedValue);
           break;
 
         case 'LIKE':
           $selectedValue = is_array($selectedValue) ? $selectedValue[0] : $selectedValue;
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => "%$selectedValue%")));
           $this->assertEquals($contactId, $result['id']);
-          echo $description . "%$selectedValue%";
           break;
 
         case 'NOT LIKE':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => $notselectedValue)));
           $this->assertEquals($contactId, $result['id']);
-          echo $description . "'$notselectedValue'";
           break;
 
         case 'IS NULL':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => 1)));
           $this->assertEquals(FALSE, array_key_exists($contactId, $result['values']));
-          echo $description;
           break;
 
         case 'IS NOT NULL':
           $result = $this->callAPISuccess('Contact', 'Get', array('custom_' . $customId => array($op => 1)));
           $this->assertEquals($contactId, $result['id']);
-          echo $description;
           break;
       }
     }
@@ -297,4 +311,81 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
     $this->callAPISuccess('Contact', 'delete', array('id' => $contactId));
   }
 
+  /**
+   * Ensure custom data is updated when option values are modified
+   *
+   * @link https://issues.civicrm.org/jira/browse/CRM-11856
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  public function testAlterOptionValue() {
+    $this->_populateOptionAndCustomGroup('string');
+
+    $selectField = $this->customFieldCreate(array(
+      'custom_group_id' => $this->ids['string']['custom_group_id'],
+      'label' => 'Custom Select',
+      'html_type' => 'Select',
+      'option_group_id' => $this->optionGroup['string']['id'],
+    ));
+    $selectField = civicrm_api3('customField', 'getsingle', array('id' => $selectField['id']));
+    $radioField = $this->customFieldCreate(array(
+      'custom_group_id' => $this->ids['string']['custom_group_id'],
+      'label' => 'Custom Radio',
+      'html_type' => 'Radio',
+      'option_group_id' => $selectField['option_group_id'],
+    ));
+    $multiSelectField = $this->customFieldCreate(array(
+      'custom_group_id' => $this->ids['string']['custom_group_id'],
+      'label' => 'Custom Multi-Select',
+      'html_type' => 'Multi-Select',
+      'option_group_id' => $selectField['option_group_id'],
+    ));
+    $selectName = 'custom_' . $selectField['id'];
+    $radioName = 'custom_' . $radioField['id'];
+    $multiSelectName = 'custom_' . $multiSelectField['id'];
+    $controlFieldName = 'custom_' . $this->ids['string']['custom_field_id'];
+
+    $params = array(
+      'first_name' => 'abc4',
+      'last_name' => 'xyz4',
+      'contact_type' => 'Individual',
+      'email' => 'man4@yahoo.com',
+      $selectName => $this->optionGroup['string']['values'][0],
+      $multiSelectName => $this->optionGroup['string']['values'],
+      $radioName => $this->optionGroup['string']['values'][1],
+      // The control group in a science experiment should be unaffected
+      $controlFieldName => $this->optionGroup['string']['values'][2],
+    );
+
+    $contact = $this->callAPISuccess('Contact', 'create', $params);
+
+    $result = $this->callAPISuccess('Contact', 'getsingle', array(
+      'id' => $contact['id'],
+      'return' => array($selectName, $multiSelectName),
+    ));
+    $this->assertEquals($params[$selectName], $result[$selectName]);
+    $this->assertEquals($params[$multiSelectName], $result[$multiSelectName]);
+
+    $this->callAPISuccess('OptionValue', 'create', array(
+      'value' => 'one-modified',
+      'option_group_id' => $selectField['option_group_id'],
+      'name' => 'string 1',
+      'options' => array(
+        'match-mandatory' => array('option_group_id', 'name'),
+      ),
+    ));
+
+    $result = $this->callAPISuccess('Contact', 'getsingle', array(
+      'id' => $contact['id'],
+      'return' => array($selectName, $multiSelectName, $controlFieldName, $radioName),
+    ));
+    // Ensure the relevant fields have been updated
+    $this->assertEquals('one-modified', $result[$selectName]);
+    $this->assertEquals(array('one-modified', $params[$radioName], $params[$controlFieldName]), $result[$multiSelectName]);
+    // This field should not have changed because we didn't alter this option
+    $this->assertEquals($params[$radioName], $result[$radioName]);
+    // This should not have changed because this field doesn't use the affected option group
+    $this->assertEquals($params[$controlFieldName], $result[$controlFieldName]);
+  }
+
 }