test break fixes
[civicrm-core.git] / tests / phpunit / api / v3 / ContributionPageTest.php
index 6380c117866689bce36159f41961161892a46899..edc3642002cc06431b39435caf9539729f554944 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.5                                                |
+ | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
@@ -31,10 +31,9 @@ require_once 'CiviTest/CiviUnitTestCase.php';
 /**
  *  Test APIv3 civicrm_contribute_recur* functions
  *
- *  @package CiviCRM_APIv3
- *  @subpackage API_Contribution
+ * @package CiviCRM_APIv3
+ * @subpackage API_Contribution
  */
-
 class api_v3_ContributionPageTest extends CiviUnitTestCase {
   protected $_apiversion = 3;
   protected $testAmount = 34567;
@@ -42,7 +41,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
   protected $id = 0;
   protected $contactIds = array();
   protected $_entity = 'contribution_page';
-  protected $contribution_result = null;
+  protected $contribution_result = NULL;
   protected $_priceSetParams = array();
   /**
    * Payment processor details
@@ -61,6 +60,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
 
 
   public $DBResetRequired = TRUE;
+
   public function setUp() {
     parent::setUp();
     $this->contactIds[] = $this->individualCreate();
@@ -77,11 +77,11 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
       'is_quick_config' => 1,
       'extends' => 'CiviContribute',
       'financial_type_id' => 'Donation',
-      'title' => 'my Page'
+      'title' => 'my Page',
     );
   }
 
-  function tearDown() {
+  public function tearDown() {
     foreach ($this->contactIds as $id) {
       $this->callAPISuccess('contact', 'delete', array('id' => $id));
     }
@@ -110,7 +110,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     $createResult = $this->callAPISuccess($this->_entity, 'create', $this->params);
     $this->id = $createResult['id'];
     $getParams = array(
-      'amount' => ''. $this->testAmount, // 3456
+      'amount' => '' . $this->testAmount, // 3456
       'currency' => 'NZD',
       'financial_type_id' => 1,
     );
@@ -142,12 +142,13 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     $submitParams = array(
       'price_' . $priceFieldID => $priceFieldValueID,
       'id' => (int) $this->_ids['contribution_page'],
-      'amount' => 10
+      'amount' => 10,
     );
 
     $this->callAPISuccess('contribution_page', 'submit', $submitParams);
     $this->callAPISuccess('contribution', 'getsingle', array('contribution_page_id' => $this->_ids['contribution_page']));
   }
+
   /**
    * Test submit with a membership block in place
    */
@@ -211,7 +212,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     );
 
     $this->callAPIAndDocument('contribution_page', 'submit', $submitParams, __FUNCTION__, __FILE__, 'submit contribution page', NULL, 'Submit');
-    $contributions = $this->callAPISuccess('contribution', 'get', array('contribution_page_id' => $this->_ids['contribution_page'],));
+    $contributions = $this->callAPISuccess('contribution', 'get', array('contribution_page_id' => $this->_ids['contribution_page']));
     $this->assertCount(2, $contributions['values']);
     $ids = array_keys($contributions['values']);
     $this->assertEquals('10.00', $contributions['values'][$ids[0]]['total_amount']);
@@ -238,12 +239,15 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
       'payment_processor' => 1,
       'credit_card_number' => '4111111111111111',
       'credit_card_type' => 'Visa',
-      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040 ),
+      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040),
       'cvv2' => 123,
     );
 
     $this->callAPIAndDocument('contribution_page', 'submit', $submitParams, __FUNCTION__, __FILE__, 'submit contribution page', NULL, 'Submit');
-    $contributions = $this->callAPISuccess('contribution', 'get', array('contribution_page_id' => $this->_ids['contribution_page'], 'contribution_status_id' => 1));
+    $contributions = $this->callAPISuccess('contribution', 'get', array(
+      'contribution_page_id' => $this->_ids['contribution_page'],
+      'contribution_status_id' => 1,
+    ));
     $this->assertCount(2, $contributions['values']);
     $membershipPayment = $this->callAPISuccess('membership_payment', 'getsingle', array());
     $this->assertTrue(in_array($membershipPayment['contribution_id'], array_keys($contributions['values'])));
@@ -252,7 +256,11 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
   }
 
   /**
-   * Test submit with a membership block in place
+   * Test submit recurring membership with immediate confirmation (IATS style)
+   * - we process 2 membership transactions against with a recurring contribution against a contribution page with an immediate
+   * processor (IASTS style - denoted by returning trxn_id)
+   * - the first creates a new membership, completed contribution, in progress recurring. Check these
+   * - create another - end date should be extended
    */
   public function testSubmitMembershipPriceSetPaymentPaymentProcessorRecur() {
     $this->params['is_recur'] = 1;
@@ -260,7 +268,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     $this->params['recur_frequency_unit'] = 'month';
     $this->setUpMembershipContributionPage();
     $dummyPP = CRM_Core_Payment::singleton('live', $this->_paymentProcessor);
-    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 1, 'trxn_id' => 1233,));
+    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 1, 'trxn_id' => 'create_first_success'));
 
     $submitParams = array(
       'price_' . $this->_ids['price_field'][0] => reset($this->_ids['price_field_value']),
@@ -274,7 +282,7 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
       'payment_processor' => 1,
       'credit_card_number' => '4111111111111111',
       'credit_card_type' => 'Visa',
-      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040 ),
+      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040),
       'cvv2' => 123,
       'is_recur' => 1,
       'frequency_interval' => 1,
@@ -282,36 +290,47 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     );
 
     $this->callAPIAndDocument('contribution_page', 'submit', $submitParams, __FUNCTION__, __FILE__, 'submit contribution page', NULL, 'Submit');
-    $contribution = $this->callAPISuccess('contribution', 'getsingle', array('contribution_page_id' => $this->_ids['contribution_page'], 'contribution_status_id' => 1));
+    $contribution = $this->callAPISuccess('contribution', 'getsingle', array(
+      'contribution_page_id' => $this->_ids['contribution_page'],
+      'contribution_status_id' => 1,
+    ));
     $membershipPayment = $this->callAPISuccess('membership_payment', 'getsingle', array());
     $this->assertEquals($membershipPayment['contribution_id'], $contribution['id']);
     $membership = $this->callAPISuccessGetSingle('membership', array('id' => $membershipPayment['membership_id']));
     $this->assertEquals($membership['contact_id'], $contribution['contact_id']);
     $this->assertEquals(1, $membership['status_id']);
     $this->callAPISuccess('contribution_recur', 'getsingle', array('id' => $contribution['contribution_recur_id']));
-
+    //@todo - check with Joe about these not existing
+    //$this->callAPISuccess('line_item', 'getsingle', array('contribution_id' => $contribution['id'], 'entity_id' => $membership['id']));
     //renew it with processor setting completed - should extend membership
     $submitParams['contact_id'] = $contribution['contact_id'];
-    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 1, 'trxn_id' => 1234,));
+    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 1, 'trxn_id' => 'create_second_success'));
     $this->callAPISuccess('contribution_page', 'submit', $submitParams);
-    $this->callAPISuccess('contribution', 'getsingle', array('id' => array('NOT IN' => array($contribution['id'])), 'contribution_page_id' => $this->_ids['contribution_page'], 'contribution_status_id' => 1));
+    $this->callAPISuccess('contribution', 'getsingle', array(
+      'id' => array('NOT IN' => array($contribution['id'])),
+      'contribution_page_id' => $this->_ids['contribution_page'],
+      'contribution_status_id' => 1,
+    ));
     $renewedMembership = $this->callAPISuccessGetSingle('membership', array('id' => $membershipPayment['membership_id']));
     $this->assertEquals(date('Y-m-d', strtotime('+ 1 year', strtotime($membership['end_date']))), $renewedMembership['end_date']);
     $recurringContribution = $this->callAPISuccess('contribution_recur', 'getsingle', array('id' => $contribution['contribution_recur_id']));
-    //@todo this assertion should pass
-    //$this->assertEquals(5, $recurringContribution['contribution_status_id']);
+    $this->assertEquals(2, $recurringContribution['contribution_status_id']);
   }
 
   /**
-   * Test submit with a membership block in place
+   * Test submit recurring membership with delayed confirmation (Authorize.net style)
+   * - we process 2 membership transactions against with a recurring contribution against a contribution page with a delayed
+   * processor (Authorize.net style - denoted by NOT returning trxn_id)
+   * - the first creates a pending membership, pending contribution, penging recurring. Check these
+   * - complete the transaction
+   * - create another - end date should NOT be extended
    */
   public function testSubmitMembershipPriceSetPaymentPaymentProcessorRecurDelayed() {
     $this->params['is_recur'] = 1;
-    $var = array();
     $this->params['recur_frequency_unit'] = 'month';
     $this->setUpMembershipContributionPage();
     $dummyPP = CRM_Core_Payment::singleton('live', $this->_paymentProcessor);
-    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 1, 'trxn_id' => 1233,));
+    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 2));
 
     $submitParams = array(
       'price_' . $this->_ids['price_field'][0] => reset($this->_ids['price_field_value']),
@@ -325,43 +344,61 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
       'payment_processor' => 1,
       'credit_card_number' => '4111111111111111',
       'credit_card_type' => 'Visa',
-      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040 ),
+      'credit_card_exp_date' => array('M' => 9, 'Y' => 2040),
       'cvv2' => 123,
+      'is_recur' => 1,
+      'frequency_interval' => 1,
+      'frequency_unit' => 'month',
     );
 
     $this->callAPIAndDocument('contribution_page', 'submit', $submitParams, __FUNCTION__, __FILE__, 'submit contribution page', NULL, 'Submit');
-    $contribution = $this->callAPISuccess('contribution', 'getsingle', array('contribution_page_id' => $this->_ids['contribution_page'], 'contribution_status_id' => 1));
+    $contribution = $this->callAPISuccess('contribution', 'getsingle', array(
+      'contribution_page_id' => $this->_ids['contribution_page'],
+      'contribution_status_id' => 2,
+    ));
     $membershipPayment = $this->callAPISuccess('membership_payment', 'getsingle', array());
     $this->assertEquals($membershipPayment['contribution_id'], $contribution['id']);
     $membership = $this->callAPISuccessGetSingle('membership', array('id' => $membershipPayment['membership_id']));
     $this->assertEquals($membership['contact_id'], $contribution['contact_id']);
-    $this->assertEquals(1, $membership['status_id']);
-
+    $this->assertEquals(5, $membership['status_id']);
+    //@todo - check with Joe about these not existing
+    //$this->callAPISuccess('line_item', 'getsingle', array('contribution_id' => $contribution['id'], 'entity_id' => $membership['id']));
+    $this->callAPISuccess('contribution', 'completetransaction', array(
+      'id' => $contribution['id'],
+      'trxn_id' => 'ipn_called',
+    ));
+    $membership = $this->callAPISuccessGetSingle('membership', array('id' => $membershipPayment['membership_id']));
     //renew it with processor setting completed - should extend membership
     $submitParams = array_merge($submitParams, array(
-      'contact_id' => $contribution['contact_id'],
-      'is_recur' => 1,
-      'frequency_interval' => 1,
-      'frequency_unit' => 'month',)
+        'contact_id' => $contribution['contact_id'],
+        'is_recur' => 1,
+        'frequency_interval' => 1,
+        'frequency_unit' => 'month',
+      )
     );
-    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 2,));
-    $this->markTestIncomplete('currently failing - this needs fixing per CRM-15296 as it shows that renewals are being actioned even when payment is not');
+    $dummyPP->setDoDirectPaymentResult(array('contribution_status_id' => 2));
     $this->callAPISuccess('contribution_page', 'submit', $submitParams);
-    $this->callAPISuccess('contribution', 'getsingle', array('id' => array(
-      'NOT IN' => array($contribution['id'])), 'contribution_page_id' => $this->_ids['contribution_page'], 'contribution_status_id' => 2)
+    $newContribution = $this->callAPISuccess('contribution', 'getsingle', array(
+        'id' => array(
+          'NOT IN' => array($contribution['id']),
+        ),
+        'contribution_page_id' => $this->_ids['contribution_page'],
+        'contribution_status_id' => 2,
+      )
     );
+
     $renewedMembership = $this->callAPISuccessGetSingle('membership', array('id' => $membershipPayment['membership_id']));
     //no renewal as the date hasn't changed
     $this->assertEquals($membership['end_date'], $renewedMembership['end_date']);
-    $recurringContribution = $this->callAPISuccess('contribution_recur', 'getsingle', array('id' => $contribution['contribution_recur_id']));
-    $this->assertEquals(5, $recurringContribution['status_id']);
+    $recurringContribution = $this->callAPISuccess('contribution_recur', 'getsingle', array('id' => $newContribution['contribution_recur_id']));
+    $this->assertEquals(2, $recurringContribution['contribution_status_id']);
   }
 
   /**
-   * set up membership contribution page
+   * Set up membership contribution page
    * @param bool $isSeparatePayment
    */
-  function setUpMembershipContributionPage($isSeparatePayment = FALSE) {
+  public function setUpMembershipContributionPage($isSeparatePayment = FALSE) {
     $this->setUpMembershipBlockPriceSet();
     $this->params['payment_processor_id'] = $this->_ids['payment_processor'] = $this->paymentProcessorCreate(array(
       'payment_processor_type_id' => 'Dummy',
@@ -385,8 +422,11 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
    * The default data set does not include a complete default membership price set - not quite sure why
    * This function ensures it exists & populates $this->_ids with it's data
    */
-  function setUpMembershipBlockPriceSet() {
-    $this->_ids['price_set'][] = $this->callAPISuccess('price_set', 'getvalue', array('name' => 'default_membership_type_amount', 'return' => 'id'));
+  public function setUpMembershipBlockPriceSet() {
+    $this->_ids['price_set'][] = $this->callAPISuccess('price_set', 'getvalue', array(
+      'name' => 'default_membership_type_amount',
+      'return' => 'id',
+    ));
     if (empty($this->_ids['membership_type'])) {
       $this->_ids['membership_type'] = array($this->membershipTypeCreate(array('minimum_fee' => 2)));
     }
@@ -413,16 +453,16 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
   }
 
   /**
-   * help function to set up contribution page with some defaults
+   * Help function to set up contribution page with some defaults
    */
-  function setUpContributionPage() {
+  public function setUpContributionPage() {
     $contributionPageResult = $this->callAPISuccess($this->_entity, 'create', $this->params);
     if (empty($this->_ids['price_set'])) {
       $priceSet = $this->callAPISuccess('price_set', 'create', $this->_priceSetParams);
       $this->_ids['price_set'][] = $priceSet['id'];
     }
     $priceSetID = reset($this->_ids['price_set']);
-    CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageResult['id'], $priceSetID );
+    CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageResult['id'], $priceSetID);
 
     if (empty($this->_ids['price_field'])) {
       $priceField = $this->callAPISuccess('price_field', 'create', array(
@@ -453,10 +493,10 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
   }
 
   public static function setUpBeforeClass() {
-      // put stuff here that should happen before all tests in this unit
+    // put stuff here that should happen before all tests in this unit
   }
 
-  public static function tearDownAfterClass(){
+  public static function tearDownAfterClass() {
     $tablesToTruncate = array(
       'civicrm_contact',
       'civicrm_financial_type',
@@ -467,4 +507,3 @@ class api_v3_ContributionPageTest extends CiviUnitTestCase {
     $unitTest->quickCleanup($tablesToTruncate);
   }
 }
-