Update Copywrite year to be 2019
[civicrm-core.git] / tests / phpunit / api / v3 / JobTest.php
index c42d29017f7c06fd2e086ed4dc7d6be82855f8a0..3c235882801f6fc5dc9d991b0aaef212a67df774 100644 (file)
@@ -3,7 +3,7 @@
  +--------------------------------------------------------------------+
  | CiviCRM version 5                                                  |
  +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2018                                |
+ | Copyright CiviCRM LLC (c) 2004-2019                                |
  +--------------------------------------------------------------------+
  | This file is a part of CiviCRM.                                    |
  |                                                                    |
@@ -31,7 +31,7 @@
  * @package CiviCRM_APIv3
  * @subpackage API_Job
  *
- * @copyright CiviCRM LLC (c) 2004-2018
+ * @copyright CiviCRM LLC (c) 2004-2019
  */
 
 /**
@@ -121,6 +121,22 @@ class api_v3_JobTest extends CiviUnitTestCase {
     $this->assertDBState('CRM_Core_DAO_Job', $result['id'], $this->_params);
   }
 
+  /**
+   * Clone job
+   */
+  public function testClone() {
+    $createResult = $this->callAPISuccess('job', 'create', $this->_params);
+    $params = array('id' => $createResult['id']);
+    $cloneResult = $this->callAPIAndDocument('job', 'clone', $params, __FUNCTION__, __FILE__);
+    $clonedJob = $cloneResult['values'][$cloneResult['id']];
+    $this->assertEquals($this->_params['name'] . ' - Copy', $clonedJob['name']);
+    $this->assertEquals($this->_params['description'], $clonedJob['description']);
+    $this->assertEquals($this->_params['parameters'], $clonedJob['parameters']);
+    $this->assertEquals($this->_params['is_active'], $clonedJob['is_active']);
+    $this->assertArrayNotHasKey('last_run', $clonedJob);
+    $this->assertArrayNotHasKey('scheduled_run_date', $clonedJob);
+  }
+
   /**
    * Check if required fields are not passed.
    */
@@ -1705,7 +1721,7 @@ class api_v3_JobTest extends CiviUnitTestCase {
   /**
    * Test processing membership for deceased contacts.
    */
-  public function testProcessMembership() {
+  public function testProcessMembershipDeceased() {
     $this->callAPISuccess('Job', 'process_membership', []);
     $deadManWalkingID = $this->individualCreate();
     $membershipID = $this->contactMembershipCreate(array('contact_id' => $deadManWalkingID));
@@ -1732,4 +1748,201 @@ class api_v3_JobTest extends CiviUnitTestCase {
     $this->callAPISuccess('MembershipStatus', 'create', ['is_active' => 1, 'id' => $deceasedStatusId]);
   }
 
+  /**
+   * Test processing membership: check that status is updated when it should be
+   * and left alone when it shouldn't.
+   */
+  public function testProcessMembershipUpdateStatus() {
+    $membershipTypeId = $this->membershipTypeCreate();
+
+    // Create admin-only membership status and get all statuses.
+    $result = $this->callAPISuccess('membership_status', 'create', ['name' => 'Admin', 'is_admin' => 1, 'sequential' => 1]);
+    $membershipStatusIdAdmin = $result['values'][0]['id'];
+    $memStatus = CRM_Member_PseudoConstant::membershipStatus();
+
+    // Default params, which we'll expand on below.
+    $params = [
+      'membership_type_id' => $membershipTypeId,
+      'skipStatusCal' => 1, // Don't calculate status.
+      'source' => 'Test',
+      'sequential' => 1,
+    ];
+
+    /*
+     * We create various memberships with wrong status, then check that the
+     * process_membership job sets the correct status for each.
+     * Also some memberships that should not be updated.
+     */
+
+    // Create membership with incorrect status but dates implying status New.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d');
+    $params['start_date'] = date('Y-m-d');
+    $params['end_date'] = date('Y-m-d', strtotime('now + 1 year'));
+    $params['status_id'] = 'Current'; // Intentionally incorrect status.
+    $resultNew = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Current', $memStatus), $resultNew['values'][0]['status_id']);
+
+    // Create membership with incorrect status but dates implying status Current.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 6 month'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 6 month'));
+    $params['end_date'] = date('Y-m-d', strtotime('now + 6 month'));
+    $params['status_id'] = 'New'; // Intentionally incorrect status.
+    $resultCurrent = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('New', $memStatus), $resultCurrent['values'][0]['status_id']);
+
+    // Create membership with incorrect status but dates implying status Grace.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 53 week'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 53 week'));
+    $params['end_date'] = date('Y-m-d', strtotime('now - 1 week'));
+    $params['status_id'] = 'Current'; // Intentionally incorrect status.
+    $resultGrace = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Current', $memStatus), $resultGrace['values'][0]['status_id']);
+
+    // Create membership with incorrect status but dates implying status Expired.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['end_date'] = date('Y-m-d', strtotime('now - 4 month'));
+    $params['status_id'] = 'Grace'; // Intentionally incorrect status.
+    $resultExpired = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Grace', $memStatus), $resultExpired['values'][0]['status_id']);
+
+    // Create Pending membership with dates implying New: should not get updated.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d');
+    $params['start_date'] = date('Y-m-d');
+    $params['end_date'] = date('Y-m-d', strtotime('now + 1 year'));
+    $params['status_id'] = 'Pending';
+    $resultPending = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Pending', $memStatus), $resultPending['values'][0]['status_id']);
+
+    // Create Cancelled membership with dates implying Current: should not get updated.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 6 month'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 6 month'));
+    $params['end_date'] = date('Y-m-d', strtotime('now + 6 month'));
+    $params['status_id'] = 'Cancelled';
+    $resultCancelled = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Cancelled', $memStatus), $resultCancelled['values'][0]['status_id']);
+
+    // Create status-overridden membership with dates implying Expired: should not get updated.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['end_date'] = date('Y-m-d', strtotime('now - 4 month'));
+    $params['status_id'] = 'Current';
+    $params['is_override'] = 1;
+    $resultOverride = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals(array_search('Current', $memStatus), $resultOverride['values'][0]['status_id']);
+
+    // Create membership with admin-only status but dates implying Expired: should not get updated.
+    $params['contact_id'] = $this->individualCreate();
+    $params['join_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['start_date'] = date('Y-m-d', strtotime('now - 16 month'));
+    $params['end_date'] = date('Y-m-d', strtotime('now - 4 month'));
+    $params['status_id'] = $membershipStatusIdAdmin;
+    $params['is_override'] = 1;
+    $resultAdmin = $this->callAPISuccess('Membership', 'create', $params);
+    $this->assertEquals($membershipStatusIdAdmin, $resultAdmin['values'][0]['status_id']);
+
+    /*
+     * Create membership type with inheritence and check processing of secondary memberships.
+     */
+    $employerRelationshipId = $this->callAPISuccessGetValue('RelationshipType', [
+      'return' => "id",
+      'name_b_a' => "Employer Of",
+    ]);
+    // Create membership type: inherited through employment.
+    $membershipOrgId = $this->organizationCreate();
+    $params = [
+      'name' => 'Corporate Membership',
+      'duration_unit' => 'year',
+      'duration_interval' => 1,
+      'period_type' => 'rolling',
+      'member_of_contact_id' => $membershipOrgId,
+      'domain_id' => 1,
+      'financial_type_id' => 1,
+      'relationship_type_id' => $employerRelationshipId,
+      'relationship_direction' => 'b_a',
+      'is_active' => 1,
+    ];
+    $result = $this->callAPISuccess('membership_type', 'create', $params);
+    $membershipTypeId = $result['id'];
+
+    // Create employer and first employee
+    $employerId = $this->organizationCreate([], 1);
+    $memberContactId = $this->individualCreate(['employer_id' => $employerId], 0);
+
+    // Create inherited membership with incorrect status but dates implying status Expired.
+    $params = [
+      'contact_id' => $employerId,
+      'membership_type_id' => $membershipTypeId,
+      'source' => 'Test suite',
+      'join_date' => date('Y-m-d', strtotime('now - 16 month')),
+      'start_date' => date('Y-m-d', strtotime('now - 16 month')),
+      'end_date' => date('Y-m-d', strtotime('now - 4 month')),
+      'status_id' => 'Grace', // Intentionally incorrect status.
+      'skipStatusCal' => 1, // Don't calculate status.
+    ];
+    $organizationMembershipID = $this->contactMembershipCreate($params);
+
+    // Check that the employee inherited the membership and status.
+    $params = [
+      'contact_id' => $memberContactId,
+      'membership_type_id' => $membershipTypeId,
+      'sequential' => 1,
+    ];
+    $resultInheritExpired = $this->callAPISuccess('membership', 'get', $params);
+    $this->assertEquals(1, $resultInheritExpired['count']);
+    $this->assertEquals($organizationMembershipID, $resultInheritExpired['values'][0]['owner_membership_id']);
+    $this->assertEquals(array_search('Grace', $memStatus), $resultInheritExpired['values'][0]['status_id']);
+
+    // Reset static $relatedContactIds array in createRelatedMemberships(),
+    // to avoid bug where inherited membership gets deleted.
+    $var = TRUE;
+    CRM_Member_BAO_Membership::createRelatedMemberships($var, $var, TRUE);
+
+    // Check that after running process_membership job, statuses are correct.
+    $this->callAPISuccess('Job', 'process_membership', []);
+
+    // New - should get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultNew['values'][0]['id']]);
+    $this->assertEquals(array_search('New', $memStatus), $membership['status_id']);
+
+    // Current - should get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultCurrent['values'][0]['id']]);
+    $this->assertEquals(array_search('Current', $memStatus), $membership['status_id']);
+
+    // Grace - should get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultGrace['values'][0]['id']]);
+    $this->assertEquals(array_search('Grace', $memStatus), $membership['status_id']);
+
+    // Expired - should get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultExpired['values'][0]['id']]);
+    $this->assertEquals(array_search('Expired', $memStatus), $membership['status_id']);
+
+    // Pending - should not get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultPending['values'][0]['id']]);
+    $this->assertEquals(array_search('Pending', $memStatus), $membership['status_id']);
+
+    // Cancelled - should not get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultCancelled['values'][0]['id']]);
+    $this->assertEquals(array_search('Cancelled', $memStatus), $membership['status_id']);
+
+    // Override - should not get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultOverride['values'][0]['id']]);
+    $this->assertEquals(array_search('Current', $memStatus), $membership['status_id']);
+
+    // Admin - should not get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultAdmin['values'][0]['id']]);
+    $this->assertEquals($membershipStatusIdAdmin, $membership['status_id']);
+
+    // Inherit Expired - should get updated.
+    $membership = $this->callAPISuccess('membership', 'getsingle', ['id' => $resultInheritExpired['values'][0]['id']]);
+    $this->assertEquals(array_search('Expired', $memStatus), $membership['status_id']);
+  }
+
 }