From 09a694054337c35aa0fdf01cc6f3a533f787a64f Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Fri, 27 Oct 2023 13:17:26 +1300 Subject: [PATCH] Minor clean up in test class, add initial ContributionFormTrait --- Civi/Test/ContributionPageTestTrait.php | 111 ++++++++++++++++++ Civi/Test/EventTestTrait.php | 4 - .../CRMTraits/Financial/PriceSetTrait.php | 7 +- tests/phpunit/CiviTest/CiviUnitTestCase.php | 16 ++- tests/phpunit/api/v3/ContributionPageTest.php | 33 ++---- tests/phpunit/api/v3/ContributionTest.php | 41 ++----- 6 files changed, 149 insertions(+), 63 deletions(-) create mode 100644 Civi/Test/ContributionPageTestTrait.php diff --git a/Civi/Test/ContributionPageTestTrait.php b/Civi/Test/ContributionPageTestTrait.php new file mode 100644 index 0000000000..6b4068e6a4 --- /dev/null +++ b/Civi/Test/ContributionPageTestTrait.php @@ -0,0 +1,111 @@ + 'Test Frontend title', + 'title' => 'Page Title', + 'name' => 'default_page', + 'financial_type_id:name' => 'Donation', + 'is_email_receipt' => TRUE, + ]; + $contributionPageValues += $contributionPageDefaults; + return $this->createTestEntity('ContributionPage', $contributionPageValues, $identifier); + } + + /** + * @param array $contributionPageValues + * @param array $priceSetParameters + * Currently if 'id' is passed in then no update is made, but this could change + * @param string $identifier + * + * @return array + */ + public function contributionPageCreatePaid(array $contributionPageValues, array $priceSetParameters = [], string $identifier = 'ContributionPage'): array { + $contributionPageValues['is_monetary'] = TRUE; + $contributionPageResult = $this->contributionPageCreate($contributionPageValues, $identifier); + $priceSetParameters += [ + 'title' => 'Price Set', + 'is_quick_config' => TRUE, + 'extends' => 'CiviContribute', + 'financial_type_id:name' => 'Donation', + 'name' => $identifier, + ]; + if (empty($priceSetParameters['id'])) { + $this->createTestEntity('PriceSet', $priceSetParameters, $identifier); + } + else { + $this->ids['PriceSet'][$identifier] = $priceSetParameters['id']; + // Maybe do update here?? + } + $this->createTestEntity('PriceSetEntity', [ + 'entity_table' => 'civicrm_contribution_page', + 'entity_id' => $contributionPageResult['id'], + 'price_set_id' => $this->ids['PriceSet'][$identifier], + ]); + return $contributionPageResult; + } + + /** + * Get the id of the contribution page created in set up. + * + * If only one has been created it will be selected. Otherwise + * you should pass in the appropriate identifier. + * + * @param string $identifier + * + * @return int + */ + protected function getContributionPageID(string $identifier = 'ContributionPage'): int { + if (isset($this->ids['ContributionPage'][$identifier])) { + return $this->ids['ContributionPage'][$identifier]; + } + if (count($this->ids['ContributionPage']) === 1) { + return reset($this->ids['ContributionPage']); + } + $this->fail('Could not identify ContributionPage ID'); + // Unreachable but reduces IDE noise. + return 0; + } + +} diff --git a/Civi/Test/EventTestTrait.php b/Civi/Test/EventTestTrait.php index c494e94707..61629d21d5 100644 --- a/Civi/Test/EventTestTrait.php +++ b/Civi/Test/EventTestTrait.php @@ -22,10 +22,6 @@ use Civi\Api4\UFJoin; /** * Helper for event tests. * - * WARNING - this trait ships with core from 5.63 but I wasn't able to resolve - * all the core tests onto it for 5.63 - hence the signatures may not yet be stable - * and it is worth assuming that they will not be stable until 5.65. - * * This provides functions to set up valid events * for unit tests. * diff --git a/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php b/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php index 95a7a5cf57..53fb5f2196 100644 --- a/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php +++ b/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php @@ -28,7 +28,12 @@ trait CRMTraits_Financial_PriceSetTrait { * @return int */ protected function getPriceSetID(string $key = 'membership'):int { - return $this->ids['PriceSet'][$key]; + if (isset($this->ids['PriceSet'][$key])) { + return $this->ids['PriceSet'][$key]; + } + if (count($this->ids['PriceSet']) === 1) { + return reset($this->ids['PriceSet']); + } } /** diff --git a/tests/phpunit/CiviTest/CiviUnitTestCase.php b/tests/phpunit/CiviTest/CiviUnitTestCase.php index fea811d89c..9f91df8091 100644 --- a/tests/phpunit/CiviTest/CiviUnitTestCase.php +++ b/tests/phpunit/CiviTest/CiviUnitTestCase.php @@ -867,13 +867,13 @@ class CiviUnitTestCase extends PHPUnit\Framework\TestCase { /** * Create contribution page. * - * @param array $params + * @param array $contributionPageValues * @param string $identifier * * @return array * Array of contribution page */ - public function contributionPageCreate(array $params = [], string $identifier = 'test'): array { + public function contributionPageCreate(array $contributionPageValues = [], string $identifier = 'test'): array { return $this->createTestEntity('ContributionPage', array_merge([ 'title' => 'Test Contribution Page', 'financial_type_id:name' => 'Donation', @@ -883,7 +883,7 @@ class CiviUnitTestCase extends PHPUnit\Framework\TestCase { 'is_allow_other_amount' => 1, 'min_amount' => 10, 'max_amount' => 1000, - ], $params), $identifier); + ], $contributionPageValues), $identifier); } /** @@ -2823,8 +2823,14 @@ class CiviUnitTestCase extends PHPUnit\Framework\TestCase { * @param array $params */ public function createPriceSetWithPage($entity = NULL, $params = []) { - $membershipTypeID = $this->membershipTypeCreate(['name' => 'Special']); - $contributionPageID = $this->callAPISuccess('contribution_page', 'create', [ + $membershipTypeID = $this->createTestEntity('MembershipType', [ + 'name' => 'Special', + 'member_of_contact_id' => CRM_Core_BAO_Domain::getDomain()->contact_id, + 'financial_type_id:name' => 'Member Dues', + 'duration_unit' => 'year', + 'period_type:name' => 'rolling', + ], 'special')['id']; + $contributionPageID = $this->createTestEntity('ContributionPage', [ 'title' => 'Test Contribution Page', 'financial_type_id' => 1, 'currency' => 'NZD', diff --git a/tests/phpunit/api/v3/ContributionPageTest.php b/tests/phpunit/api/v3/ContributionPageTest.php index 77a63775b1..1e9aa5107b 100644 --- a/tests/phpunit/api/v3/ContributionPageTest.php +++ b/tests/phpunit/api/v3/ContributionPageTest.php @@ -10,6 +10,7 @@ */ use Civi\Api4\Contribution; +use Civi\Test\ContributionPageTestTrait; /** * Test APIv3 civicrm_contribute_recur* functions @@ -20,6 +21,7 @@ use Civi\Api4\Contribution; */ class api_v3_ContributionPageTest extends CiviUnitTestCase { use CRMTraits_Financial_PriceSetTrait; + use ContributionPageTestTrait; protected $testAmount = 34567; protected $params; @@ -79,13 +81,8 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { /** * Tear down after test. - * - * @throws \CRM_Core_Exception */ public function tearDown(): void { - foreach ($this->contactIds as $id) { - $this->callAPISuccess('contact', 'delete', ['id' => $id]); - } $this->quickCleanup(['civicrm_system_log']); $this->quickCleanUpFinancialEntities(); parent::tearDown(); @@ -112,13 +109,12 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { */ public function testGetBasicContributionPage(int $version): void { $this->_apiversion = $version; - $createResult = $this->callAPISuccess($this->_entity, 'create', $this->params); - $this->id = $createResult['id']; + $this->callAPISuccess('ContributionPage', 'create', $this->params); $getParams = [ 'currency' => 'NZD', 'financial_type_id' => 1, ]; - $getResult = $this->callAPISuccess($this->_entity, 'get', $getParams); + $getResult = $this->callAPISuccess('ContributionPage', 'get', $getParams); $this->assertEquals(1, $getResult['count']); } @@ -126,8 +122,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { * Test get with amount as a parameter. */ public function testGetContributionPageByAmount(): void { - $createResult = $this->callAPISuccess($this->_entity, 'create', $this->params); - $this->id = $createResult['id']; + $this->callAPISuccess($this->_entity, 'create', $this->params); $getParams = [ // 3456 'amount' => '' . $this->testAmount, @@ -152,18 +147,14 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { /** * Test getfields function. - * - * @throws \CRM_Core_Exception */ public function testGetFieldsContributionPage(): void { - $result = $this->callAPISuccess($this->_entity, 'getfields', ['action' => 'create']); + $result = $this->callAPISuccess('ContributionPage', 'getfields', ['action' => 'create']); $this->assertEquals(12, $result['values']['start_date']['type']); } /** * Test form submission with basic price set. - * - * @throws \CRM_Core_Exception */ public function testSubmit(): void { $this->setUpContributionPage(); @@ -177,8 +168,6 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { /** * Test form submission with basic price set. - * - * @throws \CRM_Core_Exception */ public function testSubmitZeroDollar(): void { $this->setUpContributionPage(); @@ -191,7 +180,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { 'payment_processor_id' => '', ]; - $this->callAPISuccess('contribution_page', 'submit', $submitParams); + $this->callAPISuccess('ContributionPage', 'submit', $submitParams); $contribution = $this->callAPISuccessGetSingle('Contribution', [ 'contribution_page_id' => $this->_ids['contribution_page'], 'return' => ['non_deductible_amount', 'total_amount'], @@ -204,8 +193,6 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { /** * Test form submission with billing first & last name where the contact does NOT * otherwise have one. - * - * @throws \CRM_Core_Exception */ public function testSubmitNewBillingNameData(): void { $this->setUpContributionPage(); @@ -225,8 +212,6 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { /** * Test form submission with billing first & last name where the contact does * otherwise have one and should not be overwritten. - * - * @throws \CRM_Core_Exception */ public function testSubmitNewBillingNameDoNotOverwrite(): void { $this->setUpContributionPage(); @@ -1856,8 +1841,8 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase { */ public function hook_civicrm_alterPaymentProcessorParams($paymentObj, $rawParams, $cookedParams): void { // Ensure total_amount are the same if they're both given. - $total_amount = $rawParams['total_amount'] ?? NULL; - $amount = $rawParams['amount'] ?? NULL; + $total_amount = !empty($rawParams['total_amount']) ? (float) $rawParams['total_amount'] : NULL; + $amount = !empty($rawParams['amount']) ? (float) $rawParams['amount'] : NULL; if (!empty($total_amount) && !empty($amount) && round($total_amount, 2) !== round($amount, 2)) { throw new CRM_Core_Exception("total_amount '$total_amount' and amount '$amount' differ."); } diff --git a/tests/phpunit/api/v3/ContributionTest.php b/tests/phpunit/api/v3/ContributionTest.php index 8e5d5bdc41..d96b5912ab 100644 --- a/tests/phpunit/api/v3/ContributionTest.php +++ b/tests/phpunit/api/v3/ContributionTest.php @@ -645,7 +645,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { } /** - * @throws \CRM_Core_Exception + * */ public function testGetContributionByPaymentInstrument(): void { $params = $this->_params + ['payment_instrument' => 'EFT']; @@ -721,8 +721,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { /** * Test retrieval by total_amount works. - * - * @throws \CRM_Core_Exception */ public function testGetContributionByTotalAmount(): void { $this->callAPISuccess('Contribution', 'create', array_merge($this->_params, ['total_amount' => '5'])); @@ -744,8 +742,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * @param string $thousandSeparator * @param string $currency * @param bool $expectedResult - * - * @throws \CRM_Core_Exception */ public function testCreateLocalizedContribution($totalAmount, string $decimalPoint, string $thousandSeparator, string $currency, bool $expectedResult): void { $this->setDefaultCurrency($currency); @@ -857,8 +853,8 @@ class api_v3_ContributionTest extends CiviUnitTestCase { ]; $contribution = $this->callAPISuccess('contribution', 'create', $params); - $this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00); - $this->assertEquals($contribution['values'][$contribution['id']]['source'], 'SSF'); + $this->assertEquals(100.00, $contribution['values'][$contribution['id']]['total_amount']); + $this->assertEquals('SSF', $contribution['values'][$contribution['id']]['source']); } /** @@ -928,8 +924,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { /** * Test note created correctly. - * - * @throws \CRM_Core_Exception */ public function testCreateContributionWithNote(): void { $params = [ @@ -2259,8 +2253,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $lineItem2 = $this->callAPISuccess('line_item', 'get', array_merge($lineItemParams, [ 'entity_id' => $originalContribution['id'] + 1, ])); - unset($lineItem1['values'][0]['id'], $lineItem1['values'][0]['entity_id']); - unset($lineItem2['values'][0]['id'], $lineItem2['values'][0]['entity_id']); + unset($lineItem1['values'][0]['id'], $lineItem1['values'][0]['entity_id'], $lineItem2['values'][0]['id'], $lineItem2['values'][0]['entity_id']); $this->assertEquals($lineItem1['values'][0], $lineItem2['values'][0]); $this->_checkFinancialRecords([ 'id' => $originalContribution['id'] + 1, @@ -2354,8 +2347,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { unset($lineItem2[0]['id'], $lineItem2[0]['entity_id']); $this->assertEquals($lineItem1[0], $lineItem2[0]); - unset($lineItem1[1]['id'], $lineItem1[1]['entity_id']); - unset($lineItem2[1]['id'], $lineItem2[1]['entity_id']); + unset($lineItem1[1]['id'], $lineItem1[1]['entity_id'], $lineItem2[1]['id'], $lineItem2[1]['entity_id']); $this->assertEquals($lineItem1[1], $lineItem2[1]); // CRM-19309 so in future we also want to: @@ -2816,8 +2808,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * * CRM-17718 a passed in financial_type_id is not allowed to override the * original contribution where there is more than one line item. - * - * @throws \CRM_Core_Exception */ public function testRepeatTransactionPassedInFinancialTypeTwoLineItems(): void { $this->_params = $this->getParticipantOrderParams(); @@ -2847,8 +2837,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { /** * CRM-17718 test appropriate action if financial type has changed for single * line items. - * - * @throws \CRM_Core_Exception */ public function testRepeatTransactionUpdatedFinancialType(): void { $originalContribution = $this->setUpRecurringContribution([], ['financial_type_id' => 2]); @@ -2941,8 +2929,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * CRM-17718 campaign stored on contribution recur gets priority. * * This reflects the fact we permit people to update them. - * - * @throws \CRM_Core_Exception */ public function testRepeatTransactionUpdatedCampaign(): void { $paymentProcessorID = $this->paymentProcessorCreate(); @@ -3273,7 +3259,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * * @return array */ - public function getScheduledDateData() { + public function getScheduledDateData(): array { $result = []; $result[]['2016-08-31-1-month'] = [ 'data' => [ @@ -3479,8 +3465,6 @@ class api_v3_ContributionTest extends CiviUnitTestCase { /** * Test if renewal activity is create after changing Pending contribution to * Completed via offline - * - * @throws \CRM_Core_Exception */ public function testPendingToCompleteContribution(): void { $this->createPriceSetWithPage('membership'); @@ -3601,7 +3585,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { $this->assertEquals(date('Y-m-d', strtotime('yesterday + 5 years')), $membership['end_date']); } - public function cleanUpAfterPriceSets() { + public function cleanUpAfterPriceSets(): void { $this->quickCleanUpFinancialEntities(); $this->contactDelete($this->_ids['contact']); } @@ -3995,7 +3979,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * @param int $contId * @param $context */ - public function _checkFinancialItem($contId, $context) { + public function _checkFinancialItem($contId, $context): void { if ($context !== 'paylater') { $params = [ 'entity_id' => $contId, @@ -4067,7 +4051,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * @param int $newInstrumentID * @param int $amount */ - public function checkFinancialTrxnPaymentInstrumentChange($contributionID, $originalInstrumentID, $newInstrumentID, $amount = 100) { + public function checkFinancialTrxnPaymentInstrumentChange($contributionID, $originalInstrumentID, $newInstrumentID, $amount = 100): void { $entityFinancialTrxns = $this->getFinancialTransactionsForContribution($contributionID); @@ -4123,7 +4107,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * @param int $instrumentId * @param array $extraParams */ - public function _checkFinancialTrxn($contribution, $context, $instrumentId = NULL, $extraParams = []) { + public function _checkFinancialTrxn($contribution, $context, $instrumentId = NULL, $extraParams = []): void { $financialTrxns = $this->getFinancialTransactionsForContribution($contribution['id']); $trxn = array_pop($financialTrxns); @@ -4224,7 +4208,7 @@ class api_v3_ContributionTest extends CiviUnitTestCase { return $optionValue['values'][$optionValue['id']]['value']; } - public function deletedAddedPaymentInstrument() { + public function deletedAddedPaymentInstrument(): void { $result = $this->callAPISuccess('OptionValue', 'get', [ 'option_group_id' => 'payment_instrument', 'name' => 'Test Card', @@ -4247,9 +4231,8 @@ class api_v3_ContributionTest extends CiviUnitTestCase { * Parameters to merge into the recur only. * * @return array|int - * @throws \CRM_Core_Exception */ - protected function setUpRecurringContribution(array $generalParams = [], $recurParams = []) { + protected function setUpRecurringContribution(array $generalParams = [], array $recurParams = []) { $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array_merge([ 'contact_id' => $this->individualID, 'installments' => '12', -- 2.25.1