3 +--------------------------------------------------------------------+
4 | Copyright CiviCRM LLC. All rights reserved. |
6 | This work is published under the GNU AGPLv3 license with some |
7 | permitted exceptions and without any warranty. For full license |
8 | and copyright information, see https://civicrm.org/licensing |
9 +--------------------------------------------------------------------+
13 * Test APIv3 civicrm_membership functions
15 * @package CiviCRM_APIv3
16 * @subpackage API_Member
20 * Class api_v3_MembershipTest
23 class api_v3_MembershipTest
extends CiviUnitTestCase
{
24 protected $_apiversion;
25 protected $_contactID;
26 protected $_membershipID;
27 protected $_membershipID2;
28 protected $_membershipID3;
29 protected $_membershipTypeID;
30 protected $_membershipTypeID2;
31 protected $_membershipStatusID;
38 public function setUp() {
40 $this->_apiversion
= 3;
41 $this->_contactID
= $this->individualCreate();
42 $this->_membershipTypeID
= $this->membershipTypeCreate(['member_of_contact_id' => $this->_contactID
]);
43 $this->_membershipTypeID2
= $this->membershipTypeCreate([
44 'period_type' => 'fixed',
46 'fixed_period_start_day' => '301',
48 'fixed_period_rollover_day' => '1111',
49 'name' => 'Another one',
51 $this->_membershipStatusID
= $this->membershipStatusCreate('test status');
53 CRM_Member_PseudoConstant
::membershipType(NULL, TRUE);
54 CRM_Member_PseudoConstant
::membershipStatus(NULL, NULL, 'name', TRUE);
55 CRM_Core_PseudoConstant
::activityType(TRUE, TRUE, TRUE, 'name');
57 $this->_entity
= 'Membership';
59 'contact_id' => $this->_contactID
,
60 'membership_type_id' => $this->_membershipTypeID
,
61 'join_date' => '2009-01-21',
62 'start_date' => '2009-01-21',
63 'end_date' => '2009-12-21',
64 'source' => 'Payment',
66 'status_id' => $this->_membershipStatusID
,
71 * Clean up after tests.
75 public function tearDown() {
76 $this->quickCleanUpFinancialEntities();
77 $this->quickCleanup(['civicrm_uf_match'], TRUE);
78 $this->contactDelete($this->_contactID
);
83 * Test membership deletion.
85 public function testMembershipDelete() {
86 $membershipID = $this->contactMembershipCreate($this->_params
);
87 $this->assertDBRowExist('CRM_Member_DAO_Membership', $membershipID);
89 'id' => $membershipID,
91 $this->callAPIAndDocument('membership', 'delete', $params, __FUNCTION__
, __FILE__
);
92 $this->assertDBRowNotExist('CRM_Member_DAO_Membership', $membershipID);
95 public function testMembershipDeleteEmpty() {
96 $this->callAPIFailure('membership', 'delete', []);
99 public function testMembershipDeleteInvalidID() {
100 $this->callAPIFailure('membership', 'delete', ['id' => 'blah']);
104 * Test membership deletion and with the preserve contribution param.
106 public function testMembershipDeletePreserveContribution() {
108 $membershipID = $this->contactMembershipCreate($this->_params
);
110 $this->assertDBRowExist('CRM_Member_DAO_Membership', $membershipID);
111 $ContributionCreate = $this->callAPISuccess('Contribution', 'create', [
113 'financial_type_id' => "Member Dues",
114 'total_amount' => 100,
115 'contact_id' => $this->_params
['contact_id'],
117 $membershipPaymentCreate = $this->callAPISuccess('MembershipPayment', 'create', [
119 'contribution_id' => $ContributionCreate['values'][0]['id'],
120 'membership_id' => $membershipID,
123 'id' => $membershipID,
124 'preserve_contribution' => 1,
127 'id' => $ContributionCreate['values'][0]['id'],
129 $this->callAPIAndDocument('membership', 'delete', $memParams, __FUNCTION__
, __FILE__
);
130 $this->assertDBRowNotExist('CRM_Member_DAO_Membership', $membershipID);
131 $this->assertDBRowExist('CRM_Contribute_DAO_Contribution', $ContributionCreate['values'][0]['id']);
132 $this->callAPISuccess('Contribution', 'delete', $contribParams);
133 $this->assertDBRowNotExist('CRM_Contribute_DAO_Contribution', $ContributionCreate['values'][0]['id']);
137 * Test Activity creation on cancellation of membership contribution.
139 public function testActivityForCancelledContribution() {
140 $contactId = $this->createLoggedInUser();
141 $membershipID = $this->contactMembershipCreate($this->_params
);
142 $this->assertDBRowExist('CRM_Member_DAO_Membership', $membershipID);
144 $ContributionCreate = $this->callAPISuccess('Contribution', 'create', [
145 'financial_type_id' => "Member Dues",
146 'total_amount' => 100,
147 'contact_id' => $this->_params
['contact_id'],
149 $membershipPaymentCreate = $this->callAPISuccess('MembershipPayment', 'create', [
151 'contribution_id' => $ContributionCreate['id'],
152 'membership_id' => $membershipID,
154 $instruments = $this->callAPISuccess('contribution', 'getoptions', ['field' => 'payment_instrument_id']);
155 $this->paymentInstruments
= $instruments['values'];
157 $form = new CRM_Contribute_Form_Contribution();
158 $form->_id
= $ContributionCreate['id'];
160 'total_amount' => 100,
161 'financial_type_id' => 1,
162 'contact_id' => $contactId,
163 'payment_instrument_id' => array_search('Check', $this->paymentInstruments
),
164 'contribution_status_id' => 3,
166 CRM_Core_Action
::UPDATE
);
168 $activity = $this->callAPISuccess('Activity', 'get', [
169 'activity_type_id' => "Change Membership Status",
170 'source_record_id' => $membershipID,
172 $this->assertNotEmpty($activity['values']);
176 * Test membership get.
178 public function testContactMembershipsGet() {
179 $this->_membershipID
= $this->contactMembershipCreate($this->_params
);
180 $this->callAPISuccess('membership', 'get', []);
181 $this->callAPISuccess('Membership', 'Delete', ['id' => $this->_membershipID
]);
185 * Test civicrm_membership_get with params not array.
187 * Gets treated as contact_id, memberships expected.
189 public function testGetWithParamsContactId() {
190 $this->_membershipID
= $this->contactMembershipCreate($this->_params
);
192 'contact_id' => $this->_contactID
,
194 $membership = $this->callAPISuccess('membership', 'get', $params);
196 $result = $membership['values'][$this->_membershipID
];
197 $this->callAPISuccess('Membership', 'Delete', [
198 'id' => $this->_membershipID
,
200 $this->assertEquals($result['contact_id'], $this->_contactID
);
201 $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID
);
202 $this->assertEquals($result['status_id'], $this->_membershipStatusID
);
203 $this->assertEquals($result['join_date'], '2009-01-21');
204 $this->assertEquals($result['start_date'], '2009-01-21');
205 $this->assertEquals($result['end_date'], '2009-12-21');
206 $this->assertEquals($result['source'], 'Payment');
207 $this->assertEquals($result['is_override'], 1);
211 * Test civicrm_membership_get with params not array.
213 * Gets treated as contact_id, memberships expected.
215 public function testGetInSyntax() {
216 $this->_membershipID
= $this->contactMembershipCreate($this->_params
);
217 $this->_membershipID2
= $this->contactMembershipCreate($this->_params
);
218 $this->_membershipID3
= $this->contactMembershipCreate($this->_params
);
220 'id' => ['IN' => [$this->_membershipID
, $this->_membershipID3
]],
222 $membership = $this->callAPISuccess('membership', 'get', $params);
223 $this->assertEquals(2, $membership['count']);
224 $this->assertEquals([$this->_membershipID
, $this->_membershipID3
], array_keys($membership['values']));
226 'id' => ['NOT IN' => [$this->_membershipID
, $this->_membershipID3
]],
228 $membership = $this->callAPISuccess('membership', 'get', $params);
229 $this->assertEquals(1, $membership['count']);
230 $this->assertEquals([$this->_membershipID2
], array_keys($membership['values']));
234 * Test civicrm_membership_get with params not array.
235 * Gets treated as contact_id, memberships expected.
237 public function testGetInSyntaxOnContactID() {
238 $this->_membershipID
= $this->contactMembershipCreate($this->_params
);
239 $contact2 = $this->individualCreate();
240 $contact3 = $this->individualCreate(['first_name' => 'Scout', 'last_name' => 'Canine']);
241 $this->_membershipID2
= $this->contactMembershipCreate(array_merge($this->_params
, ['contact_id' => $contact2]));
242 $this->_membershipID3
= $this->contactMembershipCreate(array_merge($this->_params
, ['contact_id' => $contact3]));
244 'contact_id' => ['IN' => [$this->_contactID
, $contact3]],
246 $membership = $this->callAPISuccess('membership', 'get', $params);
247 $this->assertEquals(2, $membership['count']);
248 $this->assertEquals([$this->_membershipID
, $this->_membershipID3
], array_keys($membership['values']));
250 'contact_id' => ['NOT IN' => [$this->_contactID
, $contact3]],
252 $membership = $this->callAPISuccess('membership', 'get', $params);
253 $this->assertEquals(1, $membership['count']);
254 $this->assertEquals([$this->_membershipID2
], array_keys($membership['values']));
258 * Test civicrm_membership_get with params not array.
260 * Gets treated as contact_id, memberships expected.
262 public function testGetWithParamsMemberShipTypeId() {
263 $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
265 'membership_type_id' => $this->_membershipTypeID
,
267 $membership = $this->callAPISuccess('membership', 'get', $params);
268 $this->callAPISuccess('Membership', 'Delete', [
269 'id' => $membership['id'],
271 $result = $membership['values'][$membership['id']];
272 $this->assertEquals($result['contact_id'], $this->_contactID
);
273 $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID
);
274 $this->assertEquals($result['status_id'], $this->_membershipStatusID
);
275 $this->assertEquals($result['join_date'], '2009-01-21');
276 $this->assertEquals($result['start_date'], '2009-01-21');
277 $this->assertEquals($result['end_date'], '2009-12-21');
278 $this->assertEquals($result['source'], 'Payment');
279 $this->assertEquals($result['is_override'], 1);
280 $this->assertEquals($result['id'], $membership['id']);
284 * Test civicrm_membership_get with params not array.
285 * Gets treated as contact_id, memberships expected.
287 public function testGetWithParamsMemberShipTypeIdContactID() {
288 $params = $this->_params
;
289 $this->callAPISuccess($this->_entity
, 'create', $params);
290 $params['membership_type_id'] = $this->_membershipTypeID2
;
291 $this->callAPISuccess($this->_entity
, 'create', $params);
292 $this->callAPISuccessGetCount('membership', ['contact_id' => $this->_contactID
], 2);
294 'membership_type_id' => $this->_membershipTypeID
,
295 'contact_id' => $this->_contactID
,
297 $result = $this->callAPISuccess('membership', 'getsingle', $params);
298 $this->assertEquals($result['contact_id'], $this->_contactID
);
299 $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID
);
302 'membership_type_id' => $this->_membershipTypeID2
,
303 'contact_id' => $this->_contactID
,
305 $result = $this->callAPISuccess('membership', 'getsingle', $params);
306 $this->assertEquals($result['contact_id'], $this->_contactID
);
307 $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID2
);
311 * Check with complete array + custom field.
313 * Note that the test is written on purpose without any
314 * variables specific to participant so it can be replicated into other entities
315 * and / or moved to the automated test suite
317 public function testGetWithParamsMemberShipIdAndCustom() {
318 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__
, __FILE__
);
320 $params = $this->_params
;
321 $params['custom_' . $ids['custom_field_id']] = "custom string";
323 $result = $this->callAPISuccess($this->_entity
, 'create', $params);
325 $getParams = ['membership_type_id' => $params['membership_type_id']];
326 $check = $this->callAPIAndDocument($this->_entity
, 'get', $getParams, __FUNCTION__
, __FILE__
);
327 $this->assertEquals("custom string", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__
);
329 $this->callAPISuccess('Membership', 'Delete', [
330 'id' => $result['id'],
335 * Test civicrm_membership_get with proper params.
336 * Memberships expected.
338 public function testGet() {
339 $membershipID = $this->contactMembershipCreate($this->_params
);
341 'contact_id' => $this->_contactID
,
344 $membership = $this->callAPISuccess('membership', 'get', $params);
345 $result = $membership['values'][$membershipID];
346 $this->callAPISuccess('Membership', 'Delete', [
347 'id' => $membership['id'],
349 $this->assertEquals($result['join_date'], '2009-01-21');
350 $this->assertEquals($result['contact_id'], $this->_contactID
);
351 $this->assertEquals($result['membership_type_id'], $this->_membershipTypeID
);
352 $this->assertEquals($result['status_id'], $this->_membershipStatusID
);
354 $this->assertEquals($result['start_date'], '2009-01-21');
355 $this->assertEquals($result['end_date'], '2009-12-21');
356 $this->assertEquals($result['source'], 'Payment');
357 $this->assertEquals($result['is_override'], 1);
361 * Test civicrm_membership_get with proper params.
362 * Memberships expected.
364 public function testGetWithId() {
365 $membershipID = $this->contactMembershipCreate($this->_params
);
367 'contact_id' => $this->_contactID
,
368 'id' => $this->_membershipID
,
371 $result = $this->callAPISuccess('membership', 'get', $params);
372 $this->assertEquals($membershipID, $result['id']);
374 'contact_id' => $this->_contactID
,
375 'membership_id' => $this->_membershipID
,
376 'return' => 'membership_id',
378 $result = $this->callAPISuccess('membership', 'get', $params);
379 $this->assertEquals($membershipID, $result['id']);
383 * Test civicrm_membership_get for only active.
384 * Memberships expected.
386 public function testGetOnlyActive() {
387 $description = "Demonstrates use of 'filter' active_only' param.";
388 $this->_membershipID
= $this->contactMembershipCreate($this->_params
);
390 'contact_id' => $this->_contactID
,
394 $membership = $this->callAPISuccess('membership', 'get', $params);
395 $this->assertEquals($membership['values'][$this->_membershipID
]['status_id'], $this->_membershipStatusID
);
396 $this->assertEquals($membership['values'][$this->_membershipID
]['contact_id'], $this->_contactID
);
398 'contact_id' => $this->_contactID
,
404 $membership = $this->callAPIAndDocument('membership', 'get', $params, __FUNCTION__
, __FILE__
, $description, 'FilterIsCurrent');
405 $this->assertEquals($membership['values'][$this->_membershipID
]['status_id'], $this->_membershipStatusID
);
406 $this->assertEquals($membership['values'][$this->_membershipID
]['contact_id'], $this->_contactID
);
408 $this->callAPISuccess('Membership', 'Delete', ['id' => $this->_membershipID
]);
412 * Test civicrm_membership_get for non exist contact.
415 public function testGetNoContactExists() {
417 'contact_id' => 55555,
420 $membership = $this->callAPISuccess('membership', 'get', $params);
421 $this->assertEquals($membership['count'], 0);
425 * Test civicrm_membership_get with relationship.
428 * @throws \CRM_Core_Exception
430 public function testGetWithRelationship() {
431 $membershipOrgId = $this->organizationCreate(NULL);
432 $memberContactId = $this->individualCreate();
435 'name_a_b' => 'Relation 1',
436 'name_b_a' => 'Relation 2',
437 'description' => 'Testing relationship type',
438 'contact_type_a' => 'Organization',
439 'contact_type_b' => 'Individual',
443 $relTypeID = $this->relationshipTypeCreate($relTypeParams);
446 'name' => 'test General',
447 'duration_unit' => 'year',
448 'duration_interval' => 1,
449 'period_type' => 'rolling',
450 'member_of_contact_id' => $membershipOrgId,
452 'financial_type_id' => 1,
453 'relationship_type_id' => $relTypeID,
454 'relationship_direction' => 'b_a',
457 $memType = $this->callAPISuccess('membership_type', 'create', $params);
460 'contact_id' => $memberContactId,
461 'membership_type_id' => $memType['id'],
462 'join_date' => '2009-01-21',
463 'start_date' => '2009-01-21',
464 'end_date' => '2009-12-21',
465 'source' => 'Payment',
467 'status_id' => $this->_membershipStatusID
,
469 $membershipID = $this->contactMembershipCreate($params);
472 'contact_id' => $memberContactId,
473 'membership_type_id' => $memType['id'],
476 $result = $this->callAPISuccess('membership', 'get', $params);
478 $membership = $result['values'][$membershipID];
479 $this->assertEquals($this->_membershipStatusID
, $membership['status_id']);
480 $this->callAPISuccess('Membership', 'Delete', [
481 'id' => $membership['id'],
483 $this->membershipTypeDelete(['id' => $memType['id']]);
484 $this->relationshipTypeDelete($relTypeID);
485 $this->contactDelete($membershipOrgId);
486 $this->contactDelete($memberContactId);
490 * Test civicrm_membership_create with relationships.
491 * create/get Memberships.
493 * Test suite for CRM-14758: API ( contact, create ) does not always create related membership
494 * and max_related property for Membership_Type and Membership entities
496 * @throws \CRM_Core_Exception
497 * @throws \CiviCRM_API3_Exception
499 public function testCreateWithRelationship() {
500 // Create membership type: inherited through employment, max_related = 2
502 'name_a_b' => 'Employee of',
504 $result = $this->callAPISuccess('relationship_type', 'get', $params);
505 $relationshipTypeId = $result['id'];
506 $membershipOrgId = $this->organizationCreate();
508 'name' => 'Corporate Membership',
509 'duration_unit' => 'year',
510 'duration_interval' => 1,
511 'period_type' => 'rolling',
512 'member_of_contact_id' => $membershipOrgId,
514 'financial_type_id' => 1,
515 'relationship_type_id' => $relationshipTypeId,
516 'relationship_direction' => 'b_a',
520 $result = $this->callAPISuccess('membership_type', 'create', $params);
521 $membershipTypeId = $result['id'];
523 // Create employer and first employee
524 $employerId[0] = $this->organizationCreate([], 1);
525 $memberContactId[0] = $this->individualCreate(['employer_id' => $employerId[0]], 0);
527 // Create organization's membership
529 'contact_id' => $employerId[0],
530 'membership_type_id' => $membershipTypeId,
531 'source' => 'Test suite',
532 'start_date' => date('Y-m-d'),
533 'end_date' => "+1 year",
535 $OrganizationMembershipID = $this->contactMembershipCreate($params);
537 // Check that the employee inherited the membership
539 'contact_id' => $memberContactId[0],
540 'membership_type_id' => $membershipTypeId,
543 $result = $this->callAPISuccess('membership', 'get', $params);
545 $this->assertEquals(1, $result['count']);
546 $result = $result['values'][$result['id']];
547 $this->assertEquals($OrganizationMembershipID, $result['owner_membership_id']);
549 // Create second employee
550 $memberContactId[1] = $this->individualCreate(['employer_id' => $employerId[0]], 1);
552 // Check that the employee inherited the membership
554 'contact_id' => $memberContactId[1],
555 'membership_type_id' => $membershipTypeId,
557 $result = $this->callAPISuccess('membership', 'get', $params);
558 // If it fails here CRM-14758 is not fixed
559 $this->assertEquals(1, $result['count']);
560 $result = $result['values'][$result['id']];
561 $this->assertEquals($OrganizationMembershipID, $result['owner_membership_id']);
563 // Create third employee
564 $memberContactId[2] = $this->individualCreate(['employer_id' => $employerId[0]], 2);
566 // Check that employee does NOT inherit the membership (max_related = 2)
568 'contact_id' => $memberContactId[2],
569 'membership_type_id' => $membershipTypeId,
571 $result = $this->callAPISuccess('membership', 'get', $params);
572 $this->assertEquals(0, $result['count']);
574 // Increase max_related for the employer's membership
576 'id' => $OrganizationMembershipID,
579 $this->callAPISuccess('Membership', 'create', $params);
581 // Check that the employee inherited the membership
583 'contact_id' => $memberContactId[2],
584 'membership_type_id' => $membershipTypeId,
586 $result = $this->callAPISuccess('membership', 'get', $params);
587 $this->assertEquals(1, $result['count']);
588 $result = $result['values'][$result['id']];
589 $this->assertEquals($OrganizationMembershipID, $result['owner_membership_id']);
591 // First employee moves to a new job
592 $employerId[1] = $this->organizationCreate([], 2);
594 'id' => $memberContactId[0],
595 'employer_id' => $employerId[1],
597 $this->callAPISuccess('contact', 'create', $params);
599 // Check that employee does NO LONGER inherit the membership
601 'contact_id' => $memberContactId[0],
602 'membership_type_id' => $membershipTypeId,
604 $result = $this->callAPISuccess('membership', 'get', $params);
605 $this->assertEquals(0, $result['count']);
607 //Create pay_later membership for organization.
608 $employerId[2] = $this->organizationCreate([], 1);
610 'contact_id' => $employerId[2],
611 'membership_type_id' => $membershipTypeId,
612 'source' => 'Test pay later suite',
616 $organizationMembership = CRM_Member_BAO_Membership
::add($params);
617 $organizationMembershipID = $organizationMembership->id
;
618 $memberContactId[3] = $this->individualCreate(['employer_id' => $employerId[2]], 0);
619 // Check that the employee inherited the membership
621 'contact_id' => $memberContactId[3],
622 'membership_type_id' => $membershipTypeId,
624 $result = $this->callAPISuccess('membership', 'get', $params);
625 $this->assertEquals(1, $result['count']);
626 $result = $result['values'][$result['id']];
627 $this->assertEquals($organizationMembershipID, $result['owner_membership_id']);
629 // Set up params for enable/disable checks
630 $relationship1 = $this->callAPISuccess('relationship', 'get', ['contact_id_a' => $memberContactId[1]]);
632 'contact_id' => $memberContactId[1],
633 'membership_type_id' => $membershipTypeId,
636 // Deactivate relationship using create and assert membership is not inherited
637 $this->callAPISuccess('relationship', 'create', ['id' => $relationship1['id'], 'is_active' => 0]);
638 $result = $this->callAPISuccess('membership', 'get', $params);
639 $this->assertEquals(0, $result['count']);
641 // Re-enable relationship using create and assert membership is inherited
642 $this->callAPISuccess('relationship', 'create', ['id' => $relationship1['id'], 'is_active' => 1]);
643 $result = $this->callAPISuccess('membership', 'get', $params);
644 $this->assertEquals(1, $result['count']);
646 // Deactivate relationship using setvalue and assert membership is not inherited
647 $this->callAPISuccess('relationship', 'setvalue', ['id' => $relationship1['id'], 'field' => 'is_active', 'value' => 0]);
648 $result = $this->callAPISuccess('membership', 'get', $params);
649 $this->assertEquals(0, $result['count']);
651 // Re-enable relationship using setvalue and assert membership is inherited
652 $this->callAPISuccess('relationship', 'setvalue', ['id' => $relationship1['id'], 'field' => 'is_active', 'value' => 1]);
653 $result = $this->callAPISuccess('membership', 'get', $params);
654 $this->assertEquals(1, $result['count']);
656 // Delete relationship and assert membership is not inherited
657 $this->callAPISuccess('relationship', 'delete', ['id' => $relationship1['id']]);
658 $result = $this->callAPISuccess('membership', 'get', $params);
659 $this->assertEquals(0, $result['count']);
661 // Tear down - reverse of creation to be safe
662 $this->contactDelete($memberContactId[2]);
663 $this->contactDelete($memberContactId[1]);
664 $this->contactDelete($memberContactId[0]);
665 $this->contactDelete($employerId[1]);
666 $this->contactDelete($employerId[0]);
667 $this->membershipTypeDelete(['id' => $membershipTypeId]);
668 $this->contactDelete($membershipOrgId);
672 * We are checking for no e-notices + only id & end_date returned
674 * @throws \CRM_Core_Exception
676 public function testMembershipGetWithReturn() {
677 $this->contactMembershipCreate($this->_params
);
678 $result = $this->callAPISuccess('membership', 'get', ['return' => 'end_date']);
679 foreach ($result['values'] as $membership) {
680 $this->assertEquals(['id', 'end_date'], array_keys($membership));
684 ///////////////// civicrm_membership_create methods
687 * Test civicrm_contact_memberships_create with empty params.
690 public function testCreateWithEmptyParams() {
692 $this->callAPIFailure('membership', 'create', $params);
696 * If is_overide is passed in status must also be passed in.
698 public function testCreateOverrideNoStatus() {
699 $params = $this->_params
;
700 unset($params['status_id']);
701 $this->callAPIFailure('membership', 'create', $params);
704 public function testMembershipCreateMissingRequired() {
706 'membership_type_id' => '1',
707 'join_date' => '2006-01-21',
708 'start_date' => '2006-01-21',
709 'end_date' => '2006-12-21',
710 'source' => 'Payment',
714 $this->callAPIFailure('membership', 'create', $params);
717 public function testMembershipCreate() {
719 'contact_id' => $this->_contactID
,
720 'membership_type_id' => $this->_membershipTypeID
,
721 'join_date' => '2006-01-21',
722 'start_date' => '2006-01-21',
723 'end_date' => '2006-12-21',
724 'source' => 'Payment',
726 'status_id' => $this->_membershipStatusID
,
729 $result = $this->callAPIAndDocument('membership', 'create', $params, __FUNCTION__
, __FILE__
);
730 $this->getAndCheck($params, $result['id'], $this->_entity
);
731 $this->assertNotNull($result['id']);
732 $this->assertEquals($this->_contactID
, $result['values'][$result['id']]['contact_id'], " in line " . __LINE__
);
733 $this->assertEquals($result['id'], $result['values'][$result['id']]['id'], " in line " . __LINE__
);
737 * Check for useful message if contact doesn't exist
739 public function testMembershipCreateWithInvalidContact() {
742 'membership_type_id' => $this->_membershipTypeID
,
743 'join_date' => '2006-01-21',
744 'start_date' => '2006-01-21',
745 'end_date' => '2006-12-21',
746 'source' => 'Payment',
748 'status_id' => $this->_membershipStatusID
,
751 $this->callAPIFailure('membership', 'create', $params,
752 'contact_id is not valid : 999'
756 public function testMembershipCreateWithInvalidStatus() {
757 $params = $this->_params
;
758 $params['status_id'] = 999;
759 $this->callAPIFailure('membership', 'create', $params,
760 "'999' is not a valid option for field status_id"
764 public function testMembershipCreateWithInvalidType() {
765 $params = $this->_params
;
766 $params['membership_type_id'] = 999;
768 $this->callAPIFailure('membership', 'create', $params,
769 "'999' is not a valid option for field membership_type_id"
774 * Check with complete array + custom field
775 * Note that the test is written on purpose without any
776 * variables specific to participant so it can be replicated into other entities
777 * and / or moved to the automated test suite
779 public function testCreateWithCustom() {
780 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__
, __FILE__
);
782 $params = $this->_params
;
783 $params['custom_' . $ids['custom_field_id']] = "custom string";
785 $result = $this->callAPIAndDocument($this->_entity
, 'create', $params, __FUNCTION__
, __FILE__
, NULL, 'CreateWithCustomData');
786 $check = $this->callAPISuccess($this->_entity
, 'get', [
787 'id' => $result['id'],
788 'contact_id' => $this->_contactID
,
790 $this->assertEquals("custom string", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__
);
794 * Search on custom field value.
796 public function testSearchWithCustomDataCRM16036() {
797 // Create a custom field on membership
798 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__
, __FILE__
);
800 // Create a new membership, but don't assign anything to the custom field.
801 $params = $this->_params
;
802 $result = $this->callAPIAndDocument(
809 'SearchWithCustomData');
811 // search memberships with CRM-16036 as custom field value.
812 // Since we did not touch the custom field of any membership,
813 // this should not return any results.
814 $check = $this->callAPISuccess($this->_entity
, 'get', [
815 'custom_' . $ids['custom_field_id'] => "CRM-16036",
819 $this->callAPISuccess($this->_entity
, 'delete', [
820 'id' => $result['id'],
824 $this->assertEquals(0, $check['count']);
828 * Test civicrm_contact_memberships_create with membership id (edit
832 public function testMembershipCreateWithId() {
833 $membershipID = $this->contactMembershipCreate($this->_params
);
835 'id' => $membershipID,
836 'contact_id' => $this->_contactID
,
837 'membership_type_id' => $this->_membershipTypeID
,
838 'join_date' => '2006-01-21',
839 'start_date' => '2006-01-21',
840 'end_date' => '2006-12-21',
841 'source' => 'Payment',
843 'status_id' => $this->_membershipStatusID
,
846 $result = $this->callAPISuccess('membership', 'create', $params);
848 //Update Status and check activities created.
850 'id' => $result['id'],
851 'status_id' => CRM_Core_PseudoConstant
::getKey('CRM_Member_BAO_Membership', 'status_id', 'Cancelled'),
853 $this->callAPISuccess('Membership', 'create', $updateStatus);
854 $activities = CRM_Activity_BAO_Activity
::getContactActivity($this->_contactID
);
855 $this->assertEquals(2, count($activities));
856 $activityNames = array_flip(CRM_Utils_Array
::collect('activity_name', $activities));
857 $this->assertArrayHasKey('Membership Signup', $activityNames);
858 $this->assertArrayHasKey('Change Membership Status', $activityNames);
860 $this->callAPISuccess('Membership', 'Delete', [
861 'id' => $result['id'],
863 $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__
);
867 * Test civicrm_contact_memberships_create with membership id (edit
871 public function testMembershipCreateUpdateWithIdNoContact() {
872 $membershipID = $this->contactMembershipCreate($this->_params
);
874 'id' => $membershipID,
875 'membership_type_id' => $this->_membershipTypeID
,
876 'contact_id' => $this->_contactID
,
877 'join_date' => '2006-01-21',
878 'start_date' => '2006-01-21',
879 'end_date' => '2006-12-21',
880 'source' => 'Payment',
882 'status_id' => $this->_membershipStatusID
,
885 $result = $this->callAPISuccess('membership', 'create', $params);
886 $this->callAPISuccess('Membership', 'Delete', [
887 'id' => $result['id'],
890 $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__
);
894 * Test civicrm_contact_memberships_create with membership id (edit
898 public function testMembershipCreateUpdateWithIdNoDates() {
899 $membershipID = $this->contactMembershipCreate($this->_params
);
901 'id' => $membershipID,
902 'contact_id' => $this->_contactID
,
903 'membership_type_id' => $this->_membershipTypeID
,
904 'source' => 'Payment',
906 'status_id' => $this->_membershipStatusID
,
909 $result = $this->callAPISuccess('membership', 'create', $params);
910 $this->callAPISuccess('Membership', 'Delete', [
911 'id' => $result['id'],
913 $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__
);
917 * Test civicrm_contact_memberships_create with membership id (edit
921 public function testMembershipCreateUpdateWithIdNoDatesNoType() {
922 $membershipID = $this->contactMembershipCreate($this->_params
);
924 'id' => $membershipID,
925 'source' => 'not much here',
926 'contact_id' => $this->_contactID
,
928 'status_id' => $this->_membershipStatusID
,
931 $result = $this->callAPISuccess('membership', 'create', $params);
932 $this->callAPISuccess('Membership', 'Delete', [
933 'id' => $result['id'],
935 $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__
);
939 * Test civicrm_contact_memberships_create with membership id (edit
943 public function testMembershipCreateUpdateWithIDAndSource() {
944 $membershipID = $this->contactMembershipCreate($this->_params
);
946 'id' => $membershipID,
947 'source' => 'changed',
948 'contact_id' => $this->_contactID
,
949 'status_id' => $this->_membershipStatusID
,
950 'membership_type_id' => $this->_membershipTypeID
,
951 'skipStatusCal' => 1,
953 $result = $this->callAPISuccess('membership', 'create', $params);
954 $this->assertEquals($result['id'], $membershipID, "in line " . __LINE__
);
955 $this->callAPISuccess('Membership', 'Delete', [
956 'id' => $result['id'],
961 * Change custom field using update.
963 public function testUpdateWithCustom() {
964 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__
, __FILE__
);
966 $params = $this->_params
;
967 $params['custom_' . $ids['custom_field_id']] = "custom string";
968 $result = $this->callAPIAndDocument($this->_entity
, 'create', $params, __FUNCTION__
, __FILE__
, NULL, 'UpdateCustomData');
969 $result = $this->callAPISuccess($this->_entity
, 'create', [
970 'id' => $result['id'],
971 'custom_' . $ids['custom_field_id'] => "new custom",
973 $check = $this->callAPISuccess($this->_entity
, 'get', [
974 'id' => $result['id'],
975 'contact_id' => $this->_contactID
,
978 $this->assertEquals("new custom", $check['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__
);
979 $this->callAPISuccess('Membership', 'Delete', [
980 'id' => $check['id'],
983 $this->customFieldDelete($ids['custom_field_id']);
984 $this->customGroupDelete($ids['custom_group_id']);
988 * per CRM-15746 check that the id can be altered in an update hook
990 public function testMembershipUpdateCreateHookCRM15746() {
991 $this->hookClass
->setHook('civicrm_pre', [$this, 'hook_civicrm_pre_update_create_membership']);
992 $result = $this->callAPISuccess('membership', 'create', $this->_params
);
993 $this->callAPISuccess('membership', 'create', ['id' => $result['id'], 'end_date' => '1 year ago']);
994 $this->callAPISuccessGetCount('membership', [], 2);
995 $this->hookClass
->reset();
996 $this->callAPISuccess('membership', 'create', ['id' => $result['id'], 'end_date' => '1 year ago']);
997 $this->callAPISuccessGetCount('membership', [], 2);
1001 * Custom hook for update membership.
1004 * @param object $objectName
1006 * @param array $params
1008 * @throws \Exception
1010 public function hook_civicrm_pre_update_create_membership($op, $objectName, $id, &$params) {
1011 if ($objectName == 'Membership' && $op == 'edit') {
1012 $existingMembership = $this->callAPISuccessGetSingle('membership', ['id' => $params['id']]);
1013 unset($params['id'], $params['membership_id']);
1014 $params['join_date'] = $params['membership_start_date'] = $params['start_date'] = date('Ymd000000', strtotime($existingMembership['start_date']));
1015 $params = array_merge($existingMembership, $params);
1016 $params['id'] = NULL;
1021 * Test civicrm_contact_memberships_create Invalid membership data.
1024 public function testMembershipCreateInvalidMemData() {
1025 //membership_contact_id as string
1027 'membership_contact_id' => 'Invalid',
1028 'membership_type_id' => $this->_membershipTypeID
,
1029 'join_date' => '2011-01-21',
1030 'start_date' => '2010-01-21',
1031 'end_date' => '2008-12-21',
1032 'source' => 'Payment',
1034 'status_id' => $this->_membershipStatusID
,
1037 $this->callAPIFailure('membership', 'create', $params);
1039 //membership_contact_id which is no in contact table
1040 $params['membership_contact_id'] = 999;
1041 $this->callAPIFailure('membership', 'create', $params);
1044 unset($params['membership_contact_id']);
1045 $params['join_date'] = "invalid";
1046 $this->callAPIFailure('Membership', 'Create', $params);
1050 * Test civicrm_contact_memberships_create with membership_contact_id
1054 public function testMembershipCreateWithMemContact() {
1056 'membership_contact_id' => $this->_contactID
,
1057 'membership_type_id' => $this->_membershipTypeID
,
1058 'join_date' => '2011-01-21',
1059 'start_date' => '2010-01-21',
1060 'end_date' => '2008-12-21',
1061 'source' => 'Payment',
1063 'status_id' => $this->_membershipStatusID
,
1066 $result = $this->callAPISuccess('membership', 'create', $params);
1068 $this->callAPISuccess('Membership', 'Delete', [
1069 'id' => $result['id'],
1074 * Test civicrm_contact_memberships_create with membership_contact_id
1078 public function testMembershipCreateValidMembershipTypeString() {
1080 'membership_contact_id' => $this->_contactID
,
1081 'membership_type_id' => 'General',
1082 'join_date' => '2011-01-21',
1083 'start_date' => '2010-01-21',
1084 'end_date' => '2008-12-21',
1085 'source' => 'Payment',
1087 'status_id' => $this->_membershipStatusID
,
1090 $result = $this->callAPISuccess('membership', 'create', $params);
1091 $this->assertEquals($this->_membershipTypeID
, $result['values'][$result['id']]['membership_type_id']);
1092 $this->callAPISuccess('Membership', 'Delete', [
1093 'id' => $result['id'],
1098 * Test civicrm_contact_memberships_create with membership_contact_id
1102 public function testMembershipCreateInValidMembershipTypeString() {
1104 'membership_contact_id' => $this->_contactID
,
1105 'membership_type_id' => 'invalid',
1106 'join_date' => '2011-01-21',
1107 'start_date' => '2010-01-21',
1108 'end_date' => '2008-12-21',
1109 'source' => 'Payment',
1111 'status_id' => $this->_membershipStatusID
,
1114 $this->callAPIFailure('membership', 'create', $params);
1118 * Test that if membership join date is not set it defaults to today.
1120 public function testEmptyJoinDate() {
1121 unset($this->_params
['join_date'], $this->_params
['is_override']);
1122 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1123 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1124 $this->assertEquals(date('Y-m-d', strtotime('now')), $result['join_date']);
1125 $this->assertEquals('2009-01-21', $result['start_date']);
1126 $this->assertEquals('2009-12-21', $result['end_date']);
1130 * Test that if membership start date is not set it defaults to correct end date.
1133 public function testEmptyStartDateFixed() {
1134 unset($this->_params
['start_date'], $this->_params
['is_override']);
1135 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1136 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1137 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1138 $this->assertEquals('2009-01-21', $result['join_date']);
1139 $this->assertEquals('2008-03-01', $result['start_date']);
1140 $this->assertEquals('2009-12-21', $result['end_date']);
1144 * Test that if membership start date is not set it defaults to correct end date
1147 public function testEmptyStartEndDateFixedOneYear() {
1148 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1149 $this->callAPISuccess('membership_type', 'create', ['id' => $this->_membershipTypeID2
, 'duration_interval' => 1]);
1150 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1151 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1152 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1153 $this->assertEquals('2009-01-21', $result['join_date']);
1154 $this->assertEquals('2008-03-01', $result['start_date']);
1155 $this->assertEquals('2010-02-28', $result['end_date']);
1159 * Test that if membership start date is not set it defaults to correct end date for fixed multi year memberships.
1161 public function testEmptyStartEndDateFixedMultiYear() {
1162 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1163 $this->callAPISuccess('membership_type', 'create', ['id' => $this->_membershipTypeID2
, 'duration_interval' => 5]);
1164 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1165 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1166 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1167 $this->assertEquals('2009-01-21', $result['join_date']);
1168 $this->assertEquals('2008-03-01', $result['start_date']);
1169 $this->assertEquals('2014-02-28', $result['end_date']);
1173 * CRM-18503 - Test membership join date is correctly set for fixed memberships.
1175 public function testMembershipJoinDateFixed() {
1176 $memStatus = CRM_Member_PseudoConstant
::membershipStatus();
1177 // Update the fixed membership type to 1 year duration.
1178 $this->callAPISuccess('membership_type', 'create', ['id' => $this->_membershipTypeID2
, 'duration_interval' => 1]);
1179 $contactId = $this->createLoggedInUser();
1180 // Create membership with 'Pending' status.
1182 'contact_id' => $contactId,
1183 'membership_type_id' => $this->_membershipTypeID2
,
1184 'source' => 'test membership',
1185 'is_pay_later' => 0,
1186 'status_id' => array_search('Pending', $memStatus),
1187 'skipStatusCal' => 1,
1188 'is_for_organization' => 1,
1190 // @todo stop passing empty $ids
1192 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
1194 // Update membership to 'Completed' and check the dates.
1196 'id' => $membership->id
,
1197 'contact_id' => $contactId,
1199 'membership_type_id' => $this->_membershipTypeID2
,
1201 'status_id' => array_search('New', $memStatus),
1203 $result = $this->callAPISuccess('Membership', 'create', $memParams);
1205 // Extend duration interval if join_date exceeds the rollover period.
1206 $joinDate = date('Y-m-d');
1208 $startDate = date('Y-m-d', strtotime(date('Y-03-01')));
1210 if (strtotime($startDate) > time()) {
1212 $startDate = date('Y-m-d', strtotime(date('Y-03-01') . '- 1 year'));
1214 $membershipTypeDetails = CRM_Member_BAO_MembershipType
::getMembershipTypeDetails($this->_membershipTypeID2
);
1215 $fixedPeriodRollover = CRM_Member_BAO_MembershipType
::isDuringFixedAnnualRolloverPeriod($joinDate, $membershipTypeDetails, $year, $startDate);
1217 if ($fixedPeriodRollover && $rollOver) {
1222 'join_date' => date('Ymd'),
1223 'start_date' => str_replace('-', '', $startDate),
1224 'end_date' => date('Ymd', strtotime(date('Y-03-01') . "+ {$y} year - 1 day")),
1226 foreach ($result['values'] as $values) {
1227 foreach ($expectedDates as $date => $val) {
1228 $this->assertEquals($val, $values[$date], "Failed asserting {$date} values");
1234 * Test correct end and start dates are calculated for fixed multi year memberships.
1236 * The empty start date is calculated to be the start_date (1 Jan prior to the join_date - so 1 Jan 15)
1238 * In this set our start date is after the start day and before the rollover day so we don't get an extra year
1239 * and we end one day before the rollover day. Start day is 1 Jan so we end on 31 Dec
1240 * and we add on 4 years rather than 5 because we are not after the rollover day - so we calculate 31 Dec 2019
1242 public function testFixedMultiYearDateSetTwoEmptyStartEndDate() {
1243 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1245 $this->callAPISuccess('membership_type', 'create', [
1246 'id' => $this->_membershipTypeID2
,
1247 'duration_interval' => 5,
1249 'fixed_period_start_day' => '101',
1251 'fixed_period_rollover_day' => '1101',
1253 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1255 'join_date' => '28-Jan 2015',
1257 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1258 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1259 $this->assertEquals('2015-01-28', $result['join_date']);
1260 $this->assertEquals('2015-01-01', $result['start_date']);
1261 $this->assertEquals('2019-12-31', $result['end_date']);
1265 * Test that correct end date is calculated for fixed multi year memberships and start date is not changed.
1267 * In this set our start date is after the start day and before the rollover day so we don't get an extra year
1268 * and we end one day before the rollover day. Start day is 1 Jan so we end on 31 Dec
1269 * and we add on 4 years rather than 5 because we are not after the rollover day - so we calculate 31 Dec 2019
1271 public function testFixedMultiYearDateSetTwoEmptyEndDate() {
1272 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1274 $this->callAPISuccess('membership_type', 'create', [
1275 'id' => $this->_membershipTypeID2
,
1276 'duration_interval' => 5,
1278 'fixed_period_start_day' => '101',
1280 'fixed_period_rollover_day' => '1101',
1282 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1284 'start_date' => '28-Jan 2015',
1285 'join_date' => '28-Jan 2015',
1287 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1288 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1289 $this->assertEquals('2015-01-28', $result['join_date']);
1290 $this->assertEquals('2015-01-28', $result['start_date']);
1291 $this->assertEquals('2019-12-31', $result['end_date']);
1295 * Test correct end and start dates are calculated for fixed multi year memberships.
1297 * The empty start date is calculated to be the start_date (1 Jan prior to the join_date - so 1 Jan 15)
1299 * In this set our start date is after the start day and before the rollover day so we don't get an extra year
1300 * and we end one day before the rollover day. Start day is 1 Jan so we end on 31 Dec
1301 * and we add on <1 years rather than > 1 because we are not after the rollover day - so we calculate 31 Dec 2015
1303 public function testFixedSingleYearDateSetTwoEmptyStartEndDate() {
1304 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1306 $this->callAPISuccess('membership_type', 'create', [
1307 'id' => $this->_membershipTypeID2
,
1308 'duration_interval' => 1,
1310 'fixed_period_start_day' => '101',
1312 'fixed_period_rollover_day' => '1101',
1314 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1316 'join_date' => '28-Jan 2015',
1318 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1319 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1320 $this->assertEquals('2015-01-28', $result['join_date']);
1321 $this->assertEquals('2015-01-01', $result['start_date']);
1322 $this->assertEquals('2015-12-31', $result['end_date']);
1326 * Test correct end date for fixed single year memberships is calculated and start_date is not changed.
1328 * In this set our start date is after the start day and before the rollover day so we don't get an extra year
1329 * and we end one day before the rollover day. Start day is 1 Jan so we end on 31 Dec
1330 * and we add on <1 years rather than > 1 because we are not after the rollover day - so we calculate 31 Dec 2015
1332 public function testFixedSingleYearDateSetTwoEmptyEndDate() {
1333 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1335 $this->callAPISuccess('membership_type', 'create', [
1336 'id' => $this->_membershipTypeID2
,
1337 'duration_interval' => 1,
1339 'fixed_period_start_day' => '101',
1341 'fixed_period_rollover_day' => '1101',
1343 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1345 'start_date' => '28-Jan 2015',
1346 'join_date' => '28-Jan 2015',
1348 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1349 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1350 $this->assertEquals('2015-01-28', $result['join_date']);
1351 $this->assertEquals('2015-01-28', $result['start_date']);
1352 $this->assertEquals('2015-12-31', $result['end_date']);
1356 * Test that correct end date is calculated for fixed multi year memberships and start date is not changed.
1358 * In this set our start date is after the start day and after the rollover day so we do get an extra year
1359 * and we end one day before the rollover day. Start day is 1 Nov so we end on 31 Oct
1360 * and we add on 1 year we are after the rollover day - so we calculate 31 Oct 2016
1362 public function testFixedSingleYearDateSetThreeEmptyEndDate() {
1363 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1365 $this->callAPISuccess('membership_type', 'create', [
1366 'id' => $this->_membershipTypeID2
,
1367 'duration_interval' => 1,
1369 'fixed_period_start_day' => '1101',
1371 'fixed_period_rollover_day' => '101',
1373 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1375 'start_date' => '28-Jan 2015',
1376 'join_date' => '28-Jan 2015',
1378 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1379 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1380 $this->assertEquals('2015-01-28', $result['join_date']);
1381 $this->assertEquals('2015-01-28', $result['start_date']);
1382 $this->assertEquals('2016-10-31', $result['end_date']);
1386 * Test correct end and start dates are calculated for fixed multi year memberships.
1388 * The empty start date is calculated to be the start_date (1 Nov prior to the join_date - so 1 Nov 14)
1390 * In this set our start date is after the start day and after the rollover day so we do get an extra year
1391 * and we end one day before the rollover day. Start day is 1 Nov so we end on 31 Oct
1392 * and we add on 1 year we are after the rollover day - so we calculate 31 Oct 2016
1394 public function testFixedSingleYearDateSetThreeEmptyStartEndDate() {
1395 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1397 $this->callAPISuccess('membership_type', 'create', [
1398 'id' => $this->_membershipTypeID2
,
1399 'duration_interval' => 1,
1401 'fixed_period_start_day' => '1101',
1403 'fixed_period_rollover_day' => '101',
1405 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1407 'join_date' => '28-Jan 2015',
1409 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1410 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1411 $this->assertEquals('2015-01-28', $result['join_date']);
1412 $this->assertEquals('2014-11-01', $result['start_date']);
1413 $this->assertEquals('2016-10-31', $result['end_date']);
1417 * Test that correct end date is calculated for fixed multi year memberships and start date is not changed.
1419 * In this set our start date is after the start day and after the rollover day so we do get an extra year
1420 * and we end one day before the rollover day. Start day is 1 Nov so we end on 31 Oct
1421 * and we add on 5 years we are after the rollover day - so we calculate 31 Oct 2020
1423 public function testFixedMultiYearDateSetThreeEmptyEndDate() {
1424 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1426 $this->callAPISuccess('membership_type', 'create', [
1427 'id' => $this->_membershipTypeID2
,
1428 'duration_interval' => 5,
1430 'fixed_period_start_day' => '1101',
1432 'fixed_period_rollover_day' => '101',
1434 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1436 'start_date' => '28-Jan 2015',
1437 'join_date' => '28-Jan 2015',
1439 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1440 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1441 $this->assertEquals('2015-01-28', $result['join_date']);
1442 $this->assertEquals('2015-01-28', $result['start_date']);
1443 $this->assertEquals('2020-10-31', $result['end_date']);
1447 * Test correct end and start dates are calculated for fixed multi year memberships.
1449 * The empty start date is calculated to be the start_date (1 Nov prior to the join_date - so 1 Nov 14)
1451 * The empty start date is calculated to be the start_date (1 Nov prior to the join_date - so 1 Nov 14)
1452 * In this set our join date is after the start day and after the rollover day so we do get an extra year
1453 * and we end one day before the rollover day. Start day is 1 Nov so we end on 31 Oct
1454 * and we add on 5 years we are after the rollover day - so we calculate 31 Oct 2020
1456 public function testFixedMultiYearDateSetThreeEmptyStartEndDate() {
1457 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1459 $this->callAPISuccess('membership_type', 'create', [
1460 'id' => $this->_membershipTypeID2
,
1461 'duration_interval' => 5,
1463 'fixed_period_start_day' => '1101',
1465 'fixed_period_rollover_day' => '101',
1467 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1469 'join_date' => '28-Jan 2015',
1471 $result = $this->callAPISuccess($this->_entity
, 'create', array_merge($this->_params
, $dates));
1472 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1473 $this->assertEquals('2015-01-28', $result['join_date']);
1474 $this->assertEquals('2014-11-01', $result['start_date']);
1475 $this->assertEquals('2020-10-31', $result['end_date']);
1479 * Test that if membership start date is not set it defaults to correct end date for fixed single year memberships.
1481 public function testEmptyStartDateRolling() {
1482 unset($this->_params
['start_date'], $this->_params
['is_override']);
1483 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1484 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1485 $this->assertEquals('2009-01-21', $result['join_date']);
1486 $this->assertEquals('2009-01-21', $result['start_date']);
1487 $this->assertEquals('2009-12-21', $result['end_date']);
1491 * Test that if membership end date is not set it defaults to correct end date.
1494 public function testEmptyEndDateFixed() {
1495 unset($this->_params
['start_date'], $this->_params
['is_override'], $this->_params
['end_date']);
1496 $this->_params
['membership_type_id'] = $this->_membershipTypeID2
;
1497 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1498 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1499 $this->assertEquals('2009-01-21', $result['join_date']);
1500 $this->assertEquals('2008-03-01', $result['start_date']);
1501 $this->assertEquals('2010-02-28', $result['end_date']);
1505 * Test that if membership end date is not set it defaults to correct end date.
1508 public function testEmptyEndDateRolling() {
1509 unset($this->_params
['is_override'], $this->_params
['end_date']);
1510 $this->_params
['membership_type_id'] = $this->_membershipTypeID
;
1511 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1512 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1513 $this->assertEquals('2009-01-21', $result['join_date']);
1514 $this->assertEquals('2009-01-21', $result['start_date']);
1515 $this->assertEquals('2010-01-20', $result['end_date']);
1519 * Test that if dates are set they not over-ridden if id is passed in
1521 public function testMembershipDatesNotOverridden() {
1522 $result = $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1523 unset($this->_params
['end_date'], $this->_params
['start_date']);
1524 $this->_params
['id'] = $result['id'];
1525 $this->callAPISuccess($this->_entity
, 'create', $this->_params
);
1526 $result = $this->callAPISuccess($this->_entity
, 'getsingle', ['id' => $result['id']]);
1527 $this->assertEquals('2009-01-21', $result['join_date']);
1528 $this->assertEquals('2009-01-21', $result['start_date']);
1529 $this->assertEquals('2009-12-21', $result['end_date']);
1534 * Test that all membership types are returned when getoptions is called.
1536 * This test locks in current behaviour where types for all domains are returned. It should possibly be domain
1537 * specific but that should only be done in conjunction with adding a hook to allow that to be altered as the
1538 * multisite use case expects the master domain to be able to see all sites.
1542 public function testGetOptionsMembershipTypeID() {
1543 $options = $this->callAPISuccess('Membership', 'getoptions', ['field' => 'membership_type_id']);
1544 $this->assertEquals('Another one', array_pop($options['values']));
1545 $this->assertEquals('General', array_pop($options['values']));
1546 $this->assertEquals(NULL, array_pop($options['values']));