Add unit testing for activity creation when cancelling a recurring, related cleanup
authoreileen <emcnaughton@wikimedia.org>
Mon, 8 Apr 2019 03:25:46 +0000 (15:25 +1200)
committereileen <emcnaughton@wikimedia.org>
Mon, 8 Apr 2019 22:50:48 +0000 (10:50 +1200)
CRM/Contribute/BAO/ContributionRecur.php
CRM/Contribute/Form/CancelSubscription.php
tests/phpunit/api/v3/ContributionRecurTest.php

index 559496f02f0f2362c75e69a0d26f6f7e426338ca..649b361b49d6724a8672a7031d7f105200e8b8b9 100644 (file)
@@ -261,11 +261,9 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
    * @param array $params
    *   Recur contribution params
    *
-   * @param array $activityParams
-   *
    * @return bool
    */
-  public static function cancelRecurContribution($params, $activityParams = []) {
+  public static function cancelRecurContribution($params) {
     if (is_int($params)) {
       CRM_Core_Error::deprecatedFunctionWarning('You are using a BAO function whose signature has changed. Please use the ContributionRecur.cancel api');
       $params = ['id' => $params];
@@ -274,6 +272,10 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
     if (!$recurId) {
       return FALSE;
     }
+    $activityParams = [
+      'subject' => !empty($params['membership_id']) ? ts('Auto-renewal membership cancelled') : ts('Recurring contribution cancelled'),
+      'details' => CRM_Utils_Array::value('processor_message', $params),
+    ];
 
     $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
     $canceledId = array_search('Cancelled', $contributionStatus);
@@ -303,8 +305,7 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
 <br/>' . ts('Automatic renewal of %1 membership cancelled.', [1 => $membershipType]);
         }
         else {
-          $details .= '
-<br/>' . ts('The recurring contribution of %1, every %2 %3 has been cancelled.', [
+          $details .= '<br/>' . ts('The recurring contribution of %1, every %2 %3 has been cancelled.', [
               1 => $dao->amount,
               2 => $dao->frequency_interval,
               3 => $dao->frequency_unit,
@@ -313,20 +314,18 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
         $activityParams = [
           'source_contact_id' => $dao->contact_id,
           'source_record_id' => $dao->recur_id,
-          'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Cancel Recurring Contribution'),
+          'activity_type_id' => 'Cancel Recurring Contribution',
           'subject' => CRM_Utils_Array::value('subject', $activityParams, ts('Recurring contribution cancelled')),
           'details' => $details,
-          'activity_date_time' => date('YmdHis'),
-          'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', 'Completed'),
+          'status_id' => 'Completed',
         ];
-        $session = CRM_Core_Session::singleton();
-        $cid = $session->get('userID');
+
+        $cid = CRM_Core_Session::singleton()->get('userID');
         if ($cid) {
           $activityParams['target_contact_id'][] = $activityParams['source_contact_id'];
           $activityParams['source_contact_id'] = $cid;
         }
-        // @todo use the api & do less wrangling above
-        CRM_Activity_BAO_Activity::create($activityParams);
+        civicrm_api3('Activity', 'create', $activityParams);
       }
 
       $transaction->commit();
index dfd921041bd0ed06c2138ef46bd054ecc7baebb0..22896289093f3b66da86f5f1752a3253841882e7 100644 (file)
@@ -207,15 +207,8 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
       CRM_Core_Error::displaySessionError($cancelSubscription);
     }
     elseif ($cancelSubscription) {
-      $activityParams
-        = [
-          'subject' => $this->_mid ? ts('Auto-renewal membership cancelled') : ts('Recurring contribution cancelled'),
-          'details' => $message,
-        ];
       $cancelStatus = CRM_Contribute_BAO_ContributionRecur::cancelRecurContribution(
-        ['id' => $this->_subscriptionDetails->recur_id],
-        $activityParams
-      );
+        ['id' => $this->_subscriptionDetails->recur_id, 'membership_id' => $this->_mid, 'processor_message' => $message]);
 
       if ($cancelStatus) {
         $tplParams = [];
index 93e15db7bcb86bd5afda0dd44bb58205d94c8645..7903e0f40de3274728430b8df837e482e1582370 100644 (file)
@@ -105,11 +105,17 @@ class api_v3_ContributionRecurTest extends CiviUnitTestCase {
    */
   public function testContributionRecurCancel() {
     $result = $this->callAPISuccess($this->_entity, 'create', $this->params);
-    $this->callAPISuccess('ContributionRecur', 'cancel', ['id' => $result['id'], 'cancel_reason' => 'just cos']);
+    $this->callAPISuccess('ContributionRecur', 'cancel', ['id' => $result['id'], 'cancel_reason' => 'just cos', 'processor_message' => 'big fail']);
     $cancelled = $this->callAPISuccess('ContributionRecur', 'getsingle', ['id' => $result['id']]);
     $this->assertEquals('just cos', $cancelled['cancel_reason']);
     $this->assertEquals(CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', 'Cancelled'), $cancelled['contribution_status_id']);
     $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($cancelled['cancel_date'])));
+    $activity = $this->callAPISuccessGetSingle('Activity', ['activity_type_id' => 'Cancel Recurring Contribution', 'record_type_id' => $result['id']]);
+    $this->assertEquals('Recurring contribution cancelled', $activity['subject']);
+    $this->assertEquals('big fail<br/>The recurring contribution of 500.00, every 1 day has been cancelled.', $activity['details']);
+    $this->assertEquals(date('Y-m-d'), date('Y-m-d', strtotime($activity['activity_date_time'])));
+    $this->assertEquals($this->params['contact_id'], $activity['source_contact_id']);
+    $this->assertEquals(CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'status_id', 'Completed'), $activity['status_id']);
   }
 
 }