CRM-19543 - Fix integer 0 matching for api pseudoconstants
authorColeman Watts <coleman@civicrm.org>
Tue, 25 Oct 2016 19:20:49 +0000 (15:20 -0400)
committerColeman Watts <coleman@civicrm.org>
Tue, 25 Oct 2016 20:27:48 +0000 (16:27 -0400)
api/v3/utils.php
tests/phpunit/api/v3/GrantTest.php

index ba7393aebab34fc8c7aaf964e93d77812fdd73a6..38071aa2c435bf081ba5447c8c2c58c3d327cfb8 100644 (file)
@@ -2172,7 +2172,7 @@ function _civicrm_api3_validate_integer(&$params, &$fieldName, &$fieldInfo, $ent
     return;
   }
 
-  if (!empty($fieldValue)) {
+  if (!empty($fieldValue) || $fieldValue === '0' || $fieldValue === 0) {
     // if value = 'user_contact_id' (or similar), replace value with contact id
     if (!is_numeric($fieldValue) && is_scalar($fieldValue)) {
       $realContactId = _civicrm_api3_resolve_contactID($fieldValue);
@@ -2390,7 +2390,8 @@ function _civicrm_api3_api_match_pseudoconstant_value(&$value, $options, $fieldN
   }
 
   // Translate value into key
-  $newValue = array_search($value, $options);
+  // Cast $value to string to avoid a bug in array_search
+  $newValue = array_search((string) $value, $options);
   if ($newValue !== FALSE) {
     $value = $newValue;
     return;
index 2154d3b421623139a7a91aaa4c440be46d3a9ebe..605916db5f80894c53acda16c825180d73bc34db 100644 (file)
@@ -143,4 +143,27 @@ class api_v3_GrantTest extends CiviUnitTestCase {
     $this->assertEquals(0, $checkDeleted['count']);
   }
 
+  /**
+   * Test Grant status with `0` value.
+   */
+  public function testGrantWithZeroStatus() {
+    $params = array(
+      'action' => 'create',
+      'grant_type_id' => "Emergency",
+      'amount_total' => 100,
+      'contact_id' => "1",
+      'status_id' => 0,
+      'id' => 1,
+    );
+    $validation = $this->callAPISuccess('Grant', 'validate', $params);
+
+    $expectedOut = array(
+      'status_id' => array(
+        'message' => "'0' is not a valid option for field status_id",
+        'code' => "incorrect_value",
+      ),
+    );
+    $this->assertEquals($validation['values'][0], $expectedOut);
+  }
+
 }