Merge branch '5.4' of https://github.com/civicrm/civicrm-core
[civicrm-core.git] / tests / phpunit / CRM / Export / BAO / ExportTest.php
index 496a9e74bb76a5984cd3d8c00dd74bd0963c776e..f61450c84994a6318ae990f40e28e1c29827d0fb 100644 (file)
@@ -44,7 +44,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
    * Basic test to ensure the exportComponents function completes without error.
    */
   public function testExportComponentsNull() {
-    list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
+    list($tableName) = CRM_Export_BAO_Export::exportComponents(
       TRUE,
       array(),
       array(),
@@ -192,8 +192,10 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
     $pattern = '/as `?([^`,]*)/';
     $queryFieldAliases = array();
     preg_match_all($pattern, $select, $queryFieldAliases, PREG_PATTERN_ORDER);
+    $processor = new CRM_Export_BAO_ExportProcessor(CRM_Contact_BAO_Query::MODE_CONTRIBUTE, 'AND');
+    $processor->setQueryFields($query->_fields);
 
-    list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $query, $contactRelationshipTypes, '', array());
+    list($outputFields) = CRM_Export_BAO_Export::getExportStructureArrays($returnProperties, $processor, $contactRelationshipTypes, '');
     foreach (array_keys($outputFields) as $fieldAlias) {
       if ($fieldAlias == 'Home-country') {
         $this->assertTrue(in_array($fieldAlias . '_id', $queryFieldAliases[1]), 'Country is subject to some funky translate so we make sure country id is present');
@@ -374,26 +376,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
    * This is to ensure that CRM-13995 remains fixed.
    */
   public function testExportRelationshipsMergeToHousehold() {
-    $this->setUpContactExportData();
-    $householdID = $this->householdCreate(['api.Address.create' => ['city' => 'Portland', 'state_province_id' => 'Maine', 'location_type_id' => 'Home']]);
-
-    $relationshipTypes = $this->callAPISuccess('RelationshipType', 'get', [])['values'];
-    $houseHoldTypeID = NULL;
-    foreach ($relationshipTypes as $id => $relationshipType) {
-      if ($relationshipType['name_a_b'] === 'Household Member of') {
-        $houseHoldTypeID = $relationshipType['id'];
-      }
-    }
-    $this->callAPISuccess('Relationship', 'create', [
-      'contact_id_a' => $this->contactIDs[0],
-      'contact_id_b' => $householdID,
-      'relationship_type_id' => $houseHoldTypeID,
-    ]);
-    $this->callAPISuccess('Relationship', 'create', [
-      'contact_id_a' => $this->contactIDs[1],
-      'contact_id_b' => $householdID,
-      'relationship_type_id' => $houseHoldTypeID,
-    ]);
+    list($householdID, $houseHoldTypeID) = $this->setUpHousehold();
 
     $selectedFields = [
       ['Individual', $houseHoldTypeID . '_a_b', 'state_province', ''],
@@ -428,6 +411,248 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
 
   }
 
+  /**
+   * Test exporting relationships.
+   */
+  public function testExportRelationshipsMergeToHouseholdAllFields() {
+    $this->markTestIncomplete('Does not yet work under CI due to mysql limitation (number of columns in table). Works on some boxes');
+    list($householdID) = $this->setUpHousehold();
+    list($tableName) = CRM_Export_BAO_Export::exportComponents(
+      FALSE,
+      $this->contactIDs,
+      [],
+      NULL,
+      NULL,
+      NULL,
+      CRM_Export_Form_Select::CONTACT_EXPORT,
+      "contact_a.id IN (" . implode(",", $this->contactIDs) . ")",
+      NULL,
+      FALSE,
+      TRUE,
+      [
+        'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
+        'suppress_csv_for_testing' => TRUE,
+      ]
+    );
+    $dao = CRM_Core_DAO::executeQuery("SELECT * FROM {$tableName}");
+    while ($dao->fetch()) {
+      $this->assertEquals('Portland', $dao->city);
+      $this->assertEquals('ME', $dao->state_province);
+      $this->assertEquals($householdID, $dao->civicrm_primary_id);
+      $this->assertEquals($householdID, $dao->civicrm_primary_id);
+      $this->assertEquals('Unit Test Household', $dao->addressee);
+      $this->assertEquals('Unit Test Household', $dao->display_name);
+    }
+  }
+
+  /**
+   * Test master_address_id field.
+   */
+  public function testExportCustomData() {
+    $this->setUpContactExportData();
+
+    $customData = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, 'ContactTest.php');
+
+    $this->callAPISuccess('Contact', 'create', [
+      'id' => $this->contactIDs[1],
+      'custom_' . $customData['custom_field_id'] => 'BlahdeBlah',
+      'api.Address.create' => ['location_type_id' => 'Billing', 'city' => 'Waipu'],
+    ]);
+    $selectedFields = [
+      ['Individual', 'city', CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_Address', 'location_type_id', 'Billing')],
+      ['Individual', 'custom_1'],
+    ];
+
+    list($tableName, $sqlColumns) = $this->doExport($selectedFields, $this->contactIDs[1]);
+    $this->assertEquals([
+      'billing_city' => 'billing_city text',
+      'custom_1' => 'custom_1 varchar(255)',
+    ], $sqlColumns);
+
+    $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
+    while ($dao->fetch()) {
+      $this->assertEquals('BlahdeBlah', $dao->custom_1);
+      $this->assertEquals('Waipu', $dao->billing_city);
+    }
+  }
+
+  /**
+   * Attempt to do a fairly full export of location data.
+   */
+  public function testExportIMData() {
+    // Use default providers.
+    $providers = ['AIM', 'GTalk', 'Jabber', 'MSN', 'Skype', 'Yahoo'];
+    $locationTypes = ['Billing', 'Home', 'Main', 'Other'];
+
+    $this->contactIDs[] = $this->individualCreate();
+    $this->contactIDs[] = $this->individualCreate();
+    $this->contactIDs[] = $this->householdCreate();
+    $this->contactIDs[] = $this->organizationCreate();
+    foreach ($this->contactIDs as $contactID) {
+      foreach ($providers as $provider) {
+        foreach ($locationTypes as $locationType) {
+          $this->callAPISuccess('IM', 'create', [
+            'contact_id' => $contactID,
+            'location_type_id' => $locationType,
+            'provider_id' => $provider,
+            'name' => $locationType . $provider . $contactID,
+          ]);
+        }
+      }
+    }
+
+    $relationships = [
+      $this->contactIDs[1] => ['label' => 'Spouse of'],
+      $this->contactIDs[2] => ['label' => 'Household Member of'],
+      $this->contactIDs[3] => ['label' => 'Employee of']
+    ];
+
+    foreach ($relationships as $contactID => $relationshipType) {
+      $relationshipTypeID = $this->callAPISuccess('RelationshipType', 'getvalue', ['label_a_b' => $relationshipType['label'], 'return' => 'id']);
+      $result = $this->callAPISuccess('Relationship', 'create', [
+        'contact_id_a' => $this->contactIDs[0],
+        'relationship_type_id' => $relationshipTypeID,
+        'contact_id_b' => $contactID
+      ]);
+      $relationships[$contactID]['id'] = $result['id'];
+      $relationships[$contactID]['relationship_type_id'] = $relationshipTypeID;
+    }
+
+    $fields = [['Individual', 'contact_id']];
+    // ' ' denotes primary location type.
+    foreach (array_merge($locationTypes, [' ']) as $locationType) {
+      $fields[] = [
+        'Individual',
+        'im_provider',
+        CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+      ];
+      foreach ($relationships as $contactID => $relationship) {
+        $fields[] = [
+          'Individual',
+          $relationship['relationship_type_id'] . '_a_b',
+          'im_provider',
+          CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+        ];
+      }
+      foreach ($providers as $provider) {
+        $fields[] = [
+          'Individual',
+          'im',
+          CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+          CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
+        ];
+        foreach ($relationships as $contactID => $relationship) {
+          $fields[] = [
+            'Individual',
+            $relationship['relationship_type_id'] . '_a_b',
+            'im',
+            CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'location_type_id', $locationType),
+            CRM_Core_PseudoConstant::getKey('CRM_Core_BAO_IM', 'provider_id', $provider),
+          ];
+        }
+      }
+    }
+    list($tableName, $sqlColumns) = $this->doExport($fields, $this->contactIDs[0]);
+
+    $dao = CRM_Core_DAO::executeQuery('SELECT * FROM ' . $tableName);
+    while ($dao->fetch()) {
+      $id = $dao->contact_id;
+      $this->assertEquals('AIM', $dao->billing_im_provider);
+      $this->assertEquals('BillingJabber' . $id, $dao->billing_im_screen_name_jabber);
+      $this->assertEquals('BillingSkype' . $id, $dao->billing_im_screen_name_skype);
+      foreach ($relationships as $relatedContactID => $relationship) {
+        $relationshipString = $field = $relationship['relationship_type_id'] . '_a_b';
+        $field = $relationshipString . '_billing_im_screen_name_yahoo';
+        $this->assertEquals('BillingYahoo' . $relatedContactID, $dao->$field);
+        // @todo efforts to output 'im_provider' for related contacts seem to be giving a blank field.
+      }
+    }
+
+    // early return for now until we solve a leakage issue.
+    return;
+
+    $this->assertEquals([
+      'billing_im_provider' => 'billing_im_provider text',
+      'billing_im_screen_name' => 'billing_im_screen_name text',
+      'billing_im_screen_name_jabber' => 'billing_im_screen_name_jabber text',
+      'billing_im_screen_name_skype' => 'billing_im_screen_name_skype text',
+      'billing_im_screen_name_yahoo' => 'billing_im_screen_name_yahoo text',
+      'home_im_provider' => 'home_im_provider text',
+      'home_im_screen_name' => 'home_im_screen_name text',
+      'home_im_screen_name_jabber' => 'home_im_screen_name_jabber text',
+      'home_im_screen_name_skype' => 'home_im_screen_name_skype text',
+      'home_im_screen_name_yahoo' => 'home_im_screen_name_yahoo text',
+      'main_im_provider' => 'main_im_provider text',
+      'main_im_screen_name' => 'main_im_screen_name text',
+      'main_im_screen_name_jabber' => 'main_im_screen_name_jabber text',
+      'main_im_screen_name_skype' => 'main_im_screen_name_skype text',
+      'main_im_screen_name_yahoo' => 'main_im_screen_name_yahoo text',
+      'other_im_provider' => 'other_im_provider text',
+      'other_im_screen_name' => 'other_im_screen_name text',
+      'other_im_screen_name_jabber' => 'other_im_screen_name_jabber text',
+      'other_im_screen_name_skype' => 'other_im_screen_name_skype text',
+      'other_im_screen_name_yahoo' => 'other_im_screen_name_yahoo text',
+      'im_provider' => 'im_provider text',
+      'im' => 'im varchar(64)',
+      'contact_id' => 'contact_id varchar(255)',
+      '2_a_b_im_provider' => '2_a_b_im_provider text',
+      '2_a_b_billing_im_screen_name' => '2_a_b_billing_im_screen_name text',
+      '2_a_b_billing_im_screen_name_jabber' => '2_a_b_billing_im_screen_name_jabber text',
+      '2_a_b_billing_im_screen_name_skype' => '2_a_b_billing_im_screen_name_skype text',
+      '2_a_b_billing_im_screen_name_yahoo' => '2_a_b_billing_im_screen_name_yahoo text',
+      '2_a_b_home_im_screen_name' => '2_a_b_home_im_screen_name text',
+      '2_a_b_home_im_screen_name_jabber' => '2_a_b_home_im_screen_name_jabber text',
+      '2_a_b_home_im_screen_name_skype' => '2_a_b_home_im_screen_name_skype text',
+      '2_a_b_home_im_screen_name_yahoo' => '2_a_b_home_im_screen_name_yahoo text',
+      '2_a_b_main_im_screen_name' => '2_a_b_main_im_screen_name text',
+      '2_a_b_main_im_screen_name_jabber' => '2_a_b_main_im_screen_name_jabber text',
+      '2_a_b_main_im_screen_name_skype' => '2_a_b_main_im_screen_name_skype text',
+      '2_a_b_main_im_screen_name_yahoo' => '2_a_b_main_im_screen_name_yahoo text',
+      '2_a_b_other_im_screen_name' => '2_a_b_other_im_screen_name text',
+      '2_a_b_other_im_screen_name_jabber' => '2_a_b_other_im_screen_name_jabber text',
+      '2_a_b_other_im_screen_name_skype' => '2_a_b_other_im_screen_name_skype text',
+      '2_a_b_other_im_screen_name_yahoo' => '2_a_b_other_im_screen_name_yahoo text',
+      '2_a_b_im' => '2_a_b_im text',
+      '8_a_b_im_provider' => '8_a_b_im_provider text',
+      '8_a_b_billing_im_screen_name' => '8_a_b_billing_im_screen_name text',
+      '8_a_b_billing_im_screen_name_jabber' => '8_a_b_billing_im_screen_name_jabber text',
+      '8_a_b_billing_im_screen_name_skype' => '8_a_b_billing_im_screen_name_skype text',
+      '8_a_b_billing_im_screen_name_yahoo' => '8_a_b_billing_im_screen_name_yahoo text',
+      '8_a_b_home_im_screen_name' => '8_a_b_home_im_screen_name text',
+      '8_a_b_home_im_screen_name_jabber' => '8_a_b_home_im_screen_name_jabber text',
+      '8_a_b_home_im_screen_name_skype' => '8_a_b_home_im_screen_name_skype text',
+      '8_a_b_home_im_screen_name_yahoo' => '8_a_b_home_im_screen_name_yahoo text',
+      '8_a_b_main_im_screen_name' => '8_a_b_main_im_screen_name text',
+      '8_a_b_main_im_screen_name_jabber' => '8_a_b_main_im_screen_name_jabber text',
+      '8_a_b_main_im_screen_name_skype' => '8_a_b_main_im_screen_name_skype text',
+      '8_a_b_main_im_screen_name_yahoo' => '8_a_b_main_im_screen_name_yahoo text',
+      '8_a_b_other_im_screen_name' => '8_a_b_other_im_screen_name text',
+      '8_a_b_other_im_screen_name_jabber' => '8_a_b_other_im_screen_name_jabber text',
+      '8_a_b_other_im_screen_name_skype' => '8_a_b_other_im_screen_name_skype text',
+      '8_a_b_other_im_screen_name_yahoo' => '8_a_b_other_im_screen_name_yahoo text',
+      '8_a_b_im' => '8_a_b_im text',
+      '5_a_b_im_provider' => '5_a_b_im_provider text',
+      '5_a_b_billing_im_screen_name' => '5_a_b_billing_im_screen_name text',
+      '5_a_b_billing_im_screen_name_jabber' => '5_a_b_billing_im_screen_name_jabber text',
+      '5_a_b_billing_im_screen_name_skype' => '5_a_b_billing_im_screen_name_skype text',
+      '5_a_b_billing_im_screen_name_yahoo' => '5_a_b_billing_im_screen_name_yahoo text',
+      '5_a_b_home_im_screen_name' => '5_a_b_home_im_screen_name text',
+      '5_a_b_home_im_screen_name_jabber' => '5_a_b_home_im_screen_name_jabber text',
+      '5_a_b_home_im_screen_name_skype' => '5_a_b_home_im_screen_name_skype text',
+      '5_a_b_home_im_screen_name_yahoo' => '5_a_b_home_im_screen_name_yahoo text',
+      '5_a_b_main_im_screen_name' => '5_a_b_main_im_screen_name text',
+      '5_a_b_main_im_screen_name_jabber' => '5_a_b_main_im_screen_name_jabber text',
+      '5_a_b_main_im_screen_name_skype' => '5_a_b_main_im_screen_name_skype text',
+      '5_a_b_main_im_screen_name_yahoo' => '5_a_b_main_im_screen_name_yahoo text',
+      '5_a_b_other_im_screen_name' => '5_a_b_other_im_screen_name text',
+      '5_a_b_other_im_screen_name_jabber' => '5_a_b_other_im_screen_name_jabber text',
+      '5_a_b_other_im_screen_name_skype' => '5_a_b_other_im_screen_name_skype text',
+      '5_a_b_other_im_screen_name_yahoo' => '5_a_b_other_im_screen_name_yahoo text',
+      '5_a_b_im' => '5_a_b_im text',
+    ], $sqlColumns);
+
+  }
+
   /**
    * Test master_address_id field.
    */
@@ -485,7 +710,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
     ));
 
     //create address for contact A
-    $result = $this->callAPISuccess('address', 'create', array(
+    $this->callAPISuccess('address', 'create', array(
       'contact_id' => $contactA['id'],
       'location_type_id' => 'Home',
       'street_address' => 'ABC 12',
@@ -496,7 +721,7 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
     ));
 
     //create address for contact B
-    $result = $this->callAPISuccess('address', 'create', array(
+    $this->callAPISuccess('address', 'create', array(
       'contact_id' => $contactB['id'],
       'location_type_id' => 'Home',
       'street_address' => 'ABC 12',
@@ -539,4 +764,62 @@ class CRM_Export_BAO_ExportTest extends CiviUnitTestCase {
     CRM_Core_DAO::executeQuery($sql);
   }
 
+  /**
+   * @return array
+   */
+  protected function setUpHousehold() {
+    $this->setUpContactExportData();
+    $householdID = $this->householdCreate([
+      'api.Address.create' => [
+        'city' => 'Portland',
+        'state_province_id' => 'Maine',
+        'location_type_id' => 'Home'
+      ]
+    ]);
+
+    $relationshipTypes = $this->callAPISuccess('RelationshipType', 'get', [])['values'];
+    $houseHoldTypeID = NULL;
+    foreach ($relationshipTypes as $id => $relationshipType) {
+      if ($relationshipType['name_a_b'] === 'Household Member of') {
+        $houseHoldTypeID = $relationshipType['id'];
+      }
+    }
+    $this->callAPISuccess('Relationship', 'create', [
+      'contact_id_a' => $this->contactIDs[0],
+      'contact_id_b' => $householdID,
+      'relationship_type_id' => $houseHoldTypeID,
+    ]);
+    $this->callAPISuccess('Relationship', 'create', [
+      'contact_id_a' => $this->contactIDs[1],
+      'contact_id_b' => $householdID,
+      'relationship_type_id' => $houseHoldTypeID,
+    ]);
+    return array($householdID, $houseHoldTypeID);
+  }
+
+  /**
+   * @param $selectedFields
+   * @return array
+   */
+  protected function doExport($selectedFields, $id) {
+    list($tableName, $sqlColumns) = CRM_Export_BAO_Export::exportComponents(
+      TRUE,
+      array($id),
+      array(),
+      NULL,
+      $selectedFields,
+      NULL,
+      CRM_Export_Form_Select::CONTACT_EXPORT,
+      "contact_a.id IN ({$id})",
+      NULL,
+      FALSE,
+      FALSE,
+      array(
+        'exportOption' => CRM_Export_Form_Select::CONTACT_EXPORT,
+        'suppress_csv_for_testing' => TRUE,
+      )
+    );
+    return array($tableName, $sqlColumns);
+  }
+
 }