unit test fixes 4.7beta4
[civicrm-core.git] / tests / phpunit / api / v3 / CustomValueTest.php
index be4e17b2710603c4e8b437c4508b392735f1851b..b1fa3cb66d008394a3d938377a8ec854e018a82f 100644 (file)
@@ -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)) {
@@ -88,29 +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';
@@ -124,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'],
@@ -135,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;
 
         default:
-          //TODO: Test case of Country fields remain as it throws foreign key contraint ONLY in test environment
+          // skipping File data-type
           $count++;
           break;
       }
@@ -182,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];
@@ -196,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(TRUE, array_key_exists($contactId, $result['values']));
-          echo $description . $notselectedValue;
           break;
 
         case '>':
@@ -226,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'));
@@ -239,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 == '>=') {
@@ -257,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;
       }
     }
@@ -304,25 +319,23 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
    * @throws \CiviCRM_API3_Exception
    */
   public function testAlterOptionValue() {
+    $this->_populateOptionAndCustomGroup('string');
+
     $selectField = $this->customFieldCreate(array(
-      'custom_group_id' => $this->ids['single']['custom_group_id'],
+      'custom_group_id' => $this->ids['string']['custom_group_id'],
       'label' => 'Custom Select',
       'html_type' => 'Select',
-      'option_values' => array(
-        'one' => 'Option1',
-        'two' => 'Option2',
-        'notone' => 'OptionNotOne',
-      ),
+      '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['single']['custom_group_id'],
+      '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['single']['custom_group_id'],
+      'custom_group_id' => $this->ids['string']['custom_group_id'],
       'label' => 'Custom Multi-Select',
       'html_type' => 'Multi-Select',
       'option_group_id' => $selectField['option_group_id'],
@@ -330,18 +343,18 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
     $selectName = 'custom_' . $selectField['id'];
     $radioName = 'custom_' . $radioField['id'];
     $multiSelectName = 'custom_' . $multiSelectField['id'];
-    $controlFieldName = 'custom_' . $this->ids['single']['custom_field_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 => 'one',
-      $multiSelectName => array('one', 'two', 'notone'),
-      $radioName => 'notone',
+      $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 => 'one',
+      $controlFieldName => $this->optionGroup['string']['values'][2],
     );
 
     $contact = $this->callAPISuccess('Contact', 'create', $params);
@@ -350,13 +363,13 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
       'id' => $contact['id'],
       'return' => array($selectName, $multiSelectName),
     ));
-    $this->assertEquals('one', $result[$selectName]);
-    $this->assertEquals(array('one', 'two', 'notone'), $result[$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' => 'Option1',
+      'name' => 'string 1',
       'options' => array(
         'match-mandatory' => array('option_group_id', 'name'),
       ),
@@ -368,11 +381,11 @@ class api_v3_CustomValueTest extends CiviUnitTestCase {
     ));
     // Ensure the relevant fields have been updated
     $this->assertEquals('one-modified', $result[$selectName]);
-    $this->assertEquals(array('one-modified', 'two', 'notone'), $result[$multiSelectName]);
+    $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('notone', $result[$radioName]);
+    $this->assertEquals($params[$radioName], $result[$radioName]);
     // This should not have changed because this field doesn't use the affected option group
-    $this->assertEquals('one', $result[$controlFieldName]);
+    $this->assertEquals($params[$controlFieldName], $result[$controlFieldName]);
   }
 
 }