X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fapi%2Fv3%2FCustomValueTest.php;h=b1fa3cb66d008394a3d938377a8ec854e018a82f;hb=0170d873c6d5339ebec21231af439068ec201b4e;hp=75640cbd1dab293e46e3ca38672acaa7c324349b;hpb=a6d226f4a46ebf777a76f3fbac4077cc8a7c32eb;p=civicrm-core.git diff --git a/tests/phpunit/api/v3/CustomValueTest.php b/tests/phpunit/api/v3/CustomValueTest.php index 75640cbd1d..b1fa3cb66d 100644 --- a/tests/phpunit/api/v3/CustomValueTest.php +++ b/tests/phpunit/api/v3/CustomValueTest.php @@ -1,7 +1,7 @@ _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]); + } + }