From 367c9a2d716d5b427d9649e3e906f5f686a093cb Mon Sep 17 00:00:00 2001 From: Jitendra Purohit Date: Wed, 15 May 2019 17:27:47 +0530 Subject: [PATCH] dev/core#961 - Contribution page including 2 email fields does not respect dedupe rule. --- CRM/Dedupe/Finder.php | 3 ++- tests/phpunit/CRM/Dedupe/DedupeFinderTest.php | 24 ++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/CRM/Dedupe/Finder.php b/CRM/Dedupe/Finder.php index 7b6c936e72..810a7b4c46 100644 --- a/CRM/Dedupe/Finder.php +++ b/CRM/Dedupe/Finder.php @@ -280,7 +280,8 @@ class CRM_Dedupe_Finder { $matches = []; if (preg_match('/(.*)-(Primary-[\d+])$|(.*)-(\d+|Primary)$/', $key, $matches)) { $return = array_values(array_filter($matches)); - $flat[$return[1]] = $value; + // make sure the first occurrence is kept, not the last + $flat[$return[1]] = empty($flat[$return[1]]) ? $value : $flat[$return[1]]; unset($flat[$key]); } } diff --git a/tests/phpunit/CRM/Dedupe/DedupeFinderTest.php b/tests/phpunit/CRM/Dedupe/DedupeFinderTest.php index 65a728c05c..370fd2bfc3 100644 --- a/tests/phpunit/CRM/Dedupe/DedupeFinderTest.php +++ b/tests/phpunit/CRM/Dedupe/DedupeFinderTest.php @@ -40,7 +40,7 @@ class CRM_Dedupe_DedupeFinderTest extends CiviUnitTestCase { * @throws \Exception */ public function testUnsupervisedDupes() { - // make dupe checks based on based on following contact sets: + // make dupe checks based on following contact sets: // FIRST - LAST - EMAIL // --------------------------------- // robin - hood - robin@example.com @@ -58,6 +58,28 @@ class CRM_Dedupe_DedupeFinderTest extends CiviUnitTestCase { $this->assertEquals(count($foundDupes), 3, 'Check Individual-Fuzzy dupe rule for dupesInGroup().'); } + /** + * Test duplicate contact retrieval with 2 email fields. + */ + public function testUnsupervisedWithTwoEmailFields() { + $this->setupForGroupDedupe(); + $emails = [ + ['hood@example.com', ''], + ['', 'hood@example.com'], + ]; + for ($i = 0; $i < 2; $i++) { + $fields = [ + 'first_name' => 'robin', + 'last_name' => 'hood', + 'email-1' => $emails[$i][0], + 'email-2' => $emails[$i][1], + ]; + $dedupeParams = CRM_Dedupe_Finder::formatParams($fields, 'Individual'); + $dedupeResults = CRM_Dedupe_Finder::dupesByParams($dedupeParams, 'Individual'); + $this->assertEquals(count($dedupeResults), 1); + } + } + /** * Test that a rule set to is_reserved = 0 works. * -- 2.25.1