X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=tests%2Fphpunit%2Fapi%2Fv3%2FJobTest.php;h=3c235882801f6fc5dc9d991b0aaef212a67df774;hb=6b83d5bdd0f2ca546924feae6aa42aeddb1d40cf;hp=c42d29017f7c06fd2e086ed4dc7d6be82855f8a0;hpb=eaf537d9b91fa5f2aa8b915fbf057bc657cce76f;p=civicrm-core.git diff --git a/tests/phpunit/api/v3/JobTest.php b/tests/phpunit/api/v3/JobTest.php index c42d29017f..3c23588280 100644 --- a/tests/phpunit/api/v3/JobTest.php +++ b/tests/phpunit/api/v3/JobTest.php @@ -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']); + } + }