don't allow multiple currencies in a batch
[civicrm-core.git] / tests / phpunit / api / v3 / EntityBatchTest.php
index 9446092ee48172911014483beb9e50546fcdbad6..8250199962cd6019230611dfec6968afb0178db2 100644 (file)
  * @group headless
  */
 class api_v3_EntityBatchTest extends CiviUnitTestCase {
-
-  protected $_apiversion = 3;
   protected $params;
   protected $id;
   protected $_entity;
 
   public $DBResetRequired = FALSE;
 
-  public function setUp() {
+  /**
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   */
+  public function setUp(): void {
     parent::setUp();
-    $this->useTransaction(TRUE);
+    $this->useTransaction();
+
+    $entityParams = ['contact_id' => $this->individualCreate()];
 
-    $entityParams = ['contact_id' => 1];
+    $contributionId = $this->contributionCreate($entityParams);
+    $financialTrxnId = array_values($this->callAPISuccess('EntityFinancialTrxn', 'get', [
+      'entity_id' => $contributionId,
+      'entity_table' => 'civicrm_contribution',
+      'return' => ['financial_trxn_id'],
+    ])['values'])[0]['financial_trxn_id'];
 
     $this->_entity = 'EntityBatch';
-    $this->_entityID = $this->contributionCreate($entityParams);
-    $this->_batchID = $this->batchCreate();
     $this->params = [
-      'entity_id' => $this->_entityID,
-      'batch_id' => $this->_batchID,
+      'entity_id' => $financialTrxnId,
+      'batch_id' => $this->batchCreate(),
       'entity_table' => 'civicrm_financial_trxn',
     ];
   }
 
-  public function testCreateEntityBatch() {
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function testCreateEntityBatch(): void {
     $result = $this->callAPIAndDocument($this->_entity, 'create', $this->params, __FUNCTION__, __FILE__);
     $this->assertEquals(1, $result['count']);
     $this->getAndCheck($this->params, $result['id'], $this->_entity);
     $this->assertNotNull($result['values'][$result['id']]['id']);
   }
 
-  public function testGetEntityBatch() {
-    $result = $this->callAPISuccess($this->_entity, 'create', $this->params);
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function testGetEntityBatch(): void {
+    $this->callAPISuccess($this->_entity, 'create', $this->params);
     $result = $this->callAPIAndDocument($this->_entity, 'get', $this->params, __FUNCTION__, __FILE__);
     $this->assertEquals(1, $result['count']);
     $this->assertNotNull($result['values'][$result['id']]['id']);
     $this->callAPISuccess($this->_entity, 'delete', ['id' => $result['id']]);
   }
 
-  public function testDeleteEntityBatch() {
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function testDeleteEntityBatch(): void {
     $result = $this->callAPISuccess($this->_entity, 'create', $this->params);
     $deleteParams = ['id' => $result['id']];
-    $result = $this->callAPIAndDocument($this->_entity, 'delete', $deleteParams, __FUNCTION__, __FILE__);
+    $this->callAPIAndDocument($this->_entity, 'delete', $deleteParams, __FUNCTION__, __FILE__);
     $checkDeleted = $this->callAPISuccess($this->_entity, 'get', []);
     $this->assertEquals(0, $checkDeleted['count']);
   }
 
+  /**
+   * Ensure that submitting multiple currencies results in an error.
+   * @throws \CRM_Core_Exception
+   */
+  public function testMultipleCurrencies(): void {
+    $params['name'] = $params['title'] = 'MultiCurrencyBatch';
+    $params['status_id'] = 1;
+    $batchId = $this->callAPISuccess('batch', 'create', $params)['id'];
+
+    $contributionId = $this->contributionCreate(['contact_id' => $this->individualCreate()]);
+    $financialTrxnId = array_values($this->callAPISuccess('EntityFinancialTrxn', 'get', [
+      'entity_id' => $contributionId,
+      'entity_table' => 'civicrm_contribution',
+      'return' => ['financial_trxn_id'],
+    ])['values'])[0]['financial_trxn_id'];
+    $firstEntityBatchParams = [
+      'entity_id' => $financialTrxnId,
+      'batch_id' => $batchId,
+      'entity_table' => 'civicrm_financial_trxn',
+    ];
+    $result = $this->callAPISuccess($this->_entity, 'create', $firstEntityBatchParams);
+    $this->assertEquals(1, $result['count']);
+    $secondContributionId = $this->contributionCreate(['contact_id' => $this->individualCreate(), 'currency' => 'CAD']);
+
+    $secondFinancialTrxnId = array_values($this->callAPISuccess('EntityFinancialTrxn', 'get', [
+      'entity_id' => $secondContributionId,
+      'entity_table' => 'civicrm_contribution',
+      'return' => ['financial_trxn_id'],
+    ])['values'])[0]['financial_trxn_id'];
+    $secondEntityBatchParams = [
+      'entity_id' => $secondFinancialTrxnId,
+      'batch_id' => $batchId,
+      'entity_table' => 'civicrm_financial_trxn',
+    ];
+    $result = $this->callAPIFailure($this->_entity, 'create', $secondEntityBatchParams);
+    $this->assertEquals('You can not add items of two different currencies to a single contribution batch.', $result['error_message']);
+  }
+
 }