diff --git a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php index dc5db06639fc..e3a5f199c2bd 100644 --- a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php +++ b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php @@ -32,6 +32,7 @@ class CRM_Contribute_BAO_ContributionTest extends CiviUnitTestCase { use CRMTraits_Financial_FinancialACLTrait; + use CRMTraits_Financial_PriceSetTrait; /** * Clean up after tests. @@ -324,6 +325,22 @@ public function testAnnualQueryWithFinancialACLsEnabled() { $this->disableFinancialACLs(); } + /** + * Test the annual query returns a correct result when multiple line items are present. + */ + public function testAnnualWithMultipleLineItems() { + $contactID = $this->createLoggedInUserWithFinancialACL(); + $this->createContributionWithTwoLineItemsAgainstPriceSet([ + 'contact_id' => $contactID] + ); + $this->enableFinancialACLs(); + $sql = CRM_Contribute_BAO_Contribution::getAnnualQuery([$contactID]); + $result = CRM_Core_DAO::executeQuery($sql); + $result->fetch(); + $this->assertEquals(300, $result->amount); + $this->assertEquals(1, $result->count); + } + /** * Test that financial type data is not added to the annual query if acls not enabled. */ @@ -337,6 +354,32 @@ public function testAnnualQueryWithFinancialACLsDisabled() { CRM_Core_DAO::executeQuery($sql); } + /** + * Test that financial type data is not added to the annual query if acls not enabled. + */ + public function testAnnualQueryWithFinancialHook() { + $this->hookClass->setHook('civicrm_selectWhereClause', array($this, 'aclIdNoZero')); + $sql = CRM_Contribute_BAO_Contribution::getAnnualQuery([1, 2, 3]); + $this->assertContains('SUM(total_amount) as amount,', $sql); + $this->assertContains('WHERE b.contact_id IN (1,2,3)', $sql); + $this->assertContains('b.id NOT IN (0)', $sql); + $this->assertNotContains('b.financial_type_id', $sql); + CRM_Core_DAO::executeQuery($sql); + } + + /** + * Add ACL denying values LIKE '0'. + * + * @param string $entity + * @param string $clauses + */ + public function aclIdNoZero($entity, &$clauses) { + if ($entity != 'Contribution') { + return; + } + $clauses['id'] = "NOT IN (0)"; + } + /** * Display sort name during. * Update multiple contributions diff --git a/tests/phpunit/CRMTraits/Financial/FinancialACLTrait.php b/tests/phpunit/CRMTraits/Financial/FinancialACLTrait.php index f8be66ebbe4b..b3f57b62b11b 100644 --- a/tests/phpunit/CRMTraits/Financial/FinancialACLTrait.php +++ b/tests/phpunit/CRMTraits/Financial/FinancialACLTrait.php @@ -62,11 +62,14 @@ protected function disableFinancialACLs() { * @param array $aclPermissions * Array of ACL permissions in the format * [[$action, $financialType], [$action, $financialType]) + * + * @return int Contact ID */ protected function createLoggedInUserWithFinancialACL($aclPermissions = [['view', 'Donation']]) { CRM_Core_Config::singleton()->userPermissionClass->permissions = ['access CiviCRM']; - $this->createLoggedInUser(); + $contactID = $this->createLoggedInUser(); $this->addFinancialAclPermissions($aclPermissions); + return $contactID; } /** diff --git a/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php b/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php new file mode 100644 index 000000000000..f9fd19a13743 --- /dev/null +++ b/tests/phpunit/CRMTraits/Financial/PriceSetTrait.php @@ -0,0 +1,62 @@ + 300, 'financial_type_id' => 'Donation'], $params); + $priceFields = $this->createPriceSet('contribution'); + foreach ($priceFields['values'] as $key => $priceField) { + $params['line_items'][]['line_item'][$key] = [ + 'price_field_id' => $priceField['price_field_id'], + 'price_field_value_id' => $priceField['id'], + 'label' => $priceField['label'], + 'field_title' => $priceField['label'], + 'qty' => 1, + 'unit_price' => $priceField['amount'], + 'line_total' => $priceField['amount'], + 'financial_type_id' => $priceField['financial_type_id'], + 'entity_table' => 'civicrm_contribution', + ]; + } + $order = $this->callAPISuccess('order', 'create', $params); + } + + +}