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 * Class CRM_Member_BAO_MembershipTest
16 class CRM_Member_BAO_MembershipTest
extends CiviUnitTestCase
{
18 public function setUp() {
21 $this->_contactID
= $this->organizationCreate();
22 $this->_membershipTypeID
= $this->membershipTypeCreate(['member_of_contact_id' => $this->_contactID
]);
23 // add a random number to avoid silly conflicts with old data
24 $this->_membershipStatusID
= $this->membershipStatusCreate('test status' . rand(1, 1000));
28 * Tears down the fixture, for example, closes a network connection.
29 * This method is called after a test is executed.
31 * @throws \CRM_Core_Exception
33 public function tearDown() {
34 $this->membershipTypeDelete(['id' => $this->_membershipTypeID
]);
35 $this->membershipStatusDelete($this->_membershipStatusID
);
36 $this->contactDelete($this->_contactID
);
38 $this->_contactID
= $this->_membershipStatusID
= $this->_membershipTypeID
= NULL;
39 $this->quickCleanUpFinancialEntities();
40 $this->restoreMembershipTypes();
45 * Create membership type using given organization id.
47 * @param $organizationId
48 * @param bool $withRelationship
51 * @throws \CRM_Core_Exception
53 private function createMembershipType($organizationId, $withRelationship = FALSE) {
54 $membershipType = $this->callAPISuccess('MembershipType', 'create', [
57 'member_of_contact_id' => $organizationId,
58 'financial_type_id' => "Member Dues",
59 'duration_unit' => "year",
60 'duration_interval' => 1,
61 'period_type' => "rolling",
62 'name' => 'Organiation Membership Type',
63 'relationship_type_id' => ($withRelationship) ?
5 : NULL,
64 'relationship_direction' => ($withRelationship) ?
'b_a' : NULL,
66 return $membershipType["values"][$membershipType["id"]];
70 * Get count of related memberships by parent membership id.
71 * @param $membershipId
74 private function getRelatedMembershipsCount($membershipId) {
75 return $this->callAPISuccess("Membership", "getcount", [
76 'owner_membership_id' => $membershipId,
81 * Test to delete related membership when type of parent memebrship is changed which does not have relation type associated.
82 * @throws CRM_Core_Exception
84 public function testDeleteRelatedMembershipsOnParentTypeChanged() {
86 $contactId = $this->individualCreate();
87 $membershipOrganizationId = $this->organizationCreate();
88 $organizationId = $this->organizationCreate();
90 // Create relationship between organization and individual contact
91 $this->callAPISuccess('Relationship', 'create', [
92 // Employer of relationship
93 'relationship_type_id' => 5,
94 'contact_id_a' => $contactId,
95 'contact_id_b' => $organizationId,
99 // Create two membership types one with relationship and one without.
100 $membershipTypeWithRelationship = $this->createMembershipType($membershipOrganizationId, TRUE);
101 $membershipTypeWithoutRelationship = $this->createMembershipType($membershipOrganizationId);
103 // Creating membership of organisation
104 $membership = $this->callAPISuccess("Membership", "create", [
105 'membership_type_id' => $membershipTypeWithRelationship["id"],
106 'contact_id' => $organizationId,
107 'status_id' => $this->_membershipStatusID
,
110 $membership = $membership['values'][$membership["id"]];
112 // Check count of related memberships. It should be one for individual contact.
113 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
114 $this->assertEquals(1, $relatedMembershipsCount, 'Related membership count should be 1.');
116 // Update membership by changing it's type. New membership type is without relationship.
117 $membership["membership_type_id"] = $membershipTypeWithoutRelationship["id"];
118 $updatedMembership = $this->callAPISuccess("Membership", "create", $membership);
120 // Check count of related memberships again. It should be zero as we changed the membership type.
121 $relatedMembershipsCount = $this->getRelatedMembershipsCount($membership["id"]);
122 $this->assertEquals(0, $relatedMembershipsCount, 'Related membership count should be 0.');
124 // Clean up: Delete membership
125 $this->membershipDelete($membership["id"]);
128 public function testCreate() {
130 list($contactId, $membershipId) = $this->setupMembership();
132 // Now call create() to modify an existing Membership
134 'contact_id' => $contactId,
135 'membership_type_id' => $this->_membershipTypeID
,
136 'join_date' => date('Ymd', strtotime('2006-01-21')),
137 'start_date' => date('Ymd', strtotime('2006-01-21')),
138 'end_date' => date('Ymd', strtotime('2006-12-21')),
139 'source' => 'Payment',
141 'status_id' => $this->_membershipStatusID
,
144 'membership' => $membershipId,
146 CRM_Member_BAO_Membership
::create($params, $ids);
148 $membershipTypeId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId,
149 'membership_type_id', 'contact_id',
150 'Database check on updated membership record.'
152 $this->assertEquals($membershipTypeId, $this->_membershipTypeID
, 'Verify membership type id is fetched.');
154 $this->membershipDelete($membershipId);
155 $this->contactDelete($contactId);
158 public function testGetValues() {
159 // $this->markTestSkipped( 'causes mysterious exit, needs fixing!' );
160 // Calculate membership dates based on the current date
162 $year_from_now = $now +
(365 * 24 * 60 * 60);
163 $last_month = $now - (30 * 24 * 60 * 60);
164 $year_from_last_month = $last_month +
(365 * 24 * 60 * 60);
166 $contactId = $this->individualCreate();
169 'contact_id' => $contactId,
170 'membership_type_id' => $this->_membershipTypeID
,
171 'join_date' => date('Ymd'),
172 'start_date' => date('Ymd'),
173 'end_date' => date('Ymd', $year_from_now),
174 'source' => 'Payment',
176 'status_id' => $this->_membershipStatusID
,
180 CRM_Member_BAO_Membership
::create($params, $ids);
182 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
183 'contact_id', 'Database check for created membership.'
187 'contact_id' => $contactId,
188 'membership_type_id' => $this->_membershipTypeID
,
189 'join_date' => date('Ymd', $last_month),
190 'start_date' => date('Ymd', $last_month),
191 'end_date' => date('Ymd', $year_from_last_month),
192 'source' => 'Source123',
194 'status_id' => $this->_membershipStatusID
,
197 CRM_Member_BAO_Membership
::create($params, $ids);
199 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'source123', 'id',
200 'source', 'Database check for created membership.'
203 $membership = ['contact_id' => $contactId];
204 $membershipValues = [];
205 CRM_Member_BAO_Membership
::getValues($membership, $membershipValues, TRUE);
207 $this->assertEquals($membershipValues[$membershipId1]['membership_id'], $membershipId1, 'Verify membership record 1 is fetched.');
209 $this->assertEquals($membershipValues[$membershipId2]['membership_id'], $membershipId2, 'Verify membership record 2 is fetched.');
211 $this->membershipDelete($membershipId1);
212 $this->membershipDelete($membershipId2);
213 $this->contactDelete($contactId);
216 public function testRetrieve() {
217 list($contactId, $membershipId) = $this->setupMembership();
218 $params = ['id' => $membershipId];
220 CRM_Member_BAO_Membership
::retrieve($params, $values);
221 $this->assertEquals($values['id'], $membershipId, 'Verify membership record is retrieved.');
223 $this->membershipDelete($membershipId);
224 $this->contactDelete($contactId);
227 public function testActiveMembers() {
228 $contactId = $this->individualCreate();
231 'contact_id' => $contactId,
232 'membership_type_id' => $this->_membershipTypeID
,
233 'join_date' => date('Ymd', strtotime('2006-01-21')),
234 'start_date' => date('Ymd', strtotime('2006-01-21')),
235 'end_date' => date('Ymd', strtotime('2006-12-21')),
236 'source' => 'Payment',
238 'status_id' => $this->_membershipStatusID
,
241 CRM_Member_BAO_Membership
::create($params, $ids);
243 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
244 'contact_id', 'Database check for created membership.'
247 $params = ['id' => $membershipId1];
249 CRM_Member_BAO_Membership
::retrieve($params, $values1);
250 $membership = [$membershipId1 => $values1];
253 'contact_id' => $contactId,
254 'membership_type_id' => $this->_membershipTypeID
,
255 'join_date' => date('Ymd', strtotime('2006-01-21')),
256 'start_date' => date('Ymd', strtotime('2006-01-21')),
257 'end_date' => date('Ymd', strtotime('2006-12-21')),
258 'source' => 'PaySource',
260 'status_id' => $this->_membershipStatusID
,
263 CRM_Member_BAO_Membership
::create($params, $ids);
265 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'PaySource', 'id',
266 'source', 'Database check for created membership.'
269 $params = ['id' => $membershipId2];
271 CRM_Member_BAO_Membership
::retrieve($params, $values2);
272 $membership[$membershipId2] = $values2;
274 $activeMembers = CRM_Member_BAO_Membership
::activeMembers($membership);
275 $inActiveMembers = CRM_Member_BAO_Membership
::activeMembers($membership, 'inactive');
277 $this->assertEquals($activeMembers[$membershipId1]['id'], $membership[$membershipId1]['id'], 'Verify active membership record is retrieved.');
278 $this->assertEquals($activeMembers[$membershipId2]['id'], $membership[$membershipId2]['id'], 'Verify active membership record is retrieved.');
280 $this->assertEquals(0, count($inActiveMembers), 'Verify No inactive membership record is retrieved.');
282 $this->membershipDelete($membershipId1);
283 $this->membershipDelete($membershipId2);
284 $this->contactDelete($contactId);
287 public function testDeleteMembership() {
288 list($contactId, $membershipId) = $this->setupMembership();
289 CRM_Member_BAO_Membership
::del($membershipId);
291 $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
292 'contact_id', 'Database check for deleted membership.'
294 $this->assertDBNull('CRM_Price_BAO_LineItem', $membershipId, 'id',
295 'entity_id', 'Database check for deleted line item.'
297 $this->contactDelete($contactId);
300 public function testGetContactMembership() {
301 list($contactId, $membershipId) = $this->setupMembership();
303 $membership = CRM_Member_BAO_Membership
::getContactMembership($contactId, $this->_membershipTypeID
, FALSE);
305 $this->assertEquals($membership['id'], $membershipId, 'Verify membership record is retrieved.');
307 $this->membershipDelete($membershipId);
308 $this->contactDelete($contactId);
312 * Get the contribution.
313 * page id from the membership record
315 public function testgetContributionPageId() {
316 list($contactId, $membershipId) = $this->setupMembership();
317 $membership[$membershipId]['renewPageId'] = CRM_Member_BAO_Membership
::getContributionPageId($membershipId);
319 $this->membershipDelete($membershipId);
320 $this->contactDelete($contactId);
324 * Get membership joins/renewals
325 * for a specified membership
328 public function testgetMembershipStarts() {
329 list($contactId, $membershipId) = $this->setupMembership();
330 $yearStart = date('Y') . '0101';
331 $currentDate = date('Ymd');
332 CRM_Member_BAO_Membership
::getMembershipStarts($this->_membershipTypeID
, $yearStart, $currentDate);
334 $this->membershipDelete($membershipId);
335 $this->contactDelete($contactId);
339 * Get a count of membership for a specified membership type,
340 * optionally for a specified date.
342 public function testGetMembershipCount() {
343 list($contactId, $membershipId) = $this->setupMembership();
344 $currentDate = date('Ymd');
346 CRM_Member_BAO_Membership
::getMembershipCount($this->_membershipTypeID
, $currentDate, $test);
348 $this->membershipDelete($membershipId);
349 $this->contactDelete($contactId);
353 * Checkup sort name function.
355 public function testSortName() {
356 $contactId = $this->individualCreate();
359 'contact_id' => $contactId,
360 'membership_type_id' => $this->_membershipTypeID
,
361 'join_date' => '2006-01-21',
362 'start_date' => '2006-01-21',
363 'end_date' => '2006-12-21',
364 'source' => 'Payment',
366 'status_id' => $this->_membershipStatusID
,
369 $membership = $this->callAPISuccess('Membership', 'create', $params);
371 $this->assertEquals('Anderson, Anthony', CRM_Member_BAO_Membership
::sortName($membership['id']));
373 $this->membershipDelete($membership['id']);
374 $this->contactDelete($contactId);
378 * Delete related memberships.
380 public function testdeleteRelatedMemberships() {
381 list($contactId, $membershipId) = $this->setupMembership();
383 CRM_Member_BAO_Membership
::deleteRelatedMemberships($membershipId);
385 $this->membershipDelete($membershipId);
386 $this->contactDelete($contactId);
390 * Renew membership with change in membership type.
392 * @fixme Note that this test fails when today is August 29 2019 (and maybe other years?):
393 * Verify correct end date is calculated after membership renewal
394 * Failed asserting that two strings are equal.
395 * Expected-'2021-03-01'
396 * Actual+'2021-02-28'
397 * /home/jenkins/bknix-dfl/build/core-15165-73etc/web/sites/all/modules/civicrm/tests/phpunit/CRM/Member/BAO/MembershipTest.php:609
399 public function testRenewMembership() {
400 $contactId = $this->individualCreate();
401 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
402 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
404 'contact_id' => $contactId,
405 'membership_type_id' => $this->_membershipTypeID
,
406 'join_date' => $joinDate,
407 'start_date' => $startDate,
408 'end_date' => $endDate,
409 'source' => 'Payment',
411 'status_id' => $this->_membershipStatusID
,
414 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
415 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
416 'contact_id', 'Database check for created membership.'
419 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
423 'Database checked on membershiplog record.'
426 // this is a test and we dont want qfKey generation / validation
427 // easier to suppress it, than change core code
428 $config = CRM_Core_Config
::singleton();
429 $config->keyDisable
= TRUE;
431 $isTestMembership = 0;
432 list($MembershipRenew) = CRM_Member_BAO_Membership
::processMembership(
434 $this->_membershipTypeID
,
447 $endDate = date("Y-m-d", strtotime($membership->end_date
. " +1 year"));
449 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
450 $MembershipRenew->id
,
453 'Database checked on membershiplog record.'
455 $this->assertEquals($this->_membershipTypeID
, $MembershipRenew->membership_type_id
, 'Verify membership type is changed during renewal.');
456 $this->assertEquals($endDate, $MembershipRenew->end_date
, 'Verify correct end date is calculated after membership renewal');
458 $this->membershipDelete($membershipId);
459 $this->contactDelete($contactId);
463 * Renew stale membership.
465 * @throws \CRM_Core_Exception
466 * @throws \CiviCRM_API3_Exception
468 public function testStaleMembership() {
470 $contactId = $this->individualCreate();
471 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -1 year -15 days"));
472 $endDate = date('Ymd', strtotime($joinDate . " +1 year -1 day"));
474 'contact_id' => $contactId,
475 'membership_type_id' => $this->_membershipTypeID
,
476 'join_date' => $joinDate,
477 'start_date' => $startDate,
478 'end_date' => $endDate,
479 'source' => 'Payment',
480 'status_id' => $statusId,
484 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
486 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
487 'contact_id', 'Database check for created membership.'
490 $this->assertEquals($membership->status_id
, $statusId, 'Verify correct status id is calculated.');
491 $this->assertEquals($membership->membership_type_id
, $this->_membershipTypeID
,
492 'Verify correct membership type id.'
497 'startDate' => 'start_date',
498 'joinDate' => 'join_date',
499 'endDate' => 'end_date',
502 foreach ($dates as $date => $dbDate) {
503 $this->assertEquals($membership->$dbDate, $
$date,
504 "Verify correct {$date} is present."
508 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
512 'Database checked on membership log record.'
515 list($MembershipRenew) = CRM_Member_BAO_Membership
::processMembership(
517 $this->_membershipTypeID
,
531 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
532 $MembershipRenew->id
,
535 'Database checked on membership log record.'
538 $this->membershipDelete($membershipId);
539 $this->contactDelete($contactId);
542 public function testUpdateAllMembershipStatusConvertExpiredOverriddenStatusToNormal() {
544 'contact_id' => $this->individualCreate(),
545 'membership_type_id' => $this->_membershipTypeID
,
546 'join_date' => date('Ymd', time()),
547 'start_date' => date('Ymd', time()),
548 'end_date' => date('Ymd', strtotime('+1 year')),
549 'source' => 'Payment',
551 'status_override_end_date' => date('Ymd', strtotime('-1 day')),
552 'status_id' => $this->_membershipStatusID
,
555 $createdMembership = CRM_Member_BAO_Membership
::create($params, $ids);
557 CRM_Member_BAO_Membership
::updateAllMembershipStatus();
559 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
561 'id' => $createdMembership->id
,
562 'return' => ['id', 'is_override', 'status_override_end_date'],
565 $this->assertEquals($createdMembership->id
, $membershipAfterProcess['id']);
566 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
567 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
570 public function testUpdateAllMembershipStatusHandleOverriddenWithEndOverrideDateEqualTodayAsExpired() {
572 'contact_id' => $this->individualCreate(),
573 'membership_type_id' => $this->_membershipTypeID
,
574 'join_date' => date('Ymd', time()),
575 'start_date' => date('Ymd', time()),
576 'end_date' => date('Ymd', strtotime('+1 year')),
577 'source' => 'Payment',
579 'status_override_end_date' => date('Ymd', time()),
580 'status_id' => $this->_membershipStatusID
,
583 $createdMembership = CRM_Member_BAO_Membership
::create($params, $ids);
585 CRM_Member_BAO_Membership
::updateAllMembershipStatus();
587 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
589 'id' => $createdMembership->id
,
590 'return' => ['id', 'is_override', 'status_override_end_date'],
593 $this->assertEquals($createdMembership->id
, $membershipAfterProcess['id']);
594 $this->assertArrayNotHasKey('is_override', $membershipAfterProcess);
595 $this->assertArrayNotHasKey('status_override_end_date', $membershipAfterProcess);
598 public function testUpdateAllMembershipStatusDoesNotConvertOverridenMembershipWithoutEndOverrideDateToNormal() {
600 'contact_id' => $this->individualCreate(),
601 'membership_type_id' => $this->_membershipTypeID
,
602 'join_date' => date('Ymd', time()),
603 'start_date' => date('Ymd', time()),
604 'end_date' => date('Ymd', strtotime('+1 year')),
605 'source' => 'Payment',
607 'status_id' => $this->_membershipStatusID
,
610 $createdMembership = CRM_Member_BAO_Membership
::create($params, $ids);
612 CRM_Member_BAO_Membership
::updateAllMembershipStatus();
614 $membershipAfterProcess = civicrm_api3('Membership', 'get', [
616 'id' => $createdMembership->id
,
617 'return' => ['id', 'is_override', 'status_override_end_date'],
620 $this->assertEquals($createdMembership->id
, $membershipAfterProcess['id']);
621 $this->assertEquals(1, $membershipAfterProcess['is_override']);
625 * @throws \CRM_Core_Exception
627 public function testMembershipPaymentForSingleContributionMultipleMembership() {
628 $membershipTypeID1 = $this->membershipTypeCreate(['name' => 'Parent']);
629 $membershipTypeID2 = $this->membershipTypeCreate(['name' => 'Child']);
630 $financialTypeId = $this->getFinancialTypeId('Member Dues');
631 $priceSet = $this->callAPISuccess('price_set', 'create', [
632 'is_quick_config' => 0,
633 'extends' => 'CiviMember',
634 'financial_type_id' => $financialTypeId,
635 'title' => 'Family Membership',
637 $priceSetID = $priceSet['id'];
638 $priceField = $this->callAPISuccess('price_field', 'create', [
639 'price_set_id' => $priceSetID,
640 'label' => 'Memberships',
641 'html_type' => 'Radio',
643 $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', [
644 'price_set_id' => $priceSetID,
645 'price_field_id' => $priceField['id'],
648 'financial_type_id' => $financialTypeId,
649 'membership_type_id' => $membershipTypeID1,
650 'membership_num_terms' => 1,
652 $priceFieldValueId = [1 => $priceFieldValue['id']];
653 $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', [
654 'price_set_id' => $priceSetID,
655 'price_field_id' => $priceField['id'],
658 'financial_type_id' => $financialTypeId,
659 'membership_type_id' => $membershipTypeID2,
660 'membership_num_terms' => 1,
662 $priceFieldValueId[2] = $priceFieldValue['id'];
663 $parentContactId = $this->individualCreate();
664 $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', [
665 'contact_id' => $parentContactId,
667 'frequency_unit' => 'day',
668 'frequency_interval' => 1,
670 'start_date' => 'yesterday',
671 'create_date' => 'yesterday',
672 'modified_date' => 'yesterday',
673 'cancel_date' => NULL,
674 'end_date' => '+ 2 weeks',
675 'processor_id' => '643411460836',
676 'trxn_id' => 'e0d0808e26f3e661c6c18eb7c039d363',
677 'invoice_id' => 'e0d0808e26f3e661c6c18eb7c039d363',
678 'contribution_status_id' => 'In Progress',
680 'next_sched_contribution_date' => '+ 1 week',
683 'payment_processor_id' => $this->paymentProcessorCreate(),
684 'financial_type_id' => $financialTypeId,
685 'payment_instrument_id' => 'Credit Card',
689 'contact_id' => $this->individualCreate(),
690 'membership_type_id' => $membershipTypeID2,
691 'contribution_recur_id' => $contributionRecur['id'],
692 'join_date' => date('Ymd', time()),
693 'start_date' => date('Ymd', time()),
694 'end_date' => date('Ymd', strtotime('+1 year')),
695 'source' => 'Payment',
698 'contact_id' => $this->individualCreate(),
699 'membership_type_id' => $membershipTypeID2,
700 'contribution_recur_id' => $contributionRecur['id'],
701 'join_date' => date('Ymd', time()),
702 'start_date' => date('Ymd', time()),
703 'end_date' => date('Ymd', strtotime('+1 year')),
704 'source' => 'Payment',
707 foreach ($params as $key => $param) {
708 $this->callAPISuccess('membership', 'create', $param);
711 $contribution = $this->callAPISuccess('Order', 'create', [
712 'total_amount' => 150,
713 'contribution_recur_id' => $contributionRecur['id'],
715 'contact_id' => $parentContactId,
716 'financial_type_id' => $financialTypeId,
717 'contribution_status_id' => 'Pending',
719 'api.Payment.create' => ['total_amount' => 150],
724 'price_field_id' => $priceField['id'],
725 'price_field_value_id' => $priceFieldValueId[1],
727 'membership_type_id' => $membershipTypeID1,
731 'financial_type_id' => $financialTypeId,
732 'entity_table' => 'civicrm_membership',
735 'price_field_id' => $priceField['id'],
736 'price_field_value_id' => $priceFieldValueId[2],
741 'membership_type_id' => $membershipTypeID2,
742 'financial_type_id' => $financialTypeId,
743 'entity_table' => 'civicrm_membership',
750 'contact_id' => $parentContactId,
751 'membership_type_id' => $membershipTypeID1,
752 'contribution_recur_id' => $contributionRecur['id'],
753 'join_date' => date('Ymd', time()),
754 'start_date' => date('Ymd', time()),
755 'end_date' => date('Ymd', strtotime('+1 year')),
756 'skipLineItem' => TRUE,
757 'source' => 'Payment',
760 $this->callAPISuccess('contribution', 'repeattransaction', [
761 'original_contribution_id' => $contribution['id'],
762 'contribution_status_id' => 'Completed',
764 $this->callAPISuccessGetCount('Contribution', [], 2);
765 // @todo this fails depending on what tests it is run with due some bad stuff in Membership.create
766 // It needs to be addressed but might involve the switch to ORDER. Membership BAO does bad line item stuff.
767 // $this->callAPISuccessGetCount('LineItem', [], 6);
768 $this->membershipTypeDelete(['id' => $membershipTypeID1]);
769 $this->membershipTypeDelete(['id' => $membershipTypeID2]);
770 $this->validateAllPayments();
771 $this->validateAllContributions();
775 * Test the buildMembershipTypeValues function.
777 * @throws \CiviCRM_API3_Exception
779 public function testBuildMembershipTypeValues() {
780 $this->restoreMembershipTypes();
781 $form = new CRM_Core_Form();
782 $values = CRM_Member_BAO_Membership
::buildMembershipTypeValues($form);
783 $this->assertEquals([
785 'minimum_fee' => '100.000000000',
788 'description' => 'Regular annual membership.',
789 'financial_type_id' => '2',
791 'member_of_contact_id' => $values[1]['member_of_contact_id'],
792 'relationship_type_id' => [7],
793 'relationship_direction' => ['b_a'],
794 'max_related' => NULL,
795 'duration_unit' => 'year',
796 'duration_interval' => '2',
798 'period_type' => 'rolling',
799 'visibility' => 'Public',
802 'minimum_fee_with_tax' => 100.0,
808 * @throws \CRM_Core_Exception
809 * @throws \CiviCRM_API3_Exception
811 protected function setupMembership(): array {
812 $contactId = $this->individualCreate();
815 'contact_id' => $contactId,
816 'membership_type_id' => $this->_membershipTypeID
,
817 'join_date' => date('Ymd', strtotime('2006-01-21')),
818 'start_date' => date('Ymd', strtotime('2006-01-21')),
819 'end_date' => date('Ymd', strtotime('2006-12-21')),
820 'source' => 'Payment',
822 'status_id' => $this->_membershipStatusID
,
825 CRM_Member_BAO_Membership
::create($params, $ids);
827 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
828 'contact_id', 'Database check for created membership.'
830 return [$contactId, $membershipId];