minor fixes
[civicrm-core.git] / tests / phpunit / api / v3 / ContributionTest.php
index d81434af900c997ab39e5a1acc39d2a3a9f67c66..64214fe1a6fd3502fdc7b69943742a4a2433ce7c 100644 (file)
@@ -822,6 +822,9 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $this->callAPISuccess('contact', 'delete', array('id' => $contact2['id']));
   }
 
+  /**
+   * Test creating contribution with Soft Credit by passing in honor_contact_id.
+   */
   public function testCreateContributionWithHonoreeContact() {
     $description = "Demonstrates creating contribution with Soft Credit by passing in honor_contact_id.";
     $subfile = "ContributionCreateWithHonoreeContact";
@@ -839,7 +842,8 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     // Default soft credit amount = contribution.total_amount
     // Legacy mode in create api (honor_contact_id param) uses the standard "In Honor of" soft credit type
     $this->assertEquals($this->_params['total_amount'], $result['values'][0]['soft_credit'][1]['amount']);
-    $this->assertEquals(CRM_Core_OptionGroup::getValue('soft_credit_type', 'in_honor_of', 'name'), $result['values'][0]['soft_credit'][1]['soft_credit_type']);
+    $softCreditValueTypeID = $result['values'][0]['soft_credit'][1]['soft_credit_type'];
+    $this->assertEquals('in_honor_of', CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_ContributionSoft', 'soft_credit_type_id', $softCreditValueTypeID));
 
     $this->callAPISuccess('contribution', 'delete', array('id' => $contribution['id']));
     $this->callAPISuccess('contact', 'delete', array('id' => $contact2['id']));
@@ -1895,7 +1899,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'financial_account_id' => $financialAccountId,
     );
     CRM_Financial_BAO_FinancialTypeAccount::add($financialAccountParams);
-    $taxRates = CRM_Core_PseudoConstant::getTaxRates();
+
     $params = array_merge($this->_params, array('contribution_status_id' => 2, 'financial_type_id' => $financialTypeId));
     $contribution = $this->callAPISuccess('contribution', 'create', $params);
     $contribution1 = $this->callAPISuccess('contribution', 'get', array('id' => $contribution['id'], 'return' => 'tax_amount', 'sequential' => 1));
@@ -2096,17 +2100,18 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
   }
   /**
    * CRM-19945 Tests repeattransaction is using a completed contribution for the template.
+   *
    *  ( Tests membership is renewed after repeattransaction. )
    */
   public function testRepeatTransactionUsesCompleted() {
     list($originalContribution, $membership) = $this->setUpAutoRenewMembership();
 
     $this->callAPISuccess('contribution', 'create', array(
-          'contact_id' => $originalContribution['values'][1]['contact_id'],
-          'financial_type_id' => $originalContribution['values'][1]['financial_type_id'],
-          'total_amount' => $originalContribution['values'][1]['total_amount'],
-          'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'],
-          'contribution_status_id' => "Failed",
+      'contact_id' => $originalContribution['values'][1]['contact_id'],
+      'financial_type_id' => $originalContribution['values'][1]['financial_type_id'],
+      'total_amount' => $originalContribution['values'][1]['total_amount'],
+      'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'],
+      'contribution_status_id' => "Failed",
     ));
 
     $this->callAPISuccess('membership', 'create', array(
@@ -2115,18 +2120,22 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
        'status_id' => 4,
     ));
 
-    $this->callAPISuccess('contribution', 'repeattransaction', array(
+    $contribution = $this->callAPISuccess('contribution', 'repeattransaction', array(
        'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'],
        'contribution_status_id' => 'Completed',
-       'trxn_id' => uniqid(),
+       'trxn_id' => 'bobsled',
     ));
 
-    $membershipStatus = $this->callAPISuccess('membership', 'getvalue', array(
+    $membershipStatusId = $this->callAPISuccess('membership', 'getvalue', array(
       'id' => $membership['id'],
       'return' => 'status_id',
     ));
 
-    $this->assertEquals('1', $membershipStatus);
+    $this->assertEquals('New', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId));
+
+    $lineItem = $this->callAPISuccessGetSingle('LineItem', array('contribution_id' => $contribution['id']));
+    $this->assertEquals('civicrm_membership', $lineItem['entity_table']);
+    $this->callAPISuccessGetCount('MembershipPayment', array('membership_id' => $membership['id']));
     $this->quickCleanUpFinancialEntities();
     $this->contactDelete($originalContribution['values'][1]['contact_id']);
   }
@@ -2424,16 +2433,8 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    * CRM-1960 - Test to ensure that completetransaction respects the is_email_receipt setting
    */
   public function testCompleteTransactionWithEmailReceiptInput() {
-    // Create a Contribution Page with is_email_receipt = TRUE
-    $contributionPage = $this->callAPISuccess('ContributionPage', 'create', array(
-      'receipt_from_name' => 'Mickey Mouse',
-      'receipt_from_email' => 'mickey@mouse.com',
-      'title' => "Test Contribution Page",
-      'financial_type_id' => 1,
-      'currency' => 'CAD',
-      'is_monetary' => TRUE,
-      'is_email_receipt' => TRUE,
-    ));
+    $contributionPage = $this->createReceiptableContributionPage();
+
     $this->_params['contribution_page_id'] = $contributionPage['id'];
     $params = array_merge($this->_params, array('contribution_status_id' => 2));
     $contribution = $this->callAPISuccess('contribution', 'create', $params);
@@ -2449,6 +2450,66 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $this->assertEquals('', $receipt_date);
   }
 
+  /**
+   * Test that $is_recur is assigned to the receipt.
+   */
+  public function testCompleteTransactionForRecurring() {
+
+    $this->swapMessageTemplateForTestTemplate();
+    $recurring = $this->setUpRecurringContribution();
+    $contributionPage = $this->createReceiptableContributionPage(array('is_recur' => TRUE, 'recur_frequency_unit' => 'month', 'recur_interval' => 1));
+
+    $this->_params['contribution_page_id'] = $contributionPage['id'];
+    $this->_params['contribution_recur_id'] = $recurring['id'];
+
+    $contribution = $this->setUpForCompleteTransaction();
+
+    $this->callAPISuccess('contribution', 'completetransaction', array(
+      'id' => $contribution['id'],
+      'trxn_date' => date('2011-04-09'),
+      'trxn_id' => 'kazam',
+      'is_email_receipt' => 1,
+    ));
+
+    $this->mut->checkMailLog(array(
+      'is_recur:::1',
+      'cancelSubscriptionUrl:::http://dummy.com',
+    ));
+    $this->mut->stop();
+    $this->revertTemplateToReservedTemplate();
+  }
+  /**
+   * CRM-19710 - Test to ensure that completetransaction respects the input for is_email_receipt setting.
+   *
+   * If passed in it will override the default from contribution page.
+   */
+  public function testCompleteTransactionWithEmailReceiptInputTrue() {
+    $mut = new CiviMailUtils($this, TRUE);
+    $this->createLoggedInUser();
+    // Create a Contribution Page with is_email_receipt = FALSE
+    $contributionPage = $this->callAPISuccess('ContributionPage', 'create', array(
+      'receipt_from_name' => 'Mickey Mouse',
+      'receipt_from_email' => 'mickey@mouse.com',
+      'title' => "Test Contribution Page",
+      'financial_type_id' => 1,
+      'currency' => 'CAD',
+      'is_monetary' => TRUE,
+      'is_email_receipt' => 0,
+    ));
+    $this->_params['contribution_page_id'] = $contributionPage['id'];
+    $params = array_merge($this->_params, array('contribution_status_id' => 2, 'receipt_date' => 'now'));
+    $contribution = $this->callAPISuccess('contribution', 'create', $params);
+    // Complete the transaction overriding is_email_receipt to = TRUE
+    $this->callAPISuccess('contribution', 'completetransaction', array(
+      'id' => $contribution['id'],
+      'is_email_receipt' => 1,
+    ));
+    $mut->checkMailLog(array(
+      'Please print this receipt for your records.',
+    ));
+    $mut->stop();
+  }
+
   /**
    * Complete the transaction using the template with all the possible.
    */
@@ -2510,12 +2571,18 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    * Test completing first transaction in a recurring series.
    *
    * The status should be set to 'in progress' and the next scheduled payment date calculated.
+   *
+   * @dataProvider getScheduledDateData
+   *
+   * @param array $dataSet
+   *
+   * @throws \Exception
    */
-  public function testCompleteTransactionSetStatusToInProgress() {
+  public function testCompleteTransactionSetStatusToInProgress($dataSet) {
     $paymentProcessorID = $this->paymentProcessorCreate();
-    $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array(
+    $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array_merge(array(
       'contact_id' => $this->_individualId,
-      'installments' => '12',
+      'installments' => '2',
       'frequency_interval' => '1',
       'amount' => '500',
       'contribution_status_id' => 'Pending',
@@ -2523,21 +2590,74 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'currency' => 'USD',
       'frequency_unit' => 'month',
       'payment_processor_id' => $paymentProcessorID,
-    ));
+    ), $dataSet['data']));
     $contribution = $this->callAPISuccess('contribution', 'create', array_merge(
       $this->_params,
       array(
         'contribution_recur_id' => $contributionRecur['id'],
         'contribution_status_id' => 'Pending',
+        'receive_date' => $dataSet['receive_date'],
       ))
     );
-    $this->callAPISuccess('Contribution', 'completetransaction', array('id' => $contribution));
+    $this->callAPISuccess('Contribution', 'completetransaction', array(
+      'id' => $contribution,
+      'receive_date' => $dataSet['receive_date'],
+    ));
     $contributionRecur = $this->callAPISuccessGetSingle('ContributionRecur', array(
       'id' => $contributionRecur['id'],
       'return' => array('next_sched_contribution_date', 'contribution_status_id'),
     ));
     $this->assertEquals(5, $contributionRecur['contribution_status_id']);
-    $this->assertEquals(date('Y-m-d 00:00:00', strtotime('+1 month')), $contributionRecur['next_sched_contribution_date']);
+    $this->assertEquals($dataSet['expected'], $contributionRecur['next_sched_contribution_date']);
+    $this->callAPISuccess('Contribution', 'create', array_merge(
+      $this->_params,
+      array(
+        'contribution_recur_id' => $contributionRecur['id'],
+        'contribution_status_id' => 'Completed',
+      )
+    ));
+    $contributionRecur = $this->callAPISuccessGetSingle('ContributionRecur', array(
+      'id' => $contributionRecur['id'],
+      'return' => array('contribution_status_id'),
+    ));
+    $this->assertEquals(1, $contributionRecur['contribution_status_id']);
+  }
+
+  /**
+   * Get dates for testing.
+   *
+   * @return array
+   */
+  public function getScheduledDateData() {
+    $result = array();
+    $result[]['2016-08-31-1-month'] = array(
+      'data' => array(
+        'start_date' => '2016-08-31',
+        'frequency_interval' => 1,
+        'frequency_unit' => 'month',
+      ),
+      'receive_date' => '2016-08-31',
+      'expected' => '2016-10-01 00:00:00',
+    );
+    $result[]['2012-01-01-1-month'] = array(
+      'data' => array(
+        'start_date' => '2012-01-01',
+        'frequency_interval' => 1,
+        'frequency_unit' => 'month',
+      ),
+      'receive_date' => '2012-01-01',
+      'expected' => '2012-02-01 00:00:00',
+    );
+    $result[]['2012-01-01-1-month'] = array(
+      'data' => array(
+        'start_date' => '2012-01-01',
+        'frequency_interval' => 1,
+        'frequency_unit' => 'month',
+      ),
+      'receive_date' => '2012-02-29',
+      'expected' => '2012-03-29 00:00:00',
+    );
+    return $result;
   }
 
   /**
@@ -2619,7 +2739,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     ));
     $this->assertEquals(1, $logs['count']);
     $this->assertEquals($stateOfGrace, $membership['status_id']);
-    $contribution = $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
+    $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
     $membership = $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
     $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 year')), $membership['end_date']);
     $this->callAPISuccessGetSingle('LineItem', array(
@@ -2629,12 +2749,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $logs = $this->callAPISuccess('MembershipLog', 'get', array(
       'membership_id' => $this->_ids['membership'],
     ));
-    //CRM-19600: Ensure that 'Membership Renewal' activity is created after successful membership regsitration
-    $activity = $this->callAPISuccess('Activity', 'get', array(
-      'activity_type_id' => 'Membership Renewal',
-      'source_record_id' => $contribution['id'],
-    ));
-    $this->assertEquals(1, $activity['count']);
     $this->assertEquals(2, $logs['count']);
     $this->assertNotEquals($stateOfGrace, $logs['values'][2]['status_id']);
     $this->cleanUpAfterPriceSets();
@@ -2651,6 +2765,13 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     );
     $this->setUpPendingContribution($this->_ids['price_field_value'][0]);
     $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
+    // Case 1: Assert that Membership Signup Activity is created on Pending to Completed Contribution via backoffice
+    $activity = $this->callAPISuccess('Activity', 'get', array(
+      'activity_type_id' => 'Membership Signup',
+      'source_record_id' => $this->_ids['membership'],
+      'status_id' => 'Scheduled',
+    ));
+    $this->assertEquals(1, $activity['count']);
 
     // change pending contribution to completed
     $form = new CRM_Contribute_Form_Contribution();
@@ -2692,11 +2813,29 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     catch (Civi\Payment\Exception\PaymentProcessorException $e) {
       $error = TRUE;
     }
+    // Case 2: After successful payment for Pending backoffice there are three activities created
+    //  2.a Update status of existing Scheduled Membership Signup (created in step 1) to Completed
+    $activity = $this->callAPISuccess('Activity', 'get', array(
+      'activity_type_id' => 'Membership Signup',
+      'source_record_id' => $this->_ids['membership'],
+      'status_id' => 'Completed',
+    ));
+    $this->assertEquals(1, $activity['count']);
+    // 2.b Contribution activity created to record successful payment
     $activity = $this->callAPISuccess('Activity', 'get', array(
-      'activity_type_id' => 'Membership Renewal',
+      'activity_type_id' => 'Contribution',
       'source_record_id' => $this->_ids['contribution'],
+      'status_id' => 'Completed',
     ));
     $this->assertEquals(1, $activity['count']);
+    // 2.c 'Change membership type' activity created to record Membership status change from Grace to Current
+    $activity = $this->callAPISuccess('Activity', 'get', array(
+      'activity_type_id' => 'Change Membership Status',
+      'source_record_id' => $this->_ids['membership'],
+      'status_id' => 'Completed',
+    ));
+    $this->assertEquals(1, $activity['count']);
+    $this->assertEquals('Status changed from Grace to Current', $activity['values'][$activity['id']]['subject']);
   }
 
   /**
@@ -2721,7 +2860,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    *
    * @param int $priceFieldValueID
    */
-  public function setUpPendingContribution($priceFieldValueID) {
+  public function setUpPendingContribution($priceFieldValueID, $contriParams = array()) {
     $contactID = $this->individualCreate();
     $membership = $this->callAPISuccess('membership', 'create', array(
       'contact_id' => $contactID,
@@ -2730,7 +2869,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'end_date' => 'yesterday',
       'join_date' => 'yesterday - 1 year',
     ));
-    $contribution = $this->callAPISuccess('contribution', 'create', array(
+    $contribution = $this->callAPISuccess('contribution', 'create', array_merge(array(
       'domain_id' => 1,
       'contact_id' => $contactID,
       'receive_date' => date('Ymd'),
@@ -2744,7 +2883,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'contribution_status_id' => 2,
       'contribution_page_id' => $this->_ids['contribution_page'],
       'api.membership_payment.create' => array('membership_id' => $membership['id']),
-    ));
+    ), $contriParams));
 
     $this->callAPISuccess('line_item', 'create', array(
       'entity_id' => $contribution['id'],
@@ -3057,10 +3196,9 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'id' => $trxn['financial_trxn_id'],
     );
     if ($context == 'payLater') {
-      $relationTypeId = key(CRM_Core_PseudoConstant::accountOptionValues('account_relationship', NULL, " AND v.name LIKE 'Accounts Receivable Account is' "));
       $compareParams = array(
         'status_id' => 1,
-        'from_financial_account_id' => CRM_Contribute_PseudoConstant::financialAccountType($contribution['financial_type_id'], $relationTypeId),
+        'from_financial_account_id' => CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($contribution['financial_type_id'], 'Accounts Receivable Account is'),
       );
     }
     elseif ($context == 'refund') {
@@ -3195,17 +3333,17 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
    */
   protected function setUpAutoRenewMembership($generalParams = array(), $recurParams = array()) {
     $newContact = $this->callAPISuccess('Contact', 'create', array(
-       'contact_type' => 'Individual',
-       'sort_name' => 'McTesterson, Testy',
-       'display_name' => 'Testy McTesterson',
-       'preferred_language' => 'en_US',
-       'preferred_mail_format' => 'Both',
-       'first_name' => 'Testy',
-       'last_name' => 'McTesterson',
-       'contact_is_deleted' => '0',
-       'email_id' => '4',
-       'email' => 'tmctesterson@example.com',
-       'on_hold' => '0',
+     'contact_type' => 'Individual',
+     'sort_name' => 'McTesterson, Testy',
+     'display_name' => 'Testy McTesterson',
+     'preferred_language' => 'en_US',
+     'preferred_mail_format' => 'Both',
+     'first_name' => 'Testy',
+     'last_name' => 'McTesterson',
+     'contact_is_deleted' => '0',
+     'email_id' => '4',
+     'email' => 'tmctesterson@example.com',
+     'on_hold' => '0',
     ));
     $membershipType = $this->callAPISuccess('MembershipType', 'create', array(
       'domain_id' => "Default Domain Name",
@@ -3228,6 +3366,17 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
       'frequency_unit' => 'month',
       'payment_processor_id' => $this->paymentProcessorID,
     ), $generalParams, $recurParams));
+
+    $membership = $this->callAPISuccess('membership', 'create', array(
+      'contact_id' => $newContact['id'],
+      'contribution_recur_id' => $contributionRecur['id'],
+      'financial_type_id' => "Member Dues",
+      'membership_type_id' => $membershipType['id'],
+      'num_terms' => 1,
+      'skipLineItem' => TRUE,
+    ));
+
+    CRM_Price_BAO_LineItem::getLineItemArray($this->_params, NULL, 'membership', $membershipType['id']);
     $originalContribution = $this->callAPISuccess('contribution', 'create', array_merge(
       $this->_params,
       array(
@@ -3238,18 +3387,12 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
         'invoice_id' => uniqid(),
       ), $generalParams)
     );
-    $membership = $this->callAPISuccess('membership', 'create', array(
-      'contact_id' => $newContact['id'],
-      'contribution_recur_id' => $contributionRecur['id'],
-      'financial_type_id' => "Member Dues",
-      'membership_type_id' => $membershipType['id'],
-      'num_terms' => 1,
-    ));
+    $lineItem = $this->callAPISuccess('LineItem', 'getsingle', array());
+    $this->assertEquals('civicrm_membership', $lineItem['entity_table']);
+    $membership = $this->callAPISuccess('Membership', 'getsingle', array('id' => $lineItem['entity_id']));
+    $this->callAPISuccess('LineItem', 'getsingle', array());
+    $this->callAPISuccessGetCount('MembershipPayment', array('membership_id' => $membership['id']), 1);
 
-    $this->callAPISuccess('MembershipPayment', 'create', array(
-        'contribution_id' => $originalContribution['id'],
-        'membership_id' => $membership['id'],
-    ));
     return array($originalContribution, $membership);
   }
   /**
@@ -3353,6 +3496,45 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $this->quickCleanUpFinancialEntities();
   }
 
+  /**
+   * CRM-20008 Tests repeattransaction creates pending membership.
+   */
+  public function testRepeatTransactionPendingMembership() {
+    list($originalContribution, $membership) = $this->setUpAutoRenewMembership();
+    $this->callAPISuccess('membership', 'create', array(
+      'id' => $membership['id'],
+      'end_date' => 'yesterday',
+      'status_id' => 'Expired',
+    ));
+    $repeatedContribution = $this->callAPISuccess('contribution', 'repeattransaction', array(
+      'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'],
+      'contribution_status_id' => 'Pending',
+      'trxn_id' => uniqid(),
+    ));
+    $membershipStatusId = $this->callAPISuccess('membership', 'getvalue', array(
+      'id' => $membership['id'],
+      'return' => 'status_id',
+    ));
+
+    // Let's see if the membership payments got created while we're at it.
+    $membershipPayments = $this->callAPISuccess('MembershipPayment', 'get', array(
+      'memberhip_id' => $membership['id'],
+    ));
+    $this->assertEquals(2, $membershipPayments['count']);
+
+    $this->assertEquals('Expired', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId));
+    $this->callAPISuccess('Contribution', 'completetransaction', array('id' => $repeatedContribution['id']));
+    $membership = $this->callAPISuccessGetSingle('membership', array(
+      'id' => $membership['id'],
+      'return' => 'status_id, end_date',
+    ));
+    $this->assertEquals('New', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membership['status_id']));
+    $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 month')), $membership['end_date']);
+
+    $this->quickCleanUpFinancialEntities();
+    $this->contactDelete($originalContribution['values'][1]['contact_id']);
+  }
+
   /**
    * Test sending a mail via the API.
    */
@@ -3490,4 +3672,68 @@ class api_v3_ContributionTest extends CiviUnitTestCase {
     $mut->stop();
   }
 
+  /**
+   * Create a Contribution Page with is_email_receipt = TRUE.
+   *
+   * @param array $params
+   *   Params to overwrite with.
+   *
+   * @return array|int
+   */
+  protected function createReceiptableContributionPage($params = array()) {
+    $contributionPage = $this->callAPISuccess('ContributionPage', 'create', array_merge(array(
+      'receipt_from_name' => 'Mickey Mouse',
+      'receipt_from_email' => 'mickey@mouse.com',
+      'title' => "Test Contribution Page",
+      'financial_type_id' => 1,
+      'currency' => 'CAD',
+      'is_monetary' => TRUE,
+      'is_email_receipt' => TRUE,
+    ), $params));
+    return $contributionPage;
+  }
+
+  /**
+   * function to test card_type and pan truncation.
+   */
+  public function testCardTypeAndPanTruncation() {
+    $creditCardTypeIDs = array_flip(CRM_Financial_DAO_FinancialTrxn::buildOptions('card_type_id'));
+    $contactId = $this->individualCreate();
+    $params = array(
+      'contact_id' => $contactId,
+      'receive_date' => '2016-01-20',
+      'total_amount' => 100,
+      'financial_type_id' => 1,
+      'payment_instrument' => 'Credit Card',
+      'card_type_id' => $creditCardTypeIDs['Visa'],
+      'pan_truncation' => 4567,
+    );
+    $contribution = $this->callAPISuccess('contribution', 'create', $params);
+    $lastFinancialTrxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC');
+    $financialTrxn = $this->callAPISuccessGetSingle(
+      'FinancialTrxn',
+      array(
+        'id' => $lastFinancialTrxnId['financialTrxnId'],
+        'return' => array('card_type_id', 'pan_truncation'),
+      )
+    );
+    $this->assertEquals(CRM_Utils_Array::value('card_type_id', $financialTrxn), $creditCardTypeIDs['Visa']);
+    $this->assertEquals(CRM_Utils_Array::value('pan_truncation', $financialTrxn), 4567);
+    $params = array(
+      'id' => $contribution['id'],
+      'pan_truncation' => 2345,
+      'card_type_id' => $creditCardTypeIDs['Amex'],
+    );
+    $contribution = $this->callAPISuccess('contribution', 'create', $params);
+    $financialTrxn = $this->callAPISuccessGetSingle(
+      'FinancialTrxn',
+      array(
+        'id' => $lastFinancialTrxnId['financialTrxnId'],
+        'return' => array('card_type_id', 'pan_truncation'),
+      )
+    );
+    $this->assertEquals(CRM_Utils_Array::value('card_type_id', $financialTrxn), $creditCardTypeIDs['Amex']);
+    $this->assertEquals(CRM_Utils_Array::value('pan_truncation', $financialTrxn), 2345);
+  }
+
 }