dev/core#953 Fix failure to set new emails for existing contacts to primary on import
authoreileenmcnaugton <emcnaughton@wikimedia.org>
Fri, 10 May 2019 08:08:26 +0000 (20:08 +1200)
committereileenmcnaugton <emcnaughton@wikimedia.org>
Sat, 11 May 2019 01:24:31 +0000 (13:24 +1200)
Add test for updating email via import & ensuring it is primary

CRM/Core/BAO/Block.php
tests/phpunit/CRM/Contact/Import/Parser/ContactTest.php

index d37b01d94e5d24e40af664835c94a122a3b7fd66..048614246464dc0ff891b1727f215314eb0775ef 100644 (file)
@@ -344,8 +344,18 @@ class CRM_Core_BAO_Block {
       }
 
       $blockFields = array_merge($value, $contactFields);
-      $baoString = 'CRM_Core_BAO_' . $name;
-      $blocks[] = $baoString::add($blockFields);
+      if ($name === 'Email') {
+        // @todo ideally all would call the api which is our main tested function,
+        // and towards that call the create rather than add which is preferred by the
+        // api. In order to be careful with change only email is swapped over here because it
+        // is specifically tested in testImportParserWithUpdateWithContactID
+        // and the primary handling is otherwise bypassed on importing an email update.
+        $blocks[] = CRM_Core_BAO_Email::create($blockFields);
+      }
+      else {
+        $baoString = 'CRM_Core_BAO_' . $name;
+        $blocks[] = $baoString::add($blockFields);
+      }
     }
 
     return $blocks;
index 2ab4aaf85cb3df66bf50f4524c2f6724244a8fc0..4213c50a77bd04835656b4ade54eba90119a1ac2 100644 (file)
@@ -162,10 +162,10 @@ class CRM_Contact_Import_Parser_ContactTest extends CiviUnitTestCase {
    * @throws \Exception
    */
   public function testImportParserWithUpdateWithExternalIdentifierButNoPrimaryMatch() {
-    list($originalValues, $result) = $this->setUpBaseContact(array(
+    list($originalValues, $result) = $this->setUpBaseContact([
       'external_identifier' => 'windows',
       'email' => NULL,
-    ));
+    ]);
 
     $this->assertEquals('windows', $result['external_identifier']);
 
@@ -177,6 +177,30 @@ class CRM_Contact_Import_Parser_ContactTest extends CiviUnitTestCase {
     $this->callAPISuccessGetSingle('Contact', $originalValues);
   }
 
+  /**
+   * Test import parser will fallback to external identifier.
+   *
+   * In this case no primary match exists (e.g the details are not supplied) so it falls back on external identifier.
+   *
+   * CRM-17275
+   *
+   * @throws \Exception
+   */
+  public function testImportParserWithUpdateWithContactID() {
+    list($originalValues, $result) = $this->setUpBaseContact(array(
+      'external_identifier' => '',
+      'email' => NULL,
+    ));
+    $updateValues = ['id' => $result['id'], 'email' => 'bill@example.com'];
+    // This is some deep weirdness - this sets a flag for updatingBlankLocinfo - allowing input to be blanked
+    // (which IS a good thing but it's pretty weird & all to do with legacy profile stuff).
+    CRM_Core_Session::singleton()->set('authSrc', CRM_Core_Permission::AUTH_SRC_CHECKSUM);
+    $this->runImport($updateValues, CRM_Import_Parser::DUPLICATE_UPDATE, CRM_Import_Parser::VALID, [NULL, 1]);
+    $originalValues['id'] = $result['id'];
+    $this->callAPISuccessGetSingle('Email', ['contact_id' => $originalValues['id'], 'is_primary' => 1]);
+    $this->callAPISuccessGetSingle('Contact', $originalValues);
+  }
+
   /**
    * Test that the import parser adds the external identifier where none is set.
    *