Unit test for financial acl CRM_Member_BAO_MembershipType::getPermissionedMembershipT...
authoreileen <emcnaughton@wikimedia.org>
Fri, 23 Oct 2020 04:28:14 +0000 (17:28 +1300)
committereileen <emcnaughton@wikimedia.org>
Fri, 23 Oct 2020 04:30:17 +0000 (17:30 +1300)
ext/financialacls/tests/phpunit/BuildAmountHookTest.php [deleted file]
ext/financialacls/tests/phpunit/Civi/Financialacls/BaseTestClass.php [new file with mode: 0644]
ext/financialacls/tests/phpunit/Civi/Financialacls/BuildAmountHookTest.php [new file with mode: 0644]
ext/financialacls/tests/phpunit/Civi/Financialacls/LineItemTest.php [moved from ext/financialacls/tests/phpunit/LineItemTest.php with 62% similarity]
ext/financialacls/tests/phpunit/Civi/Financialacls/MembershipTypesTest.php [new file with mode: 0644]

diff --git a/ext/financialacls/tests/phpunit/BuildAmountHookTest.php b/ext/financialacls/tests/phpunit/BuildAmountHookTest.php
deleted file mode 100644 (file)
index b240ac3..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-use Civi\Test\HeadlessInterface;
-use Civi\Test\HookInterface;
-use Civi\Test\TransactionalInterface;
-use Civi\Api4\PriceField;
-use Civi\Api4\PriceSet;
-use Civi\Api4\PriceFieldValue;
-
-/**
- * Test that that financial acls are applied in the context of buildAmountHook.
- *
- * @group headless
- */
-class BuildAmountHookTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, HookInterface, TransactionalInterface {
-
-  use Civi\Test\ContactTestTrait;
-  use Civi\Test\Api3TestTrait;
-
-  /**
-   * @return \Civi\Test\CiviEnvBuilder
-   * @throws \CRM_Extension_Exception_ParseException
-   */
-  public function setUpHeadless() {
-    // Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
-    // See: https://docs.civicrm.org/dev/en/latest/testing/phpunit/#civitest
-    return \Civi\Test::headless()
-      ->installMe(__DIR__)
-      ->apply();
-  }
-
-  /**
-   * Test api applies permissions on line item actions (delete & get).
-   */
-  public function testBuildAmount() {
-    $priceSet = PriceSet::create()->setValues(['name' => 'test', 'title' => 'test', 'extends' => 'CiviMember'])->execute()->first();
-    PriceField::create()->setValues([
-      'financial_type_id:name' => 'Donation',
-      'name' => 'donation',
-      'label' => 'donation',
-      'price_set_id' => $priceSet['id'],
-      'html_type' => 'Select',
-    ])->addChain('field_values', PriceFieldValue::save()->setRecords([
-      ['financial_type_id:name' => 'Donation', 'name' => 'a', 'label' => 'a', 'amount' => 1],
-      ['financial_type_id:name' => 'Member Dues', 'name' => 'b', 'label' => 'b', 'amount' => 2],
-    ])->setDefaults(['price_field_id' => '$id']))->execute();
-    Civi::settings()->set('acl_financial_type', TRUE);
-    $this->setPermissions([
-      'access CiviCRM',
-      'access CiviContribute',
-      'view contributions of type Donation',
-      'delete contributions of type Donation',
-      'add contributions of type Donation',
-      'edit contributions of type Donation',
-    ]);
-    $this->createLoggedInUser();
-    $form = new CRM_Member_Form_Membership();
-    $form->controller = new CRM_Core_Controller();
-    $form->set('priceSetId', $priceSet['id']);
-    CRM_Price_BAO_PriceSet::buildPriceSet($form);
-    $priceField = reset($form->_priceSet['fields']);
-    $this->assertCount(1, $priceField['options']);
-    $this->assertEquals('a', reset($priceField['options'])['name']);
-  }
-
-  /**
-   * Set ACL permissions, overwriting any existing ones.
-   *
-   * @param array $permissions
-   *   Array of permissions e.g ['access CiviCRM','access CiviContribute'],
-   */
-  protected function setPermissions(array $permissions) {
-    CRM_Core_Config::singleton()->userPermissionClass->permissions = $permissions;
-    if (isset(\Civi::$statics['CRM_Financial_BAO_FinancialType'])) {
-      unset(\Civi::$statics['CRM_Financial_BAO_FinancialType']);
-    }
-  }
-
-}
diff --git a/ext/financialacls/tests/phpunit/Civi/Financialacls/BaseTestClass.php b/ext/financialacls/tests/phpunit/Civi/Financialacls/BaseTestClass.php
new file mode 100644 (file)
index 0000000..6eb159c
--- /dev/null
@@ -0,0 +1,59 @@
+<?php
+
+namespace Civi\Financialacls;
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\HookInterface;
+use Civi\Test\TransactionalInterface;
+use Civi\Test\ContactTestTrait;
+use Civi\Test\Api3TestTrait;
+
+/**
+ * @group headless
+ */
+class BaseTestClass extends \PHPUnit\Framework\TestCase implements HeadlessInterface, HookInterface, TransactionalInterface {
+
+  use ContactTestTrait;
+  use Api3TestTrait;
+
+  /**
+   * @return \Civi\Test\CiviEnvBuilder
+   * @throws \CRM_Extension_Exception_ParseException
+   */
+  public function setUpHeadless() {
+    // Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+    // See: https://docs.civicrm.org/dev/en/latest/testing/phpunit/#civitest
+    return \Civi\Test::headless()
+      ->installMe(__DIR__)
+      ->apply();
+  }
+
+  /**
+   * Set ACL permissions, overwriting any existing ones.
+   *
+   * @param array $permissions
+   *   Array of permissions e.g ['access CiviCRM','access CiviContribute'],
+   */
+  protected function setPermissions(array $permissions) {
+    \CRM_Core_Config::singleton()->userPermissionClass->permissions = $permissions;
+    if (isset(\Civi::$statics['CRM_Financial_BAO_FinancialType'])) {
+      unset(\Civi::$statics['CRM_Financial_BAO_FinancialType']);
+    }
+  }
+
+  protected function setupLoggedInUserWithLimitedFinancialTypeAccess(): void {
+    $this->setPermissions([
+      'access CiviCRM',
+      'access CiviContribute',
+      'edit contributions',
+      'delete in CiviContribute',
+      'view contributions of type Donation',
+      'delete contributions of type Donation',
+      'add contributions of type Donation',
+      'edit contributions of type Donation',
+    ]);
+    \Civi::settings()->set('acl_financial_type', TRUE);
+    $this->createLoggedInUser();
+  }
+
+}
diff --git a/ext/financialacls/tests/phpunit/Civi/Financialacls/BuildAmountHookTest.php b/ext/financialacls/tests/phpunit/Civi/Financialacls/BuildAmountHookTest.php
new file mode 100644 (file)
index 0000000..1ef9435
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+
+namespace Civi\Financialacls;
+
+use Civi\Api4\PriceField;
+use Civi\Api4\PriceSet;
+use Civi\Api4\PriceFieldValue;
+
+// I fought the Autoloader and the autoloader won.
+require_once 'BaseTestClass.php';
+
+/**
+ * Test that that financial acls are applied in the context of buildAmountHook.
+ *
+ * @group headless
+ */
+class BuildAmountHookTest extends BaseTestClass {
+
+  /**
+   * Test api applies permissions on line item actions (delete & get).
+   */
+  public function testBuildAmount() {
+    $priceSet = PriceSet::create()->setValues(['name' => 'test', 'title' => 'test', 'extends' => 'CiviMember'])->execute()->first();
+    PriceField::create()->setValues([
+      'financial_type_id:name' => 'Donation',
+      'name' => 'donation',
+      'label' => 'donation',
+      'price_set_id' => $priceSet['id'],
+      'html_type' => 'Select',
+    ])->addChain('field_values', PriceFieldValue::save()->setRecords([
+      ['financial_type_id:name' => 'Donation', 'name' => 'a', 'label' => 'a', 'amount' => 1],
+      ['financial_type_id:name' => 'Member Dues', 'name' => 'b', 'label' => 'b', 'amount' => 2],
+    ])->setDefaults(['price_field_id' => '$id']))->execute();
+    $this->setupLoggedInUserWithLimitedFinancialTypeAccess();
+    $form = new \CRM_Member_Form_Membership();
+    $form->controller = new \CRM_Core_Controller();
+    $form->set('priceSetId', $priceSet['id']);
+    \CRM_Price_BAO_PriceSet::buildPriceSet($form);
+    $priceField = reset($form->_priceSet['fields']);
+    $this->assertCount(1, $priceField['options']);
+    $this->assertEquals('a', reset($priceField['options'])['name']);
+  }
+
+}
similarity index 62%
rename from ext/financialacls/tests/phpunit/LineItemTest.php
rename to ext/financialacls/tests/phpunit/Civi/Financialacls/LineItemTest.php
index 0c4c4b9c720fa8bd45b215f999d683207b582da6..33db7de3424cf4b5e70fa0f504d3310991052b9c 100644 (file)
@@ -1,11 +1,12 @@
 <?php
 
-use CRM_Financialacls_ExtensionUtil as E;
-use Civi\Test\HeadlessInterface;
-use Civi\Test\HookInterface;
-use Civi\Test\TransactionalInterface;
+namespace Civi\Financialacls;
+
 use Civi\Api4\PriceField;
 
+// I fought the Autoloader and the autoloader won.
+require_once 'BaseTestClass.php';
+
 /**
  * FIXME - Add test description.
  *
@@ -20,25 +21,11 @@ use Civi\Api4\PriceField;
  *
  * @group headless
  */
-class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, HookInterface, TransactionalInterface {
-
-  use Civi\Test\ContactTestTrait;
-  use Civi\Test\Api3TestTrait;
-
-  /**
-   * @return \Civi\Test\CiviEnvBuilder
-   * @throws \CRM_Extension_Exception_ParseException
-   */
-  public function setUpHeadless() {
-    // Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
-    // See: https://docs.civicrm.org/dev/en/latest/testing/phpunit/#civitest
-    return \Civi\Test::headless()
-      ->installMe(__DIR__)
-      ->apply();
-  }
+class LineItemTest extends BaseTestClass {
 
   /**
    * Test api applies permissions on line item actions (delete & get).
+   *
    * @dataProvider versionThreeAndFour
    */
   public function testLineItemApiPermissions($version) {
@@ -51,13 +38,13 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
         [
           'line_item' => [
             [
-              'financial_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Donation'),
+              'financial_type_id' => \CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Donation'),
               'line_total' => 40,
               'price_field_id' => $defaultPriceFieldID,
               'qty' => 1,
             ],
             [
-              'financial_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Member Dues'),
+              'financial_type_id' => \CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Member Dues'),
               'line_total' => 50,
               'price_field_id' => $defaultPriceFieldID,
               'qty' => 1,
@@ -68,18 +55,7 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
     ]);
     $this->_apiversion = $version;
 
-    $this->setPermissions([
-      'access CiviCRM',
-      'access CiviContribute',
-      'edit contributions',
-      'delete in CiviContribute',
-      'view contributions of type Donation',
-      'delete contributions of type Donation',
-      'add contributions of type Donation',
-      'edit contributions of type Donation',
-    ]);
-    Civi::settings()->set('acl_financial_type', TRUE);
-    $this->createLoggedInUser();
+    $this->setupLoggedInUserWithLimitedFinancialTypeAccess();
 
     $lineItems = $this->callAPISuccess('LineItem', 'get', ['sequential' => TRUE])['values'];
     $this->assertCount(2, $lineItems);
@@ -105,19 +81,6 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
     $this->callAPISuccess('LineItem', 'Create', ['id' => $line['id'], 'check_permissions' => TRUE, 'financial_type_id' => 'Donation']);
   }
 
-  /**
-   * Set ACL permissions, overwriting any existing ones.
-   *
-   * @param array $permissions
-   *   Array of permissions e.g ['access CiviCRM','access CiviContribute'],
-   */
-  protected function setPermissions($permissions) {
-    CRM_Core_Config::singleton()->userPermissionClass->permissions = $permissions;
-    if (isset(\Civi::$statics['CRM_Financial_BAO_FinancialType'])) {
-      unset(\Civi::$statics['CRM_Financial_BAO_FinancialType']);
-    }
-  }
-
   /**
    * @return mixed
    * @throws \API_Exception
diff --git a/ext/financialacls/tests/phpunit/Civi/Financialacls/MembershipTypesTest.php b/ext/financialacls/tests/phpunit/Civi/Financialacls/MembershipTypesTest.php
new file mode 100644 (file)
index 0000000..8e63eee
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+
+namespace Civi\Financialacls;
+
+use Civi\Api4\MembershipType;
+
+// I fought the Autoloader and the autoloader won.
+require_once 'BaseTestClass.php';
+
+/**
+ * @group headless
+ */
+class MembershipTypesTest extends BaseTestClass {
+
+  /**
+   * Test buildMembershipTypes.
+   */
+  public function testMembershipTypesHook() {
+    $types = MembershipType::save(FALSE)->setRecords([
+      ['name' => 'Forbidden', 'financial_type_id:name' => 'Member Dues'],
+      ['name' => 'Go for it', 'financial_type_id:name' => 'Donation'],
+    ])->setDefaults(['period_type' => 'rolling', 'member_of_contact_id' => 1])->execute()->indexBy('name');
+    $this->setupLoggedInUserWithLimitedFinancialTypeAccess();
+    $permissionedTypes = \CRM_Member_BAO_Membership::buildMembershipTypeValues(new \CRM_Member_Form_Membership());
+    $this->assertEquals([$types['Go for it']['id']], array_keys($permissionedTypes));
+  }
+
+}