From 37f29fcf2708630e128977f56c6844032beb09f0 Mon Sep 17 00:00:00 2001 From: Matthew Wire Date: Sat, 14 Jul 2018 18:46:31 +0100 Subject: [PATCH] Add unit test for Membership renewal when contribution not completed --- tests/phpunit/api/v3/ContributionTest.php | 86 ++++++++++++++++++++--- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/tests/phpunit/api/v3/ContributionTest.php b/tests/phpunit/api/v3/ContributionTest.php index d6b765dbc7..3f7294e023 100644 --- a/tests/phpunit/api/v3/ContributionTest.php +++ b/tests/phpunit/api/v3/ContributionTest.php @@ -2203,12 +2203,12 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->assertEquals($contributionRecur['values'][1]['is_test'], $repeatedContribution['values'][2]['is_test']); $this->quickCleanUpFinancialEntities(); } + /** - * CRM-19945 Tests repeattransaction is using a completed contribution for the template. + * CRM-19945 Tests that Contribute.repeattransaction renews a membership when contribution status=Completed * - * ( Tests membership is renewed after repeattransaction. ) */ - public function testRepeatTransactionUsesCompleted() { + public function testRepeatTransactionMembershipRenewCompletedContribution() { list($originalContribution, $membership) = $this->setUpAutoRenewMembership(); $this->callAPISuccess('contribution', 'create', array( @@ -2222,7 +2222,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->callAPISuccess('membership', 'create', array( 'id' => $membership['id'], 'end_date' => 'yesterday', - 'status_id' => 4, + 'status_id' => 'Expired', )); $contribution = $this->callAPISuccess('contribution', 'repeattransaction', array( @@ -2236,7 +2236,11 @@ class api_v3_ContributionTest extends CiviUnitTestCase { 'return' => 'status_id', )); - $this->assertEquals('New', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId)); + $membership = $this->callAPISuccess('membership', 'get', array( + 'id' => $membership['id'], + )); + + $this->assertEquals('New', CRM_Core_PseudoConstant::getName('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId)); $lineItem = $this->callAPISuccessGetSingle('LineItem', array('contribution_id' => $contribution['id'])); $this->assertEquals('civicrm_membership', $lineItem['entity_table']); @@ -2245,6 +2249,72 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->contactDelete($originalContribution['values'][1]['contact_id']); } + /** + * CRM-19945 Tests that Contribute.repeattransaction DOES NOT renew a membership when contribution status=Failed + * + * @dataProvider contributionStatusProvider + */ + public function testRepeatTransactionMembershipRenewContributionNotCompleted($contributionStatus) { + // Completed status should renew so we don't test that here + // In Progress status is only for recurring contributions so we don't test that here + if (in_array($contributionStatus['name'], ['Completed', 'In Progress'])) { + return; + } + 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' => "Completed", + )); + + $this->callAPISuccess('membership', 'create', array( + 'id' => $membership['id'], + 'end_date' => 'yesterday', + 'status_id' => 'Expired', + )); + + $contribution = $this->callAPISuccess('contribution', 'repeattransaction', array( + 'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'], + 'contribution_status_id' => $contributionStatus['name'], + 'trxn_id' => 'bobsled', + )); + + $updatedMembership = $this->callAPISuccess('membership', 'getsingle', array( + 'id' => $membership['id'], + )); + + $dateTime = new DateTime('yesterday'); + $this->assertEquals($dateTime->format('Y-m-d'), $updatedMembership['end_date']); + $this->assertEquals(CRM_Core_PseudoConstant::getKey('CRM_Member_BAO_Membership', 'status_id', 'Expired'), $updatedMembership['status_id']); + + $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']); + } + + /** + * Dataprovider provides contribution status as [optionvalue=>contribution_status_name] + * FIXME: buildOptions seems to die in CRM_Core_Config::_construct when in test mode. + * + * @return array + * @throws \CiviCRM_API3_Exception + */ + public function contributionStatusProvider() { + $contributionStatuses = civicrm_api3('OptionValue', 'get', [ + 'return' => ["id", "name"], + 'option_group_id' => "contribution_status", + ]); + foreach ($contributionStatuses['values'] as $statusName) { + $statuses[] = [$statusName]; + } + return $statuses; + } + /** * CRM-16397 test appropriate action if total amount has changed for single line items. */ @@ -3860,7 +3930,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { /** * CRM-20008 Tests repeattransaction creates pending membership. */ - public function testRepeatTransactionPendingMembership() { + public function testRepeatTransactionMembershipCreatePendingContribution() { list($originalContribution, $membership) = $this->setUpAutoRenewMembership(); $this->callAPISuccess('membership', 'create', array( 'id' => $membership['id'], @@ -3879,7 +3949,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { // Let's see if the membership payments got created while we're at it. $membershipPayments = $this->callAPISuccess('MembershipPayment', 'get', array( - 'memberhip_id' => $membership['id'], + 'membership_id' => $membership['id'], )); $this->assertEquals(2, $membershipPayments['count']); @@ -3889,7 +3959,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { '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('New', CRM_Core_PseudoConstant::getName('CRM_Member_BAO_Membership', 'status_id', $membership['status_id'])); $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 month')), $membership['end_date']); $this->quickCleanUpFinancialEntities(); -- 2.25.1