Contact/BAO/Query.php: fix searching for whitespace
authornirodaonline <malmeida287@gmail.com>
Fri, 12 Nov 2021 15:55:17 +0000 (16:55 +0100)
committerColeman Watts <coleman@civicrm.org>
Sat, 11 Dec 2021 20:51:57 +0000 (15:51 -0500)
Condition was never true

Add Unit test for space wildcard replacement on sort_name

fix failing test

CRM/Contact/BAO/Query.php
tests/phpunit/CRM/Contact/BAO/QueryTest.php
tests/phpunit/api/v3/ContactTest.php

index 54e6c641e25bec41b1a45a88afb21276a2288f2c..09281671fc6dae428c8156b3801c0249090c2302 100644 (file)
@@ -3478,7 +3478,7 @@ WHERE  $smartGroupClause
     // Replace spaces with wildcards for a LIKE operation
     // UNLESS string contains a comma (this exception is a tiny bit questionable)
     // Also need to check if there is space in between sort name.
-    elseif ($op == 'LIKE' && strpos($value, ',') === FALSE && strpos($value, ' ') === TRUE) {
+    elseif ($op == 'LIKE' && strpos($value, ',') === FALSE && strpos($value, ' ') !== FALSE) {
       $value = str_replace(' ', '%', $value);
     }
     $value = CRM_Core_DAO::escapeString(trim($value));
index 82e1f779414afc6fd835e016a09d5cb67b0ce780..cbd75314e584b51dca38eb057efe3f99564abc86 100644 (file)
@@ -1376,4 +1376,33 @@ civicrm_relationship.is_active = 1 AND
     $this->assertEquals('Smith', $rows[0]['last_name']);
   }
 
+  /**
+   * Tests if a space is replaced by the wildcard on sort_name when operation is 'LIKE' and there is no comma
+   *
+   * CRM-22060 fix if condition
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public function testReplaceSpaceByWildcardCondition() {
+    //Check for wildcard
+    $params = [
+      0 => [
+        0 => 'sort_name',
+        1 => 'LIKE',
+        2 => 'John Doe',
+        3 => 0,
+        4 => 1,
+      ],
+    ];
+    $query = new CRM_Contact_BAO_Query($params);
+    list($select, $from, $where) = $query->query();
+    $this->assertStringContainsString("contact_a.sort_name LIKE '%John%Doe%'", $where);
+
+    //Check for NO wildcard due to comma
+    $params[0][2] = 'Doe, John';
+    $query = new CRM_Contact_BAO_Query($params);
+    list($select, $from, $where) = $query->query();
+    $this->assertStringContainsString("contact_a.sort_name LIKE '%Doe, John%'", $where);
+  }
+
 }
index af6e0df138917e8d9b46ffe5601b846e396a5e0c..040ef4ad3272b898e6175512fd4e70ebf6d83d59 100644 (file)
@@ -2275,7 +2275,8 @@ class api_v3_ContactTest extends CiviUnitTestCase {
     $this->individualCreate($contactParams_2);
 
     $result = $this->callAPISuccess('contact', 'get', ['sort_name' => 'Blackwell F']);
-    $this->assertEquals(1, $result['count']);
+    // Since #22060 we expect both results as space is being replaced with wildcard
+    $this->assertEquals(2, $result['count']);
   }
 
   /**