From f3460c7964bc541ef7cbad504eaa311275b4b173 Mon Sep 17 00:00:00 2001
From: Eileen McNaughton <emcnaughton@wikimedia.org>
Date: Sat, 23 Oct 2021 14:24:22 +1300
Subject: [PATCH] Fix cleanup on test, also NFC cleanup

This test was not cleaning itself up very well in the tearDown - causing the post test validate to fail
---
 tests/phpunit/api/v3/PledgePaymentTest.php | 145 ++++++++++-----------
 1 file changed, 67 insertions(+), 78 deletions(-)

diff --git a/tests/phpunit/api/v3/PledgePaymentTest.php b/tests/phpunit/api/v3/PledgePaymentTest.php
index 09bced8d998e..fb685367197b 100644
--- a/tests/phpunit/api/v3/PledgePaymentTest.php
+++ b/tests/phpunit/api/v3/PledgePaymentTest.php
@@ -37,63 +37,47 @@ public function setUp(): void {
 
   /**
    * Clean up after function.
-   * @throws \CRM_Core_Exception
    */
   public function tearDown(): void {
-    $tablesToTruncate = [
-      'civicrm_contribution',
-      'civicrm_contact',
-      'civicrm_pledge',
-      'civicrm_pledge_payment',
-      'civicrm_line_item',
-    ];
-
-    $this->quickCleanup($tablesToTruncate);
+    $this->quickCleanUpFinancialEntities();
     parent::tearDown();
   }
 
-  public function testGetPledgePayment() {
+  public function testGetPledgePayment(): void {
     $params = [];
-    $result = $this->callAPIAndDocument('pledge_payment', 'get', $params, __FUNCTION__, __FILE__);
-    $this->assertEquals(5, $result['count'], " in line " . __LINE__);
+    $result = $this->callAPIAndDocument('PledgePayment', 'get', $params, __FUNCTION__, __FILE__);
+    $this->assertEquals(5, $result['count']);
   }
 
   /**
    * Test that passing in a single variable works.
    */
-  public function testGetSinglePledgePayment() {
-    $createparams = [
+  public function testGetSinglePledgePayment(): void {
+    $this->callAPISuccess('PledgePayment', 'create', [
       'contact_id' => $this->_individualId,
       'pledge_id' => $this->_pledgeID,
       'contribution_id' => $this->_contributionID,
       'status_id' => 1,
-    ];
-    $createResult = $this->callAPISuccess('pledge_payment', 'create', $createparams);
-    $params = [
-      'contribution_id' => $this->_contributionID,
-    ];
-    $result = $this->callAPISuccess('pledge_payment', 'get', $params);
-    $this->assertEquals(1, $result['count'], " in line " . __LINE__);
+    ]);
+    $result = $this->callAPISuccess('PledgePayment', 'get', ['contribution_id' => $this->_contributionID]);
+    $this->assertEquals(1, $result['count']);
   }
 
   /**
    * Test process_pledge job log.
    */
-  public function testProcessPledgeJob() {
-    $pledgeStatuses = CRM_Core_OptionGroup::values('pledge_status',
-      FALSE, FALSE, FALSE, NULL, 'name'
-    );
+  public function testProcessPledgeJob(): void {
     //Make first payment.
     $paymentParams = [
       'contact_id' => $this->_individualId,
       'pledge_id' => $this->_pledgeID,
       'contribution_id' => $this->_contributionID,
-      'scheduled_date' => date('Ymd', strtotime("-1 days")),
-      'status_id' => array_search('Pending', $pledgeStatuses),
+      'scheduled_date' => date('Ymd', strtotime('-1 days')),
+      'status_id' => 'Pending',
     ];
-    $firstPayment = $this->callAPISuccess('pledge_payment', 'create', $paymentParams);
+    $this->callAPISuccess('PledgePayment', 'create', $paymentParams);
     //Status should be 'Pending' after first incomplete payment.
-    $checkStatus = $this->callAPISuccess('pledge', 'getsingle', [
+    $checkStatus = $this->callAPISuccess('Pledge', 'getsingle', [
       'id' => $this->_pledgeID,
       'return' => 'pledge_status',
     ]);
@@ -101,10 +85,10 @@ public function testProcessPledgeJob() {
 
     //Execute process_pledge job log.
     $result = $this->callAPISuccess('Job', 'process_pledge', []);
-    $this->assertEquals("Checking if status update is needed for Pledge Id: {$this->_pledgeID} (current status is Pending)\n\r- status updated to: Overdue\n\r1 records updated.", $result['values']);
+    $this->assertEquals("Checking if status update is needed for Pledge Id: $this->_pledgeID (current status is Pending)\n\r- status updated to: Overdue\n\r1 records updated.", $result['values']);
 
     //Status should be 'Overdue' after processing.
-    $statusAfterProcessing = $this->callAPISuccess('pledge', 'getsingle', [
+    $statusAfterProcessing = $this->callAPISuccess('Pledge', 'getsingle', [
       'id' => $this->_pledgeID,
       'return' => 'pledge_status',
     ]);
@@ -114,9 +98,9 @@ public function testProcessPledgeJob() {
   /**
    * Test status of pledge on payments and cancellation.
    */
-  public function testPledgeStatus() {
+  public function testPledgeStatus(): void {
     //Status should initially be Pending.
-    $checkStatus = $this->callAPISuccess('pledge', 'getsingle', [
+    $checkStatus = $this->callAPISuccess('Pledge', 'getsingle', [
       'id' => $this->_pledgeID,
       'return' => 'pledge_status',
     ]);
@@ -129,10 +113,10 @@ public function testPledgeStatus() {
       'contribution_id' => $this->_contributionID,
       'status_id' => 1,
     ];
-    $firstPayment = $this->callAPISuccess('pledge_payment', 'create', $paymentParams);
+    $firstPayment = $this->callAPISuccess('PledgePayment', 'create', $paymentParams);
 
     //Status should be 'In Progress' after first payment.
-    $checkStatus = $this->callAPISuccess('pledge', 'getsingle', [
+    $checkStatus = $this->callAPISuccess('Pledge', 'getsingle', [
       'id' => $this->_pledgeID,
       'return' => 'pledge_status',
     ]);
@@ -142,48 +126,47 @@ public function testPledgeStatus() {
     $paymentStatusTypes = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
     $updateParams = [
       'id' => $this->_pledgeID,
-      'status_id' => array_search('Cancelled', $paymentStatusTypes),
+      'status_id' => 'Cancelled',
     ];
-    $this->callAPISuccess('pledge', 'create', $updateParams);
+    $this->callAPISuccess('Pledge', 'create', $updateParams);
 
     //Status should be calculated as Cancelled.
     $pledgeStatus = CRM_Pledge_BAO_PledgePayment::calculatePledgeStatus($this->_pledgeID);
     $this->assertEquals('Cancelled', $paymentStatusTypes[$pledgeStatus]);
 
     //Already completed payments should not be cancelled.
-    $checkPaymentStatus = $this->callAPISuccess('pledge_payment', 'getsingle', [
+    $checkPaymentStatus = $this->callAPISuccess('PledgePayment', 'getsingle', [
       'id' => $firstPayment['id'],
       'return' => 'status_id',
     ]);
-    $this->assertEquals(array_search('Completed', $paymentStatusTypes), $checkPaymentStatus['status_id']);
+    $this->assertEquals('Completed', CRM_Core_PseudoConstant::getName('CRM_Pledge_BAO_Pledge', 'status_id', $checkPaymentStatus['status_id']));
   }
 
   /**
    * Test that passing in a single variable works:: status_id
    */
-  public function testGetSinglePledgePaymentByStatusID() {
-    $createparams = [
+  public function testGetSinglePledgePaymentByStatusID(): void {
+    $this->callAPISuccess('PledgePayment', 'create', [
       'contact_id' => $this->_individualId,
       'pledge_id' => $this->_pledgeID,
       'contribution_id' => $this->_contributionID,
       'status_id' => 1,
-    ];
-    $createResult = $this->callAPISuccess('pledge_payment', 'create', $createparams);
+    ]);
     $params = [
       'status_id' => 1,
     ];
 
-    $result = $this->callAPISuccess('pledge_payment', 'get', $params);
-    $this->assertEquals(1, $result['count'], " in line " . __LINE__);
+    $result = $this->callAPISuccess('PledgePayment', 'get', $params);
+    $this->assertEquals(1, $result['count']);
   }
 
   /**
    * Test that creating a payment will add the contribution ID.
    */
-  public function testCreatePledgePayment() {
+  public function testCreatePledgePayment(): void {
     //check that 5 pledge payments exist at the start
-    $beforeAdd = $this->callAPISuccess('pledge_payment', 'get', []);
-    $this->assertEquals(5, $beforeAdd['count'], " in line " . __LINE__);
+    $beforeAdd = $this->callAPISuccess('PledgePayment', 'get', []);
+    $this->assertEquals(5, $beforeAdd['count']);
 
     //test the pledge_payment_create function
     $params = [
@@ -193,17 +176,17 @@ public function testCreatePledgePayment() {
       'status_id' => 1,
       'actual_amount' => 20,
     ];
-    $result = $this->callAPIAndDocument('pledge_payment', 'create', $params, __FUNCTION__, __FILE__);
+    $result = $this->callAPIAndDocument('PledgePayment', 'create', $params, __FUNCTION__, __FILE__);
 
     //check existing updated not new one created - 'create' means add contribution_id in this context
-    $afterAdd = $this->callAPISuccess('pledge_payment', 'get', []);
-    $this->assertEquals(5, $afterAdd['count'], " in line " . __LINE__);
+    $afterAdd = $this->callAPISuccess('PledgePayment', 'get', []);
+    $this->assertEquals(5, $afterAdd['count']);
 
     //get the created payment & check it out
     $getParams['id'] = $result['id'];
-    $getIndPayment = $this->callAPISuccess('pledge_payment', 'get', $getParams);
-    $this->assertEquals(1, $getIndPayment['count'], " in line " . __LINE__);
-    $this->assertEquals(20, $getIndPayment['values'][$result['id']]['actual_amount'], " in line " . __LINE__);
+    $getIndPayment = $this->callAPISuccess('PledgePayment', 'get', $getParams);
+    $this->assertEquals(1, $getIndPayment['count']);
+    $this->assertEquals(20, $getIndPayment['values'][$result['id']]['actual_amount']);
 
     //create a second pledge payment - need a contribution first &can't use the CiviUnitTest case function as invoice is hard-coded
     $contributionParams = [
@@ -214,18 +197,18 @@ public function testCreatePledgePayment() {
     $contribution = $this->callAPISuccess('contribution', 'create', $contributionParams);
     $params['contribution_id'] = $contribution['id'];
 
-    $resultCont2 = $this->callAPISuccess('pledge_payment', 'create', $params);
+    $resultCont2 = $this->callAPISuccess('PledgePayment', 'create', $params);
     //make sure original is untouched & has not been updated
-    $this->assertGreaterThan($result['id'], $resultCont2['id'], " in line " . __LINE__);
-    $getIndPaymentAgain = $this->callAPISuccess('pledge_payment', 'get', $getParams);
-    $this->assertEquals(1, $getIndPaymentAgain['count'], " in line " . __LINE__);
-    $this->assertEquals($this->_contributionID, $getIndPaymentAgain['values'][$result['id']]['contribution_id'], " in line " . __LINE__);
+    $this->assertGreaterThan($result['id'], $resultCont2['id']);
+    $getIndPaymentAgain = $this->callAPISuccess('PledgePayment', 'get', $getParams);
+    $this->assertEquals(1, $getIndPaymentAgain['count']);
+    $this->assertEquals($this->_contributionID, $getIndPaymentAgain['values'][$result['id']]['contribution_id']);
   }
 
   /**
    * Test checks behaviour when more payments are created than should be possible.
    */
-  public function testCreatePledgePaymentAllCreated() {
+  public function testCreatePledgePaymentAllCreated(): void {
     $params = [
       'pledge_id' => $this->_pledgeID,
       'status_id' => 1,
@@ -241,8 +224,12 @@ public function testCreatePledgePaymentAllCreated() {
       $contribution = $this->callAPISuccess('contribution', 'create', $contributionParams);
 
       $params['contribution_id'] = $contribution['id'];
-
-      $resultCont2 = civicrm_api('pledge_payment', 'create', $params + ['version' => $this->_apiversion]);
+      if ($i < 5) {
+        $this->callAPISuccess('PledgePayment', 'create', $params);
+      }
+      else {
+        $this->callAPIFailure('PledgePayment', 'create', $params, "There are no unmatched payment on this pledge. Pass in the pledge_payment id to specify one or 'option.create_new' to create one");
+      }
       $i++;
     }
     // check that only 5 exist & we got an error setting the 6th
@@ -250,13 +237,12 @@ public function testCreatePledgePaymentAllCreated() {
       'pledge_id' => $this->_pledgeID,
     ]);
     // the last one above should result in an error
-    $this->assertEquals("There are no unmatched payment on this pledge. Pass in the pledge_payment id to specify one or 'option.create_new' to create one", $resultCont2['error_message']);
     $this->assertEquals(5, $result['count']);
 
     $params['option.create_new'] = 1;
     $params['scheduled_amount'] = 20;
     $params['scheduled_date'] = '20131212';
-    $resultcreatenew = $this->callAPISuccess('pledge_payment', 'create', $params);
+    $this->callAPISuccess('PledgePayment', 'create', $params);
     $result = $this->callAPISuccess('PledgePayment', 'Get', [
       'pledge_id' => $this->_pledgeID,
     ]);
@@ -267,7 +253,7 @@ public function testCreatePledgePaymentAllCreated() {
   /**
    * Test that creating a payment adds the contribution ID where only one pledge payment is in schedule.
    */
-  public function testCreatePledgePaymentWhereOnlyOnePayment() {
+  public function testCreatePledgePaymentWhereOnlyOnePayment(): void {
     $pledgeParams = [
       'contact_id' => $this->_individualId,
       'pledge_create_date' => date('Ymd'),
@@ -300,33 +286,36 @@ public function testCreatePledgePaymentWhereOnlyOnePayment() {
       'status_id' => 1,
       'actual_amount' => 20,
     ];
-    $result = $this->callAPISuccess('pledge_payment', 'create', $params);
+    $this->callAPISuccess('PledgePayment', 'create', $params);
 
     //check existing updated not new one created - 'create' means add contribution_id in this context
-    $afterAdd = $this->callAPISuccess('pledge_payment', 'get', [
+    $afterAdd = $this->callAPISuccess('PledgePayment', 'get', [
       'contribution_id' => $contributionID,
     ]);
-    $this->assertEquals(1, $afterAdd['count'], " in line " . __LINE__);
+    $this->assertEquals(1, $afterAdd['count']);
   }
 
-  public function testUpdatePledgePayment() {
+  /**
+   * @throws \CRM_Core_Exception
+   */
+  public function testUpdatePledgePayment(): void {
     $params = [
       'pledge_id' => $this->_pledgeID,
       'contribution_id' => $this->_contributionID,
       'status_id' => 2,
       'actual_amount' => 20,
     ];
-    $result = $this->callAPISuccess('pledge_payment', 'create', $params);
-    $updateparams = [
+    $result = $this->callAPISuccess('PledgePayment', 'create', $params);
+    $updateParams = [
       'id' => $result['id'],
       'status_id' => 1,
     ];
 
-    $result = $this->callAPIAndDocument('pledge_payment', 'update', $updateparams, __FUNCTION__, __FILE__);
-    $this->getAndCheck(array_merge($params, $updateparams), $result['id'], $this->_entity);
+    $result = $this->callAPIAndDocument('PledgePayment', 'update', $updateParams, __FUNCTION__, __FILE__);
+    $this->getAndCheck(array_merge($params, $updateParams), $result['id'], $this->_entity);
   }
 
-  public function testDeletePledgePayment() {
+  public function testDeletePledgePayment(): void {
     $params = [
       'contact_id' => $this->_individualId,
       'pledge_id' => $this->_pledgeID,
@@ -335,15 +324,15 @@ public function testDeletePledgePayment() {
       'sequential' => 1,
       'actual_amount' => 20,
     ];
-    $pledgePayment = $this->callAPISuccess('pledge_payment', 'create', $params);
+    $pledgePayment = $this->callAPISuccess('PledgePayment', 'create', $params);
 
     $deleteParams = [
       'id' => $pledgePayment['id'],
     ];
-    $result = $this->callAPIAndDocument('pledge_payment', 'delete', $deleteParams, __FUNCTION__, __FILE__);
+    $this->callAPIAndDocument('PledgePayment', 'delete', $deleteParams, __FUNCTION__, __FILE__);
   }
 
-  public function testGetFields() {
+  public function testGetFields(): void {
     $result = $this->callAPISuccess('PledgePayment', 'GetFields', []);
     $this->assertIsArray($result);
   }