Merge branch 4.5 into master
[civicrm-core.git] / tests / phpunit / api / v3 / MembershipTest.php
index 0adfa12a4903b4682225d2d381e59761c58f64fa..d5eb12c08f3824ddc4b019eb86d6c8aa9bb6dd23 100644 (file)
  | GNU Affero General Public License or the licensing of CiviCRM,     |
  | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
  +--------------------------------------------------------------------+
-*/
+ */
 
 /**
  *  Test APIv3 civicrm_membership functions
  *
- *  @package CiviCRM_APIv3
- *  @subpackage API_Member
+ * @package CiviCRM_APIv3
+ * @subpackage API_Member
  */
 
 
@@ -41,10 +41,12 @@ require_once 'CiviTest/CiviUnitTestCase.php';
 class api_v3_MembershipTest extends CiviUnitTestCase {
   protected $_apiversion;
   protected $_contactID;
+  protected $_membershipID;
+  protected $_membershipID2;
+  protected $_membershipID3;
   protected $_membershipTypeID;
   protected $_membershipTypeID2;
   protected $_membershipStatusID;
-  protected $__membershipID;
   protected $_entity;
   protected $_params;
 
@@ -55,7 +57,11 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->_apiversion = 3;
     $this->_contactID = $this->individualCreate();
     $this->_membershipTypeID = $this->membershipTypeCreate(array('member_of_contact_id' => $this->_contactID));
-    $this->_membershipTypeID2 = $this->membershipTypeCreate(array('period_type' => 'fixed','fixed_period_start_day' => '301', 'fixed_period_rollover_day' => '1111'));
+    $this->_membershipTypeID2 = $this->membershipTypeCreate(array(
+      'period_type' => 'fixed',
+      'fixed_period_start_day' => '301',
+      'fixed_period_rollover_day' => '1111',
+    ));
     $this->_membershipStatusID = $this->membershipStatusCreate('test status');
 
     CRM_Member_PseudoConstant::membershipType(NULL, TRUE);
@@ -77,9 +83,9 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
 
   public function tearDown() {
     $this->quickCleanup(array(
-      'civicrm_membership',
-      'civicrm_membership_payment',
-      'civicrm_membership_log',
+        'civicrm_membership',
+        'civicrm_membership_payment',
+        'civicrm_membership_log',
       ),
       TRUE
     );
@@ -97,20 +103,18 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $membershipID = $this->contactMembershipCreate($this->_params);
     $this->assertDBRowExist('CRM_Member_DAO_Membership', $membershipID);
     $params = array(
-      'id' => $membershipID
+      'id' => $membershipID,
     );
-    $result = $this->callAPIAndDocument('membership', 'delete', $params, __FUNCTION__, __FILE__);
+    $this->callAPIAndDocument('membership', 'delete', $params, __FUNCTION__, __FILE__);
     $this->assertDBRowNotExist('CRM_Member_DAO_Membership', $membershipID);
   }
 
   public function testMembershipDeleteEmpty() {
-    $params = array();
-    $result = $this->callAPIFailure('membership', 'delete', $params);
+    $this->callAPIFailure('membership', 'delete', array());
   }
 
   public function testMembershipDeleteInvalidID() {
-    $params = array('id' => 'blah');
-    $result = $this->callAPIFailure('membership', 'delete', $params);
+    $this->callAPIFailure('membership', 'delete', array('id' => 'blah'));
   }
 
   /**
@@ -118,7 +122,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
    */
   public function testMembershipDeleteWithInvalidMembershipId() {
     $membershipId = 'membership';
-    $result = $this->callAPIFailure('membership', 'delete', $membershipId);
+    $this->callAPIFailure('membership', 'delete', $membershipId);
   }
 
   /**
@@ -130,10 +134,8 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
   public function testContactMembershipsGet() {
     $this->_membershipID = $this->contactMembershipCreate($this->_params);
     $params = array();
-    $result = $this->callAPISuccess('membership', 'get', $params);
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
-      'id' => $this->_membershipID,
-    ));
+    $this->callAPISuccess('membership', 'get', $params);
+    $this->callAPISuccess('Membership', 'Delete', array('id' => $this->_membershipID));
   }
 
   /**
@@ -150,7 +152,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $result = $membership['values'][$this->_membershipID];
     $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $this->_membershipID,
-      ));
+    ));
     $this->assertEquals($result['contact_id'], $this->_contactID, "In line " . __LINE__);
     $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID, "In line " . __LINE__);
     $this->assertEquals($result['status_id'], $this->_membershipStatusID, "In line " . __LINE__);
@@ -181,7 +183,6 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $membership = $this->callAPISuccess('membership', 'get', $params);
     $this->assertEquals(1, $membership['count']);
     $this->assertEquals(array($this->_membershipID2), array_keys($membership['values']));
-
   }
 
   /**
@@ -207,17 +208,18 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals(1, $membership['count']);
     $this->assertEquals(array($this->_membershipID2), array_keys($membership['values']));
   }
+
   /**
    * Test civicrm_membership_get with params not array.
    * Gets treated as contact_id, memberships expected.
    */
   public function testGetWithParamsMemberShipTypeId() {
-    $result = $this->callAPISuccess($this->_entity, 'create', $this->_params);
+    $this->callAPISuccess($this->_entity, 'create', $this->_params);
     $params = array(
       'membership_type_id' => $this->_membershipTypeID,
     );
     $membership = $this->callAPISuccess('membership', 'get', $params);
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $membership['id'],
     ));
     $result = $membership['values'][$membership['id']];
@@ -231,6 +233,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals($result['is_override'], 1, "In line " . __LINE__);
     $this->assertEquals($result['id'], $membership['id']);
   }
+
   /**
    * Test civicrm_membership_get with params not array.
    * Gets treated as contact_id, memberships expected.
@@ -257,6 +260,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals($result['contact_id'], $this->_contactID);
     $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID2);
   }
+
   /**
    * Check with complete array + custom field
    * Note that the test is written on purpose without any
@@ -275,7 +279,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $check = $this->callAPIAndDocument($this->_entity, 'get', $getParams, __FUNCTION__, __FILE__);
     $this->assertEquals("custom string", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
 
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
     ));
   }
@@ -315,14 +319,14 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $membershipID = $this->contactMembershipCreate($this->_params);
     $params = array(
       'contact_id' => $this->_contactID,
-      'id' => $this->__membershipID,
+      'id' => $this->_membershipID,
       'return' => 'id',
     );
     $result = $this->callAPISuccess('membership', 'get', $params);
     $this->assertEquals($membershipID, $result['id']);
     $params = array(
       'contact_id' => $this->_contactID,
-      'membership_id' => $this->__membershipID,
+      'membership_id' => $this->_membershipID,
       'return' => 'membership_id',
     );
     $result = $this->callAPISuccess('membership', 'get', $params);
@@ -334,16 +338,15 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
    * Memberships expected.
    */
   public function testGetOnlyActive() {
-    $description          = "Demonstrates use of 'filter' active_only' param";
+    $description = "Demonstrates use of 'filter' active_only' param";
     $this->_membershipID = $this->contactMembershipCreate($this->_params);
-    $subfile             = 'filterIsCurrent';
-    $params              = array(
+    $subfile = 'filterIsCurrent';
+    $params = array(
       'contact_id' => $this->_contactID,
       'active_only' => 1,
     );
 
     $membership = $this->callAPISuccess('membership', 'get', $params);
-    $result = $membership['values'][$this->_membershipID];
     $this->assertEquals($membership['values'][$this->_membershipID]['status_id'], $this->_membershipStatusID);
     $this->assertEquals($membership['values'][$this->_membershipID]['contact_id'], $this->_contactID);
     $params = array(
@@ -354,14 +357,10 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     );
 
     $membership = $this->callAPIAndDocument('membership', 'get', $params, __FUNCTION__, __FILE__, $description, $subfile);
-    $result = $membership['values'][$this->_membershipID];
     $this->assertEquals($membership['values'][$this->_membershipID]['status_id'], $this->_membershipStatusID);
     $this->assertEquals($membership['values'][$this->_membershipID]['contact_id'], $this->_contactID);
 
-
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
-      'id' => $this->_membershipID,
-    ));
+    $this->callAPISuccess('Membership', 'Delete', array('id' => $this->_membershipID));
   }
 
   /**
@@ -403,7 +402,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'period_type' => 'rolling',
       'member_of_contact_id' => $membershipOrgId,
       'domain_id' => 1,
-      'financial_type_id'   => 1,
+      'financial_type_id' => 1,
       'relationship_type_id' => $relTypeID,
       'relationship_direction' => 'b_a',
       'is_active' => 1,
@@ -431,9 +430,9 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
 
     $membership = $result['values'][$membershipID];
     $this->assertEquals($this->_membershipStatusID, $membership['status_id']);
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $membership['id'],
-      ));
+    ));
     $this->membershipTypeDelete(array('id' => $memType['id']));
     $this->relationshipTypeDelete($relTypeID);
     $this->contactDelete($membershipOrgId);
@@ -569,9 +568,9 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
    * We are checking for no enotices + only id & end_date returned
    */
   public function testMembershipGetWithReturn() {
-    $membershipID = $this->contactMembershipCreate($this->_params);
+    $this->contactMembershipCreate($this->_params);
     $result = $this->callAPISuccess('membership', 'get', array('return' => 'end_date'));
-    foreach ($result['values']  as $membership) {
+    foreach ($result['values'] as $membership) {
       $this->assertEquals(array('id', 'end_date'), array_keys($membership));
     }
   }
@@ -583,7 +582,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
    */
   public function testCreateWithEmptyParams() {
     $params = array();
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
   }
 
   /**
@@ -592,7 +591,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
   public function testCreateOverrideNoStatus() {
     $params = $this->_params;
     unset($params['status_id']);
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
   }
 
   public function testMembershipCreateMissingRequired() {
@@ -605,7 +604,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'status_id' => '2',
     );
 
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
   }
 
   public function testMembershipCreate() {
@@ -626,9 +625,10 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals($this->_contactID, $result['values'][$result['id']]['contact_id'], " in line " . __LINE__);
     $this->assertEquals($result['id'], $result['values'][$result['id']]['id'], " in line " . __LINE__);
   }
-  /*
-      * Check for useful message if contact doesn't exist
-      */
+
+  /**
+   * Check for useful message if contact doesn't exist
+   */
   public function testMembershipCreateWithInvalidContact() {
     $params = array(
       'contact_id' => 999,
@@ -641,14 +641,15 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'status_id' => $this->_membershipStatusID,
     );
 
-    $result = $this->callAPIFailure('membership', 'create', $params,
+    $this->callAPIFailure('membership', 'create', $params,
       'contact_id is not valid : 999'
     );
   }
+
   public function testMembershipCreateWithInvalidStatus() {
     $params = $this->_params;
     $params['status_id'] = 999;
-    $result = $this->callAPIFailure('membership', 'create', $params,
+    $this->callAPIFailure('membership', 'create', $params,
       "'999' is not a valid option for field status_id"
     );
   }
@@ -657,7 +658,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $params = $this->_params;
     $params['membership_type_id'] = 999;
 
-    $result = $this->callAPIFailure('membership', 'create', $params,
+    $this->callAPIFailure('membership', 'create', $params,
       "'999' is not a valid option for field membership_type_id"
     );
   }
@@ -675,7 +676,10 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $params['custom_' . $ids['custom_field_id']] = "custom string";
 
     $result = $this->callAPIAndDocument($this->_entity, 'create', $params, __FUNCTION__, __FILE__);
-    $check = $this->callAPISuccess($this->_entity, 'get', array('id' => $result['id'], 'contact_id' => $this->_contactID));
+    $check = $this->callAPISuccess($this->_entity, 'get', array(
+      'id' => $result['id'],
+      'contact_id' => $this->_contactID,
+    ));
     $this->assertEquals("custom string", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
   }
 
@@ -727,7 +731,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $result = $this->callAPISuccess('membership', 'create', $params);
     $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
-      ));
+    ));
 
     $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__);
   }
@@ -751,7 +755,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $result = $this->callAPISuccess('membership', 'create', $params);
     $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
-     ));
+    ));
     $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__);
   }
 
@@ -788,14 +792,15 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'id' => $membershipID,
       'source' => 'changed',
       'contact_id' => $this->_contactID,
-      'status_id' => $this->_membershipStatusID,      'membership_type_id' => $this->_membershipTypeID,
+      'status_id' => $this->_membershipStatusID,
+      'membership_type_id' => $this->_membershipTypeID,
       'skipStatusCal' => 1,
     );
     $result = $this->callAPISuccess('membership', 'create', $params);
     $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__);
     $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
-      ));
+    ));
   }
 
   /**
@@ -807,18 +812,47 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $params = $this->_params;
     $params['custom_' . $ids['custom_field_id']] = "custom string";
     $result = $this->callAPIAndDocument($this->_entity, 'create', $params, __FUNCTION__, __FILE__);
-    $result = $this->callAPISuccess($this->_entity, 'create', array('id' => $result['id'], 'custom_' . $ids['custom_field_id'] => "new custom"));
-    $check = $this->callAPISuccess($this->_entity, 'get', array('id' => $result['id'], 'contact_id' => $this->_contactID));
+    $result = $this->callAPISuccess($this->_entity, 'create', array(
+      'id' => $result['id'],
+      'custom_' . $ids['custom_field_id'] => "new custom",
+    ));
+    $check = $this->callAPISuccess($this->_entity, 'get', array(
+      'id' => $result['id'],
+      'contact_id' => $this->_contactID,
+    ));
 
     $this->assertEquals("new custom", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
-    $delete = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $check['id'],
-      ));
+    ));
 
     $this->customFieldDelete($ids['custom_field_id']);
     $this->customGroupDelete($ids['custom_group_id']);
   }
 
+  /**
+   * per CRM-15746 check that the id can be altered in an update hook
+   */
+  public function testMembershipUpdateCreateHookCRM15746() {
+    $this->hookClass->setHook('civicrm_pre', array($this, 'hook_civicrm_pre_update_create_membership'));
+    $result = $this->callAPISuccess('membership', 'create', $this->_params);
+    $this->callAPISuccess('membership', 'create', array('id' => $result['id'], 'end_date' => '1 year ago'));
+    $this->callAPISuccessGetCount('membership', array(), 2);
+    $this->hookClass->reset();
+    $this->callAPISuccess('membership', 'create', array('id' => $result['id'], 'end_date' => '1 year ago'));
+    $this->callAPISuccessGetCount('membership', array(), 2);
+  }
+
+  public function hook_civicrm_pre_update_create_membership($op, $objectName, $id, &$params) {
+    if ($objectName == 'Membership' && $op == 'edit') {
+      $existingMembership = $this->callAPISuccessGetSingle('membership', array('id' => $params['id']));
+      unset($params['id'], $params['membership_id']);
+      $params['join_date'] = $params['membership_start_date'] = $params['start_date'] = date('Ymd000000', strtotime($existingMembership['start_date']));
+      $params = array_merge($existingMembership, $params);
+      $params['id'] = NULL;
+    }
+  }
+
   /**
    * Test civicrm_contact_memberships_create Invalid membership data
    * Error expected.
@@ -833,18 +867,19 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'end_date' => '2008-12-21',
       'source' => 'Payment',
       'is_override' => 1,
-      'status_id' => $this->_membershipStatusID,    );
+      'status_id' => $this->_membershipStatusID,
+    );
 
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
 
     //membership_contact_id which is no in contact table
     $params['membership_contact_id'] = 999;
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
 
     //invalid join date
     unset($params['membership_contact_id']);
     $params['join_date'] = "invalid";
-    $result = $this->callAPIFailure('Membership', 'Create', $params);
+    $this->callAPIFailure('Membership', 'Create', $params);
   }
 
   /**
@@ -866,10 +901,11 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
 
     $result = $this->callAPISuccess('membership', 'create', $params);
 
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
     ));
   }
+
   /**
    * Test civicrm_contact_memberships_create with membership_contact_id
    * membership).
@@ -889,7 +925,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
 
     $result = $this->callAPISuccess('membership', 'create', $params);
     $this->assertEquals($this->_membershipTypeID, $result['values'][$result['id']]['membership_type_id']);
-    $result = $this->callAPISuccess('Membership', 'Delete', array(
+    $this->callAPISuccess('Membership', 'Delete', array(
       'id' => $result['id'],
     ));
   }
@@ -911,7 +947,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
       'status_id' => $this->_membershipStatusID,
     );
 
-    $result = $this->callAPIFailure('membership', 'create', $params);
+    $this->callAPIFailure('membership', 'create', $params);
   }
 
   /**
@@ -925,6 +961,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals('2009-01-21', $result['start_date']);
     $this->assertEquals('2009-12-21', $result['end_date']);
   }
+
   /**
    * Test that if membership start date is not set it defaults to correct end date
    *  - fixed
@@ -951,6 +988,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals('2009-01-21', $result['start_date']);
     $this->assertEquals('2009-12-21', $result['end_date']);
   }
+
   /**
    * Test that if membership end date is not set it defaults to correct end date
    *  - rolling
@@ -964,6 +1002,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals('2008-03-01', $result['start_date']);
     $this->assertEquals('2010-02-28', $result['end_date']);
   }
+
   /**
    * Test that if membership end date is not set it defaults to correct end date
    *  - rolling
@@ -982,7 +1021,7 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
   /**
    * Test that if datesdate are not set they not over-ridden if id is passed in
    */
-   public function testMembershipDatesNotOverridden() {
+  public function testMembershipDatesNotOverridden() {
     $result = $this->callAPISuccess($this->_entity, 'create', $this->_params);
     unset($this->_params['end_date'], $this->_params['start_date']);
     $this->_params['id'] = $result['id'];
@@ -992,5 +1031,6 @@ class api_v3_MembershipTest extends CiviUnitTestCase {
     $this->assertEquals('2009-01-21', $result['start_date']);
     $this->assertEquals('2009-12-21', $result['end_date']);
 
-   }
+  }
+
 }