3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
29 require_once 'CiviTest/CiviUnitTestCase.php';
30 require_once 'CiviTest/Contact.php';
31 require_once 'CiviTest/Custom.php';
32 require_once 'CiviTest/ContributionPage.php';
33 require_once 'CiviTest/Membership.php';
34 require_once 'CRM/Core/Controller.php';
37 * Class CRM_Member_BAO_MembershipTest
39 class CRM_Member_BAO_MembershipTest
extends CiviUnitTestCase
{
41 public function setUp() {
43 // FIXME: something NULLs $GLOBALS['_HTML_QuickForm_registered_rules'] when the tests are ran all together
44 $GLOBALS['_HTML_QuickForm_registered_rules'] = array(
45 'required' => array('html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'),
46 'maxlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
47 'minlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
48 'rangelength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
49 'email' => array('html_quickform_rule_email', 'HTML/QuickForm/Rule/Email.php'),
50 'regex' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
51 'lettersonly' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
52 'alphanumeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
53 'numeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
54 'nopunctuation' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
55 'nonzero' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
56 'callback' => array('html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'),
57 'compare' => array('html_quickform_rule_compare', 'HTML/QuickForm/Rule/Compare.php'),
60 $this->_contactID
= $this->organizationCreate();
61 $this->_membershipTypeID
= $this->membershipTypeCreate(array('member_of_contact_id' => $this->_contactID
));
62 // add a random number to avoid silly conflicts with old data
63 $this->_membershipStatusID
= $this->membershipStatusCreate('test status' . rand(1, 1000));
67 * Tears down the fixture, for example, closes a network connection.
68 * This method is called after a test is executed.
70 public function tearDown() {
71 $this->membershipTypeDelete(array('id' => $this->_membershipTypeID
));
72 $this->membershipStatusDelete($this->_membershipStatusID
);
73 Contact
::delete($this->_contactID
);
75 $this->_contactID
= $this->_membershipStatusID
= $this->_membershipTypeID
= NULL;
78 public function testCreate() {
80 $contactId = Contact
::createIndividual();
83 'contact_id' => $contactId,
84 'membership_type_id' => $this->_membershipTypeID
,
85 'join_date' => date('Ymd', strtotime('2006-01-21')),
86 'start_date' => date('Ymd', strtotime('2006-01-21')),
87 'end_date' => date('Ymd', strtotime('2006-12-21')),
88 'source' => 'Payment',
90 'status_id' => $this->_membershipStatusID
,
93 CRM_Member_BAO_Membership
::create($params, $ids);
95 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
96 'contact_id', 'Database check for created membership.'
99 // Now call create() to modify an existing Membership
103 'contact_id' => $contactId,
104 'membership_type_id' => $this->_membershipTypeID
,
105 'join_date' => date('Ymd', strtotime('2006-01-21')),
106 'start_date' => date('Ymd', strtotime('2006-01-21')),
107 'end_date' => date('Ymd', strtotime('2006-12-21')),
108 'source' => 'Payment',
110 'status_id' => $this->_membershipStatusID
,
113 'membership' => $membershipId,
115 CRM_Member_BAO_Membership
::create($params, $ids);
117 $membershipTypeId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId,
118 'membership_type_id', 'contact_id',
119 'Database check on updated membership record.'
121 $this->assertEquals($membershipTypeId, $this->_membershipTypeID
, 'Verify membership type id is fetched.');
123 $this->membershipDelete($membershipId);
124 Contact
::delete($contactId);
127 public function testGetValues() {
128 // $this->markTestSkipped( 'causes mysterious exit, needs fixing!' );
129 // Calculate membership dates based on the current date
131 $year_from_now = $now +
(365 * 24 * 60 * 60);
132 $last_month = $now - (30 * 24 * 60 * 60);
133 $year_from_last_month = $last_month +
(365 * 24 * 60 * 60);
135 $contactId = Contact
::createIndividual();
138 'contact_id' => $contactId,
139 'membership_type_id' => $this->_membershipTypeID
,
140 'join_date' => date('Ymd'),
141 'start_date' => date('Ymd'),
142 'end_date' => date('Ymd', $year_from_now),
143 'source' => 'Payment',
145 'status_id' => $this->_membershipStatusID
,
149 CRM_Member_BAO_Membership
::create($params, $ids);
151 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
152 'contact_id', 'Database check for created membership.'
156 'contact_id' => $contactId,
157 'membership_type_id' => $this->_membershipTypeID
,
158 'join_date' => date('Ymd', $last_month),
159 'start_date' => date('Ymd', $last_month),
160 'end_date' => date('Ymd', $year_from_last_month),
161 'source' => 'Source123',
163 'status_id' => $this->_membershipStatusID
,
166 CRM_Member_BAO_Membership
::create($params, $ids);
168 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'source123', 'id',
169 'source', 'Database check for created membership.'
172 $membership = array('contact_id' => $contactId);
173 $membershipValues = array();
174 CRM_Member_BAO_Membership
::getValues($membership, $membershipValues, TRUE);
176 $this->assertEquals($membershipValues[$membershipId1]['membership_id'], $membershipId1, 'Verify membership record 1 is fetched.');
178 $this->assertEquals($membershipValues[$membershipId2]['membership_id'], $membershipId2, 'Verify membership record 2 is fetched.');
180 $this->membershipDelete($membershipId1);
181 $this->membershipDelete($membershipId2);
182 Contact
::delete($contactId);
185 public function testRetrieve() {
186 $contactId = Contact
::createIndividual();
189 'contact_id' => $contactId,
190 'membership_type_id' => $this->_membershipTypeID
,
191 'join_date' => date('Ymd', strtotime('2006-01-21')),
192 'start_date' => date('Ymd', strtotime('2006-01-21')),
193 'end_date' => date('Ymd', strtotime('2006-12-21')),
194 'source' => 'Payment',
196 'status_id' => $this->_membershipStatusID
,
199 CRM_Member_BAO_Membership
::create($params, $ids);
201 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
202 'contact_id', 'Database check for created membership.'
204 $params = array('id' => $membershipId);
206 CRM_Member_BAO_Membership
::retrieve($params, $values);
207 $this->assertEquals($values['id'], $membershipId, 'Verify membership record is retrieved.');
209 $this->membershipDelete($membershipId);
210 $this->contactDelete($contactId);
213 public function testActiveMembers() {
214 $contactId = Contact
::createIndividual();
217 'contact_id' => $contactId,
218 'membership_type_id' => $this->_membershipTypeID
,
219 'join_date' => date('Ymd', strtotime('2006-01-21')),
220 'start_date' => date('Ymd', strtotime('2006-01-21')),
221 'end_date' => date('Ymd', strtotime('2006-12-21')),
222 'source' => 'Payment',
224 'status_id' => $this->_membershipStatusID
,
227 CRM_Member_BAO_Membership
::create($params, $ids);
229 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
230 'contact_id', 'Database check for created membership.'
233 $params = array('id' => $membershipId1);
235 CRM_Member_BAO_Membership
::retrieve($params, $values1);
236 $membership = array($membershipId1 => $values1);
239 'contact_id' => $contactId,
240 'membership_type_id' => $this->_membershipTypeID
,
241 'join_date' => date('Ymd', strtotime('2006-01-21')),
242 'start_date' => date('Ymd', strtotime('2006-01-21')),
243 'end_date' => date('Ymd', strtotime('2006-12-21')),
244 'source' => 'PaySource',
246 'status_id' => $this->_membershipStatusID
,
249 CRM_Member_BAO_Membership
::create($params, $ids);
251 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'PaySource', 'id',
252 'source', 'Database check for created membership.'
255 $params = array('id' => $membershipId2);
257 CRM_Member_BAO_Membership
::retrieve($params, $values2);
258 $membership[$membershipId2] = $values2;
260 $activeMembers = CRM_Member_BAO_Membership
::activeMembers($membership);
261 $inActiveMembers = CRM_Member_BAO_Membership
::activeMembers($membership, 'inactive');
263 $this->assertEquals($activeMembers[$membershipId1]['id'], $membership[$membershipId1]['id'], 'Verify active membership record is retrieved.');
264 $this->assertEquals($activeMembers[$membershipId2]['id'], $membership[$membershipId2]['id'], 'Verify active membership record is retrieved.');
266 $this->assertEquals(0, count($inActiveMembers), 'Verify No inactive membership record is retrieved.');
268 $this->membershipDelete($membershipId1);
269 $this->membershipDelete($membershipId2);
270 Contact
::delete($contactId);
273 public function testDeleteMembership() {
274 $contactId = Contact
::createIndividual();
277 'contact_id' => $contactId,
278 'membership_type_id' => $this->_membershipTypeID
,
279 'join_date' => date('Ymd', strtotime('2006-01-21')),
280 'start_date' => date('Ymd', strtotime('2006-01-21')),
281 'end_date' => date('Ymd', strtotime('2006-12-21')),
282 'source' => 'Payment',
284 'status_id' => $this->_membershipStatusID
,
287 CRM_Member_BAO_Membership
::create($params, $ids);
289 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
290 'contact_id', 'Database check for created membership.'
292 CRM_Member_BAO_Membership
::del($membershipId);
294 $membershipId = $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
295 'contact_id', 'Database check for deleted membership.'
297 Contact
::delete($contactId);
300 public function testGetContactMembership() {
301 $contactId = Contact
::createIndividual();
304 'contact_id' => $contactId,
305 'membership_type_id' => $this->_membershipTypeID
,
306 'join_date' => date('Ymd', strtotime('2006-01-21')),
307 'start_date' => date('Ymd', strtotime('2006-01-21')),
308 'end_date' => date('Ymd', strtotime('2006-12-21')),
309 'source' => 'Payment',
311 'status_id' => $this->_membershipStatusID
,
314 CRM_Member_BAO_Membership
::create($params, $ids);
316 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
317 'contact_id', 'Database check for created membership.'
320 $membership = CRM_Member_BAO_Membership
::getContactMembership($contactId, $this->_membershipTypeID
, FALSE);
322 $this->assertEquals($membership['id'], $membershipId, 'Verify membership record is retrieved.');
324 $this->membershipDelete($membershipId);
325 Contact
::delete($contactId);
330 * Get the contribution.
331 * page id from the membership record
333 public function testgetContributionPageId() {
334 $contactId = Contact
::createIndividual();
337 'contact_id' => $contactId,
338 'membership_type_id' => $this->_membershipTypeID
,
339 'join_date' => date('Ymd', strtotime('2006-01-21')),
340 'start_date' => date('Ymd', strtotime('2006-01-21')),
341 'end_date' => date('Ymd', strtotime('2006-12-21')),
342 'source' => 'Payment',
344 'status_id' => $this->_membershipStatusID
,
347 CRM_Member_BAO_Membership
::create($params, $ids);
349 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
350 'contact_id', 'Database check for created membership.'
352 $membership[$membershipId]['renewPageId'] = CRM_Member_BAO_Membership
::getContributionPageId($membershipId);
354 $this->membershipDelete($membershipId);
355 Contact
::delete($contactId);
359 * Get membership joins/renewals
360 * for a specified membership
363 public function testgetMembershipStarts() {
364 $contactId = Contact
::createIndividual();
367 'contact_id' => $contactId,
368 'membership_type_id' => $this->_membershipTypeID
,
369 'join_date' => date('Ymd', strtotime('2006-01-21')),
370 'start_date' => date('Ymd', strtotime('2006-01-21')),
371 'end_date' => date('Ymd', strtotime('2006-12-21')),
372 'source' => 'Payment',
374 'status_id' => $this->_membershipStatusID
,
377 CRM_Member_BAO_Membership
::create($params, $ids);
379 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
380 'contact_id', 'Database check for created membership.'
382 $yearStart = date('Y') . '0101';
383 $currentDate = date('Ymd');
384 CRM_Member_BAO_Membership
::getMembershipStarts($this->_membershipTypeID
, $yearStart, $currentDate);
386 $this->membershipDelete($membershipId);
387 Contact
::delete($contactId);
391 * Get a count of membership for a specified membership type,
392 * optionally for a specified date.
394 public function testGetMembershipCount() {
395 $contactId = Contact
::createIndividual();
398 'contact_id' => $contactId,
399 'membership_type_id' => $this->_membershipTypeID
,
400 'join_date' => date('Ymd', strtotime('2006-01-21')),
401 'start_date' => date('Ymd', strtotime('2006-01-21')),
402 'end_date' => date('Ymd', strtotime('2006-12-21')),
403 'source' => 'Payment',
405 'status_id' => $this->_membershipStatusID
,
408 CRM_Member_BAO_Membership
::create($params, $ids);
410 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
411 'contact_id', 'Database check for created membership.'
413 $currentDate = date('Ymd');
415 CRM_Member_BAO_Membership
::getMembershipCount($this->_membershipTypeID
, $currentDate, $test);
417 $this->membershipDelete($membershipId);
418 Contact
::delete($contactId);
423 * Take sort name of contact during
424 * Update multiple memberships
426 public function testsortName() {
427 $contactId = Contact
::createIndividual();
430 'contact_id' => $contactId,
431 'membership_type_id' => $this->_membershipTypeID
,
432 'join_date' => date('Ymd', strtotime('2006-01-21')),
433 'start_date' => date('Ymd', strtotime('2006-01-21')),
434 'end_date' => date('Ymd', strtotime('2006-12-21')),
435 'source' => 'Payment',
437 'status_id' => $this->_membershipStatusID
,
441 CRM_Member_BAO_Membership
::create($params, $ids);
443 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
444 'contact_id', 'Database check for created membership.'
447 CRM_Member_BAO_Membership
::sortName($membershipId);
449 $this->assertDBCompareValue('CRM_Contact_DAO_Contact', $contactId, 'sort_name', 'id', 'Doe, John',
450 'Database check for sort name record.'
453 $this->membershipDelete($membershipId);
454 Contact
::delete($contactId);
458 * Delete related memberships.
460 public function testdeleteRelatedMemberships() {
461 $contactId = Contact
::createIndividual();
464 'contact_id' => $contactId,
465 'membership_type_id' => $this->_membershipTypeID
,
466 'join_date' => date('Ymd', strtotime('2006-01-21')),
467 'start_date' => date('Ymd', strtotime('2006-01-21')),
468 'end_date' => date('Ymd', strtotime('2006-12-21')),
469 'source' => 'Payment',
471 'status_id' => $this->_membershipStatusID
,
475 CRM_Member_BAO_Membership
::create($params, $ids);
477 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
478 'contact_id', 'Database check for created membership.'
481 CRM_Member_BAO_Membership
::deleteRelatedMemberships($membershipId);
483 $this->membershipDelete($membershipId);
484 Contact
::delete($contactId);
488 * Renew membership with change in membership type.
490 public function testRenewMembership() {
491 $contactId = Contact
::createIndividual();
492 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
493 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
495 'contact_id' => $contactId,
496 'membership_type_id' => $this->_membershipTypeID
,
497 'join_date' => $joinDate,
498 'start_date' => $startDate,
499 'end_date' => $endDate,
500 'source' => 'Payment',
502 'status_id' => $this->_membershipStatusID
,
505 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
506 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
507 'contact_id', 'Database check for created membership.'
510 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
514 'Database checked on membershiplog record.'
517 // this is a test and we dont want qfKey generation / validation
518 // easier to suppress it, than change core code
519 $config = CRM_Core_Config
::singleton();
520 $config->keyDisable
= TRUE;
522 $isTestMembership = 0;
523 list($MembershipRenew) = CRM_Member_BAO_Membership
::renewMembership(
525 $this->_membershipTypeID
,
538 $endDate = date("Y-m-d", strtotime($membership->end_date
. " +1 year"));
540 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
541 $MembershipRenew->id
,
544 'Database checked on membershiplog record.'
546 $this->assertEquals($this->_membershipTypeID
, $MembershipRenew->membership_type_id
, 'Verify membership type is changed during renewal.');
547 $this->assertEquals($endDate, $MembershipRenew->end_date
, 'Verify correct end date is calculated after membership renewal');
549 $this->membershipDelete($membershipId);
550 Contact
::delete($contactId);
554 * Renew stale membership.
556 public function testStaleMembership() {
558 $contactId = Contact
::createIndividual();
559 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -1 year -15 days"));
560 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
562 'contact_id' => $contactId,
563 'membership_type_id' => $this->_membershipTypeID
,
564 'join_date' => $joinDate,
565 'start_date' => $startDate,
566 'end_date' => $endDate,
567 'source' => 'Payment',
568 'status_id' => $statusId,
572 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
574 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
575 'contact_id', 'Database check for created membership.'
578 $this->assertEquals($membership->status_id
, $statusId, 'Verify correct status id is calculated.');
579 $this->assertEquals($membership->membership_type_id
, $this->_membershipTypeID
,
580 'Verify correct membership type id.'
585 'startDate' => 'start_date',
586 'joinDate' => 'join_date',
587 'endDate' => 'end_date',
590 foreach ($dates as $date => $dbDate) {
591 $this->assertEquals($membership->$dbDate, $
$date,
592 "Verify correct {$date} is present."
596 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
600 'Database checked on membershiplog record.'
603 // this is a test and we dont want qfKey generation / validation
604 // easier to suppress it, than change core code
605 $config = CRM_Core_Config
::singleton();
606 $config->keyDisable
= TRUE;
608 $membershipRenewal = new CRM_Core_Form();
609 $membershipRenewal->controller
= new CRM_Core_Controller();
610 list($MembershipRenew) = CRM_Member_BAO_Membership
::renewMembership(
612 $this->_membershipTypeID
,
626 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
627 $MembershipRenew->id
,
630 'Database checked on membershiplog record.'
633 $this->membershipDelete($membershipId);
634 Contact
::delete($contactId);