3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2016 |
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 * Class CRM_Member_BAO_MembershipTest
32 class CRM_Member_BAO_MembershipTest
extends CiviUnitTestCase
{
34 public function setUp() {
36 // FIXME: something NULLs $GLOBALS['_HTML_QuickForm_registered_rules'] when the tests are ran all together
37 $GLOBALS['_HTML_QuickForm_registered_rules'] = array(
38 'required' => array('html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'),
39 'maxlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
40 'minlength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
41 'rangelength' => array('html_quickform_rule_range', 'HTML/QuickForm/Rule/Range.php'),
42 'email' => array('html_quickform_rule_email', 'HTML/QuickForm/Rule/Email.php'),
43 'regex' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
44 'lettersonly' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
45 'alphanumeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
46 'numeric' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
47 'nopunctuation' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
48 'nonzero' => array('html_quickform_rule_regex', 'HTML/QuickForm/Rule/Regex.php'),
49 'callback' => array('html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'),
50 'compare' => array('html_quickform_rule_compare', 'HTML/QuickForm/Rule/Compare.php'),
53 $this->_contactID
= $this->organizationCreate();
54 $this->_membershipTypeID
= $this->membershipTypeCreate(array('member_of_contact_id' => $this->_contactID
));
55 // add a random number to avoid silly conflicts with old data
56 $this->_membershipStatusID
= $this->membershipStatusCreate('test status' . rand(1, 1000));
60 * Tears down the fixture, for example, closes a network connection.
61 * This method is called after a test is executed.
63 public function tearDown() {
64 $this->membershipTypeDelete(array('id' => $this->_membershipTypeID
));
65 $this->membershipStatusDelete($this->_membershipStatusID
);
66 $this->contactDelete($this->_contactID
);
68 $this->_contactID
= $this->_membershipStatusID
= $this->_membershipTypeID
= NULL;
71 public function testCreate() {
73 $contactId = Contact
::createIndividual();
76 'contact_id' => $contactId,
77 'membership_type_id' => $this->_membershipTypeID
,
78 'join_date' => date('Ymd', strtotime('2006-01-21')),
79 'start_date' => date('Ymd', strtotime('2006-01-21')),
80 'end_date' => date('Ymd', strtotime('2006-12-21')),
81 'source' => 'Payment',
83 'status_id' => $this->_membershipStatusID
,
86 CRM_Member_BAO_Membership
::create($params, $ids);
88 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
89 'contact_id', 'Database check for created membership.'
92 // Now call create() to modify an existing Membership
96 'contact_id' => $contactId,
97 'membership_type_id' => $this->_membershipTypeID
,
98 'join_date' => date('Ymd', strtotime('2006-01-21')),
99 'start_date' => date('Ymd', strtotime('2006-01-21')),
100 'end_date' => date('Ymd', strtotime('2006-12-21')),
101 'source' => 'Payment',
103 'status_id' => $this->_membershipStatusID
,
106 'membership' => $membershipId,
108 CRM_Member_BAO_Membership
::create($params, $ids);
110 $membershipTypeId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId,
111 'membership_type_id', 'contact_id',
112 'Database check on updated membership record.'
114 $this->assertEquals($membershipTypeId, $this->_membershipTypeID
, 'Verify membership type id is fetched.');
116 $this->membershipDelete($membershipId);
117 $this->contactDelete($contactId);
120 public function testGetValues() {
121 // $this->markTestSkipped( 'causes mysterious exit, needs fixing!' );
122 // Calculate membership dates based on the current date
124 $year_from_now = $now +
(365 * 24 * 60 * 60);
125 $last_month = $now - (30 * 24 * 60 * 60);
126 $year_from_last_month = $last_month +
(365 * 24 * 60 * 60);
128 $contactId = Contact
::createIndividual();
131 'contact_id' => $contactId,
132 'membership_type_id' => $this->_membershipTypeID
,
133 'join_date' => date('Ymd'),
134 'start_date' => date('Ymd'),
135 'end_date' => date('Ymd', $year_from_now),
136 'source' => 'Payment',
138 'status_id' => $this->_membershipStatusID
,
142 CRM_Member_BAO_Membership
::create($params, $ids);
144 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
145 'contact_id', 'Database check for created membership.'
149 'contact_id' => $contactId,
150 'membership_type_id' => $this->_membershipTypeID
,
151 'join_date' => date('Ymd', $last_month),
152 'start_date' => date('Ymd', $last_month),
153 'end_date' => date('Ymd', $year_from_last_month),
154 'source' => 'Source123',
156 'status_id' => $this->_membershipStatusID
,
159 CRM_Member_BAO_Membership
::create($params, $ids);
161 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'source123', 'id',
162 'source', 'Database check for created membership.'
165 $membership = array('contact_id' => $contactId);
166 $membershipValues = array();
167 CRM_Member_BAO_Membership
::getValues($membership, $membershipValues, TRUE);
169 $this->assertEquals($membershipValues[$membershipId1]['membership_id'], $membershipId1, 'Verify membership record 1 is fetched.');
171 $this->assertEquals($membershipValues[$membershipId2]['membership_id'], $membershipId2, 'Verify membership record 2 is fetched.');
173 $this->membershipDelete($membershipId1);
174 $this->membershipDelete($membershipId2);
175 $this->contactDelete($contactId);
178 public function testRetrieve() {
179 $contactId = Contact
::createIndividual();
182 'contact_id' => $contactId,
183 'membership_type_id' => $this->_membershipTypeID
,
184 'join_date' => date('Ymd', strtotime('2006-01-21')),
185 'start_date' => date('Ymd', strtotime('2006-01-21')),
186 'end_date' => date('Ymd', strtotime('2006-12-21')),
187 'source' => 'Payment',
189 'status_id' => $this->_membershipStatusID
,
192 CRM_Member_BAO_Membership
::create($params, $ids);
194 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
195 'contact_id', 'Database check for created membership.'
197 $params = array('id' => $membershipId);
199 CRM_Member_BAO_Membership
::retrieve($params, $values);
200 $this->assertEquals($values['id'], $membershipId, 'Verify membership record is retrieved.');
202 $this->membershipDelete($membershipId);
203 $this->contactDelete($contactId);
206 public function testActiveMembers() {
207 $contactId = Contact
::createIndividual();
210 'contact_id' => $contactId,
211 'membership_type_id' => $this->_membershipTypeID
,
212 'join_date' => date('Ymd', strtotime('2006-01-21')),
213 'start_date' => date('Ymd', strtotime('2006-01-21')),
214 'end_date' => date('Ymd', strtotime('2006-12-21')),
215 'source' => 'Payment',
217 'status_id' => $this->_membershipStatusID
,
220 CRM_Member_BAO_Membership
::create($params, $ids);
222 $membershipId1 = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
223 'contact_id', 'Database check for created membership.'
226 $params = array('id' => $membershipId1);
228 CRM_Member_BAO_Membership
::retrieve($params, $values1);
229 $membership = array($membershipId1 => $values1);
232 'contact_id' => $contactId,
233 'membership_type_id' => $this->_membershipTypeID
,
234 'join_date' => date('Ymd', strtotime('2006-01-21')),
235 'start_date' => date('Ymd', strtotime('2006-01-21')),
236 'end_date' => date('Ymd', strtotime('2006-12-21')),
237 'source' => 'PaySource',
239 'status_id' => $this->_membershipStatusID
,
242 CRM_Member_BAO_Membership
::create($params, $ids);
244 $membershipId2 = $this->assertDBNotNull('CRM_Member_BAO_Membership', 'PaySource', 'id',
245 'source', 'Database check for created membership.'
248 $params = array('id' => $membershipId2);
250 CRM_Member_BAO_Membership
::retrieve($params, $values2);
251 $membership[$membershipId2] = $values2;
253 $activeMembers = CRM_Member_BAO_Membership
::activeMembers($membership);
254 $inActiveMembers = CRM_Member_BAO_Membership
::activeMembers($membership, 'inactive');
256 $this->assertEquals($activeMembers[$membershipId1]['id'], $membership[$membershipId1]['id'], 'Verify active membership record is retrieved.');
257 $this->assertEquals($activeMembers[$membershipId2]['id'], $membership[$membershipId2]['id'], 'Verify active membership record is retrieved.');
259 $this->assertEquals(0, count($inActiveMembers), 'Verify No inactive membership record is retrieved.');
261 $this->membershipDelete($membershipId1);
262 $this->membershipDelete($membershipId2);
263 $this->contactDelete($contactId);
266 public function testDeleteMembership() {
267 $contactId = Contact
::createIndividual();
270 'contact_id' => $contactId,
271 'membership_type_id' => $this->_membershipTypeID
,
272 'join_date' => date('Ymd', strtotime('2006-01-21')),
273 'start_date' => date('Ymd', strtotime('2006-01-21')),
274 'end_date' => date('Ymd', strtotime('2006-12-21')),
275 'source' => 'Payment',
277 'status_id' => $this->_membershipStatusID
,
280 CRM_Member_BAO_Membership
::create($params, $ids);
282 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
283 'contact_id', 'Database check for created membership.'
285 CRM_Member_BAO_Membership
::del($membershipId);
287 $this->assertDBNull('CRM_Member_BAO_Membership', $contactId, 'id',
288 'contact_id', 'Database check for deleted membership.'
290 $this->contactDelete($contactId);
293 public function testGetContactMembership() {
294 $contactId = Contact
::createIndividual();
297 'contact_id' => $contactId,
298 'membership_type_id' => $this->_membershipTypeID
,
299 'join_date' => date('Ymd', strtotime('2006-01-21')),
300 'start_date' => date('Ymd', strtotime('2006-01-21')),
301 'end_date' => date('Ymd', strtotime('2006-12-21')),
302 'source' => 'Payment',
304 'status_id' => $this->_membershipStatusID
,
307 CRM_Member_BAO_Membership
::create($params, $ids);
309 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
310 'contact_id', 'Database check for created membership.'
313 $membership = CRM_Member_BAO_Membership
::getContactMembership($contactId, $this->_membershipTypeID
, FALSE);
315 $this->assertEquals($membership['id'], $membershipId, 'Verify membership record is retrieved.');
317 $this->membershipDelete($membershipId);
318 $this->contactDelete($contactId);
323 * Get the contribution.
324 * page id from the membership record
326 public function testgetContributionPageId() {
327 $contactId = Contact
::createIndividual();
330 'contact_id' => $contactId,
331 'membership_type_id' => $this->_membershipTypeID
,
332 'join_date' => date('Ymd', strtotime('2006-01-21')),
333 'start_date' => date('Ymd', strtotime('2006-01-21')),
334 'end_date' => date('Ymd', strtotime('2006-12-21')),
335 'source' => 'Payment',
337 'status_id' => $this->_membershipStatusID
,
340 CRM_Member_BAO_Membership
::create($params, $ids);
342 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
343 'contact_id', 'Database check for created membership.'
345 $membership[$membershipId]['renewPageId'] = CRM_Member_BAO_Membership
::getContributionPageId($membershipId);
347 $this->membershipDelete($membershipId);
348 $this->contactDelete($contactId);
352 * Get membership joins/renewals
353 * for a specified membership
356 public function testgetMembershipStarts() {
357 $contactId = Contact
::createIndividual();
360 'contact_id' => $contactId,
361 'membership_type_id' => $this->_membershipTypeID
,
362 'join_date' => date('Ymd', strtotime('2006-01-21')),
363 'start_date' => date('Ymd', strtotime('2006-01-21')),
364 'end_date' => date('Ymd', strtotime('2006-12-21')),
365 'source' => 'Payment',
367 'status_id' => $this->_membershipStatusID
,
370 CRM_Member_BAO_Membership
::create($params, $ids);
372 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
373 'contact_id', 'Database check for created membership.'
375 $yearStart = date('Y') . '0101';
376 $currentDate = date('Ymd');
377 CRM_Member_BAO_Membership
::getMembershipStarts($this->_membershipTypeID
, $yearStart, $currentDate);
379 $this->membershipDelete($membershipId);
380 $this->contactDelete($contactId);
384 * Get a count of membership for a specified membership type,
385 * optionally for a specified date.
387 public function testGetMembershipCount() {
388 $contactId = Contact
::createIndividual();
391 'contact_id' => $contactId,
392 'membership_type_id' => $this->_membershipTypeID
,
393 'join_date' => date('Ymd', strtotime('2006-01-21')),
394 'start_date' => date('Ymd', strtotime('2006-01-21')),
395 'end_date' => date('Ymd', strtotime('2006-12-21')),
396 'source' => 'Payment',
398 'status_id' => $this->_membershipStatusID
,
401 CRM_Member_BAO_Membership
::create($params, $ids);
403 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
404 'contact_id', 'Database check for created membership.'
406 $currentDate = date('Ymd');
408 CRM_Member_BAO_Membership
::getMembershipCount($this->_membershipTypeID
, $currentDate, $test);
410 $this->membershipDelete($membershipId);
411 $this->contactDelete($contactId);
416 * Take sort name of contact during
417 * Update multiple memberships
419 public function testsortName() {
420 $contactId = Contact
::createIndividual();
423 'contact_id' => $contactId,
424 'membership_type_id' => $this->_membershipTypeID
,
425 'join_date' => date('Ymd', strtotime('2006-01-21')),
426 'start_date' => date('Ymd', strtotime('2006-01-21')),
427 'end_date' => date('Ymd', strtotime('2006-12-21')),
428 'source' => 'Payment',
430 'status_id' => $this->_membershipStatusID
,
434 CRM_Member_BAO_Membership
::create($params, $ids);
436 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
437 'contact_id', 'Database check for created membership.'
440 CRM_Member_BAO_Membership
::sortName($membershipId);
442 $this->assertDBCompareValue('CRM_Contact_DAO_Contact', $contactId, 'sort_name', 'id', 'Doe, John',
443 'Database check for sort name record.'
446 $this->membershipDelete($membershipId);
447 $this->contactDelete($contactId);
451 * Delete related memberships.
453 public function testdeleteRelatedMemberships() {
454 $contactId = Contact
::createIndividual();
457 'contact_id' => $contactId,
458 'membership_type_id' => $this->_membershipTypeID
,
459 'join_date' => date('Ymd', strtotime('2006-01-21')),
460 'start_date' => date('Ymd', strtotime('2006-01-21')),
461 'end_date' => date('Ymd', strtotime('2006-12-21')),
462 'source' => 'Payment',
464 'status_id' => $this->_membershipStatusID
,
468 CRM_Member_BAO_Membership
::create($params, $ids);
470 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
471 'contact_id', 'Database check for created membership.'
474 CRM_Member_BAO_Membership
::deleteRelatedMemberships($membershipId);
476 $this->membershipDelete($membershipId);
477 $this->contactDelete($contactId);
481 * Renew membership with change in membership type.
483 public function testRenewMembership() {
484 $contactId = Contact
::createIndividual();
485 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -6 month"));
486 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
488 'contact_id' => $contactId,
489 'membership_type_id' => $this->_membershipTypeID
,
490 'join_date' => $joinDate,
491 'start_date' => $startDate,
492 'end_date' => $endDate,
493 'source' => 'Payment',
495 'status_id' => $this->_membershipStatusID
,
498 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
499 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
500 'contact_id', 'Database check for created membership.'
503 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
507 'Database checked on membershiplog record.'
510 // this is a test and we dont want qfKey generation / validation
511 // easier to suppress it, than change core code
512 $config = CRM_Core_Config
::singleton();
513 $config->keyDisable
= TRUE;
515 $isTestMembership = 0;
516 list($MembershipRenew) = CRM_Member_BAO_Membership
::renewMembership(
518 $this->_membershipTypeID
,
531 $endDate = date("Y-m-d", strtotime($membership->end_date
. " +1 year"));
533 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
534 $MembershipRenew->id
,
537 'Database checked on membershiplog record.'
539 $this->assertEquals($this->_membershipTypeID
, $MembershipRenew->membership_type_id
, 'Verify membership type is changed during renewal.');
540 $this->assertEquals($endDate, $MembershipRenew->end_date
, 'Verify correct end date is calculated after membership renewal');
542 $this->membershipDelete($membershipId);
543 $this->contactDelete($contactId);
547 * Renew stale membership.
549 public function testStaleMembership() {
551 $contactId = Contact
::createIndividual();
552 $joinDate = $startDate = date("Ymd", strtotime(date("Ymd") . " -1 year -15 days"));
553 $endDate = date("Ymd", strtotime($joinDate . " +1 year -1 day"));
555 'contact_id' => $contactId,
556 'membership_type_id' => $this->_membershipTypeID
,
557 'join_date' => $joinDate,
558 'start_date' => $startDate,
559 'end_date' => $endDate,
560 'source' => 'Payment',
561 'status_id' => $statusId,
565 $membership = CRM_Member_BAO_Membership
::create($params, $ids);
567 $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id',
568 'contact_id', 'Database check for created membership.'
571 $this->assertEquals($membership->status_id
, $statusId, 'Verify correct status id is calculated.');
572 $this->assertEquals($membership->membership_type_id
, $this->_membershipTypeID
,
573 'Verify correct membership type id.'
578 'startDate' => 'start_date',
579 'joinDate' => 'join_date',
580 'endDate' => 'end_date',
583 foreach ($dates as $date => $dbDate) {
584 $this->assertEquals($membership->$dbDate, $
$date,
585 "Verify correct {$date} is present."
589 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
593 'Database checked on membershiplog record.'
596 // this is a test and we dont want qfKey generation / validation
597 // easier to suppress it, than change core code
598 $config = CRM_Core_Config
::singleton();
599 $config->keyDisable
= TRUE;
601 $membershipRenewal = new CRM_Core_Form();
602 $membershipRenewal->controller
= new CRM_Core_Controller();
603 list($MembershipRenew) = CRM_Member_BAO_Membership
::renewMembership(
605 $this->_membershipTypeID
,
619 $this->assertDBNotNull('CRM_Member_BAO_MembershipLog',
620 $MembershipRenew->id
,
623 'Database checked on membershiplog record.'
626 $this->membershipDelete($membershipId);
627 $this->contactDelete($contactId);