f2181fa11ecda45715b3e52ab65c54d2c8a72930
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
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 +--------------------------------------------------------------------+
28 require_once 'CiviTest/CiviUnitTestCase.php';
31 * Test class for Pledge API - civicrm_pledge_*
33 * @package CiviCRM_APIv3
35 class api_v3_PledgeTest
extends CiviUnitTestCase
{
38 * Assume empty database with just civicrm_data
40 protected $_individualId;
42 protected $_apiversion;
45 protected $scheduled_date;
46 public $DBResetRequired = TRUE;
48 public function setUp() {
49 $this->_apiversion
= 3;
51 $this->quickCleanup(array('civicrm_pledge', 'civicrm_pledge_payment'));
52 //need to set scheduled payment in advance we are running test @ midnight & it becomes unexpectedly overdue
53 //due to timezone issues
54 $this->scheduled_date
= date('Ymd', mktime(0, 0, 0, date("m"), date("d") +
2, date("y")));
55 $this->_entity
= 'Pledge';
56 $this->_individualId
= $this->individualCreate();
57 $this->_params
= array(
58 'contact_id' => $this->_individualId
,
59 'pledge_create_date' => date('Ymd'),
60 'start_date' => date('Ymd'),
61 'scheduled_date' => $this->scheduled_date
,
63 'pledge_status_id' => '2',
64 'pledge_financial_type_id' => '1',
65 'pledge_original_installment_amount' => 20,
66 'frequency_interval' => 5,
67 'frequency_unit' => 'year',
68 'frequency_day' => 15,
74 public function tearDown() {
75 $this->contactDelete($this->_individualId
);
78 ///////////////// civicrm_pledge_get methods
81 * Check with complete array + custom field
82 * Note that the test is written on purpose without any
83 * variables specific to participant so it can be replicated into other entities
84 * and / or moved to the automated test suite
86 public function testCreateWithCustom() {
87 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__
, __FILE__
);
89 $params = $this->_params
;
90 $params['custom_' . $ids['custom_field_id']] = "custom string";
92 $result = $this->callAPISuccess($this->_entity
, 'create', $params);
93 $this->assertAPISuccess($result, " testCreateWithCustom ");
94 $this->assertAPISuccess($result, ' in line ' . __LINE__
);
95 $getparams = array('id' => $result['id'], 'return.custom_' . $ids['custom_field_id'] => 1);
96 $check = $this->callAPISuccess($this->_entity
, 'get', $getparams);
97 $this->callAPISuccess('pledge', 'delete', array('id' => $check['id']));
98 $this->assertEquals("custom string", $check['values'][$check['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__
);
100 $this->customFieldDelete($ids['custom_field_id']);
101 $this->customGroupDelete($ids['custom_group_id']);
107 public function testgetfieldspledge() {
108 $result = $this->callAPISuccess('pledge', 'getfields', array('action' => 'get'));
109 $this->assertEquals(1, $result['values']['next_pay_date']['api.return']);
112 public function testGetPledge() {
114 $this->_pledge
= $this->callAPISuccess('pledge', 'create', $this->_params
);
116 'pledge_id' => $this->_pledge
['id'],
118 $result = $this->callAPIAndDocument('pledge', 'get', $params, __FUNCTION__
, __FILE__
);
119 $pledge = $result['values'][$this->_pledge
['id']];
120 $this->assertEquals($this->_individualId
, $pledge['contact_id'], 'in line' . __LINE__
);
121 $this->assertEquals($this->_pledge
['id'], $pledge['pledge_id'], 'in line' . __LINE__
);
122 $this->assertEquals(date('Y-m-d') . ' 00:00:00', $pledge['pledge_create_date'], 'in line' . __LINE__
);
123 $this->assertEquals(100.00, $pledge['pledge_amount'], 'in line' . __LINE__
);
124 $this->assertEquals('Pending', $pledge['pledge_status'], 'in line' . __LINE__
);
125 $this->assertEquals(5, $pledge['pledge_frequency_interval'], 'in line' . __LINE__
);
126 $this->assertEquals('year', $pledge['pledge_frequency_unit'], 'in line' . __LINE__
);
127 $this->assertEquals(date('Y-m-d', strtotime($this->scheduled_date
)) . ' 00:00:00', $pledge['pledge_next_pay_date'], 'in line' . __LINE__
);
128 $this->assertEquals($pledge['pledge_next_pay_amount'], 20.00, 'in line' . __LINE__
);
131 'pledge_id' => $this->_pledge
['id'],);
132 $pledge = $this->callAPISuccess('pledge', 'delete', $params2);
135 * Test 'return.pledge_financial_type' => 1 works
137 public function testGetPledgewithReturn() {
139 $this->_pledge
= $this->callAPISuccess('pledge', 'create', $this->_params
);
141 'pledge_id' => $this->_pledge
['id'],
142 'return.pledge_financial_type' => 1,
144 $result = $this->callAPISuccess('pledge', 'get', $params);
145 $pledge = $result['values'][$this->_pledge
['id']];
146 $this->callAPISuccess('pledge', 'delete', $pledge);
147 $this->assertEquals('Donation', $pledge['pledge_financial_type']);
150 * Test 'return.pledge_contribution_type' => 1 works
151 * This is for legacy compatibility
153 public function testGetPledgewithReturnLegacy() {
155 $this->_pledge
= $this->callAPISuccess('pledge', 'create', $this->_params
);
157 'pledge_id' => $this->_pledge
['id'],
158 'return.pledge_financial_type' => 1,
160 $result = $this->callAPISuccess('pledge', 'get', $params);
161 $pledge = $result['values'][$this->_pledge
['id']];
162 $this->callAPISuccess('pledge', 'delete', $pledge);
163 $this->assertEquals('Donation', $pledge['pledge_financial_type']);
166 public function testPledgeGetReturnFilters() {
167 $oldPledge = $this->callAPISuccess('pledge', 'create', $this->_params
);
169 $overdueParams = array(
170 'scheduled_date' => 'first saturday of march last year',
171 'start_date' => 'first saturday of march last year',
173 $oldPledge = $this->callAPISuccess('pledge', 'create', array_merge($this->_params
, $overdueParams));
175 $pledgeGetParams = array();
176 $allPledges = $this->callAPISuccess('pledge', 'getcount', $pledgeGetParams);
178 $this->assertEquals(2, $allPledges, 'Check we have 2 pledges to place with in line ' . __LINE__
);
179 $pledgeGetParams['pledge_start_date_high'] = date('YmdHis', strtotime('2 days ago'));
180 $earlyPledge = $this->callAPIAndDocument('pledge', 'get', $pledgeGetParams, __FUNCTION__
, __FILE__
, "demonstrates high date filter", "GetFilterHighDate");
181 $this->assertEquals(1, $earlyPledge['count'], ' check only one returned with start date filter in line ' . __LINE__
);
182 $this->assertEquals($oldPledge['id'], $earlyPledge['id'], ' check correct pledge returned ' . __LINE__
);
185 * create 2 pledges - see if we can get by status id
187 public function testGetOverduePledge() {
188 $overdueParams = array(
189 'scheduled_date' => 'first saturday of march last year',
190 'start_date' => 'first saturday of march last year',
192 $this->_pledge
= $this->callAPISuccess('pledge', 'create', array_merge($this->_params
, $overdueParams));
193 $params = array( 'pledge_status_id' => '6',
195 $result = $this->callAPISuccess('pledge', 'get', $params);
196 $emptyResult = $this->callAPISuccess('pledge', 'get', array( 'pledge_status_id' => '1',
198 $pledge = $result['values'][$this->_pledge
['id']];
199 $this->callAPISuccess('pledge', 'delete', $pledge);
200 $this->assertEquals(1, $result['count']);
201 $this->assertEquals(0, $emptyResult['count']);
206 * create 2 pledges - see if we can get by status id
208 public function testSortParamPledge() {
209 $pledge1 = $this->callAPISuccess('pledge', 'create', $this->_params
);
210 $overdueParams = array(
211 'scheduled_date' => 'first saturday of march last year',
212 'start_date' => 'first saturday of march last year',
213 'create_date' => 'first saturday of march last year',
215 $pledge2 = $this->callAPISuccess('pledge', 'create', array_merge($this->_params
, $overdueParams));
217 'pledge_is_test' => 0,
220 $result = $this->callAPISuccess('pledge', 'get', $params);
222 $resultSortedAsc = $this->callAPISuccess('pledge', 'get', array(
224 'sort' => 'start_date ASC',
226 $resultSortedDesc = $this->callAPISuccess('pledge', 'get', array(
228 'sort' => 'start_date DESC',
231 $this->assertEquals($pledge1['id'], $result['id'], 'pledge get gets first created pledge in line ' . __LINE__
);
232 $this->assertEquals($pledge2['id'], $resultSortedAsc['id'], 'Ascending pledge sort works');
233 $this->assertEquals($pledge1['id'], $resultSortedDesc['id'], 'Decending pledge sort works');
234 $this->callAPISuccess('pledge', 'delete', array('id' => $pledge1['id']));
235 $this->callAPISuccess('pledge', 'delete', array('id' => $pledge2['id']));
238 public function testCreatePledge() {
240 $result = $this->callAPIAndDocument('pledge', 'create', $this->_params
, __FUNCTION__
, __FILE__
);
241 $this->assertEquals($result['values'][0]['amount'], 100.00, 'In line ' . __LINE__
);
242 $this->assertEquals($result['values'][0]['installments'], 5, 'In line ' . __LINE__
);
243 $this->assertEquals($result['values'][0]['frequency_unit'], 'year', 'In line ' . __LINE__
);
244 $this->assertEquals($result['values'][0]['frequency_interval'], 5, 'In line ' . __LINE__
);
245 $this->assertEquals($result['values'][0]['frequency_day'], 15, 'In line ' . __LINE__
);
246 $this->assertEquals($result['values'][0]['original_installment_amount'], 20, 'In line ' . __LINE__
);
247 $this->assertEquals($result['values'][0]['status_id'], 2, 'In line ' . __LINE__
);
248 $this->assertEquals($result['values'][0]['create_date'], date('Ymd') . '000000', 'In line ' . __LINE__
);
249 $this->assertEquals($result['values'][0]['start_date'], date('Ymd') . '000000', 'In line ' . __LINE__
);
250 $this->assertAPISuccess($result, 'In line ' . __LINE__
);
251 $payments = $this->callAPISuccess('PledgePayment', 'Get', array('pledge_id' => $result['id'], 'sequential' => 1));
252 $this->assertAPISuccess($payments, 'In line ' . __LINE__
);
253 $this->assertEquals($payments['count'], 5, 'In line ' . __LINE__
);
254 require_once 'CRM/Utils/Date.php';
255 $shouldBeDate = CRM_Utils_Date
::format(CRM_Utils_Date
::intervalAdd('year', 5 * 4, $this->scheduled_date
), "-");
256 $this->assertEquals(substr($shouldBeDate, 0, 10), substr($payments['values'][4]['scheduled_date'], 0, 10), 'In line ' . __LINE__
);
258 $pledgeID = array('id' => $result['id']);
259 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);
263 * Test that pledge with weekly schedule calculates dates correctly
265 public function testCreatePledgeWeeklySchedule() {
267 'scheduled_date' => '20110510',
268 'frequency_unit' => 'week',
269 'frequency_day' => 3,
270 'frequency_interval' => 2,
272 $params = array_merge($this->_params
, $params);
273 $pledge = $this->callAPISuccess('Pledge', 'Create', $params);
274 //ensure that correct number of payments created & last payment has the right date
275 $payments = $this->callAPISuccess('PledgePayment', 'Get', array(
276 'pledge_id' => $pledge['id'],
278 $this->assertEquals($payments['count'], 5, 'In line ' . __LINE__
);
279 $this->assertEquals('2011-07-06 00:00:00', $payments['values'][4]['scheduled_date'], 'In line ' . __LINE__
);
281 $this->callAPISuccess('pledge', 'delete', array('pledge_id' => $pledge['id']));
284 * Test that pledge with weekly schedule calculates dates correctly
286 public function testCreatePledgeMontlySchedule() {
288 'scheduled_date' => '20110510',
289 'frequency_unit' => 'Month',
290 'frequency_day' => 3,
291 'frequency_interval' => 2,
293 $params = array_merge($this->_params
, $params);
294 $apiResult = $this->callAPISuccess('pledge', 'create', $params);
299 * Test creation of pledge with only one payment.
301 * Pledge status id left empty as it is not a required field
302 * http://issues.civicrm.org/jira/browse/CRM-8551
305 public function testCreatePledgeSinglePayment() {
307 'scheduled_date' => '20110510',
308 'frequency_unit' => 'week',
309 'frequency_day' => 3,
310 'frequency_interval' => 2,
314 $params = array_merge($this->_params
, $params);
315 unset($params['pledge_status_id']);
316 $pledge = $this->callAPISuccess('Pledge', 'Create', $params);
317 //ensure that correct number of payments created & last payment has the right date
318 $payments = $this->callAPISuccess('PledgePayment', 'Get', array(
319 'pledge_id' => $pledge['id'],
322 $this->assertEquals(1, $payments['count'], 'In line ' . __LINE__
);
323 $this->assertEquals(2, $payments['values'][0]['status_id'], 'In line ' . __LINE__
);
324 $pledgeID = array('id' => $pledge['id']);
325 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);
329 * test that using original_installment_amount rather than pledge_original_installment_amount works
330 * Pledge field behaviour is a bit random & so pledge has come to try to handle both unique & non -unique fields
332 public function testCreatePledgeWithNonUnique() {
333 $params = $this->_params
;
334 $params['original_installment_amount'] = $params['pledge_original_installment_amount'];
336 unset($params['pledge_original_installment_amount']);
337 $result = $this->callAPISuccess('pledge', 'create', $params);
338 $pledgeDetails = $this->callAPISuccess('Pledge', 'Get', array('id' => $result['id'], 'sequential' => 1));
339 $pledge = $pledgeDetails['values'][0];
340 $this->assertEquals(100.00, $pledge['pledge_amount'], 'In line ' . __LINE__
);
341 $this->assertEquals('year', $pledge['pledge_frequency_unit'], 'In line ' . __LINE__
);
342 $this->assertEquals(5, $pledge['pledge_frequency_interval'], 'In line ' . __LINE__
);
343 $this->assertEquals(20, $pledge['pledge_next_pay_amount'], 'In line ' . __LINE__
);
345 $pledgeID = array('id' => $result['id']);
346 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);
349 public function testCreateCancelPledge() {
351 $result = $this->callAPISuccess('pledge', 'create', $this->_params
);
352 $this->assertEquals(2, $result['values'][0]['status_id'], "in line " . __LINE__
);
353 $cancelparams = array('sequential' => 1, 'id' => $result['id'], 'pledge_status_id' => 3);
354 $result = $this->callAPISuccess('pledge', 'create', $cancelparams);
355 $this->assertEquals(3, $result['values'][0]['status_id'], "in line " . __LINE__
);
356 $pledgeID = array('id' => $result['id']);
357 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);
361 * Test that status is set to pending
363 public function testCreatePledgeNoStatus() {
365 $params = $this->_params
;
366 unset($params['status_id']);
367 unset($params['pledge_status_id']);
368 $result = $this->callAPISuccess('pledge', 'create', $params);
369 $this->assertAPISuccess($result, "in line " . __LINE__
);
370 $this->assertEquals(2, $result['values'][0]['status_id'], "in line " . __LINE__
);
371 $pledgeID = array('pledge_id' => $result['id']);
372 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);
378 public function testCreateUpdatePledge() {
379 // we test 'sequential' param here too
380 $pledgeID = $this->pledgeCreate($this->_individualId
);
384 $original = $this->callAPISuccess('pledge', 'get', $old_params);
385 //Make sure it came back
386 $this->assertEquals($original['values'][0]['pledge_id'], $pledgeID, 'In line ' . __LINE__
);
387 //set up list of old params, verify
388 $old_contact_id = $original['values'][0]['contact_id'];
389 $old_frequency_unit = $original['values'][0]['pledge_frequency_unit'];
390 $old_frequency_interval = $original['values'][0]['pledge_frequency_interval'];
391 $old_status_id = $original['values'][0]['pledge_status'];
393 //check against values in CiviUnitTestCase::createPledge()
394 $this->assertEquals($old_contact_id, $this->_individualId
, 'In line ' . __LINE__
);
395 $this->assertEquals($old_frequency_unit, 'year', 'In line ' . __LINE__
);
396 $this->assertEquals($old_frequency_interval, 5, 'In line ' . __LINE__
);
397 $this->assertEquals($old_status_id, 'Pending', 'In line ' . __LINE__
);
400 'contact_id' => $this->_individualId
,
401 'pledge_status_id' => 3,
403 'financial_type_id' => 1,
404 'start_date' => date('Ymd'),
405 'installments' => 10,);
407 $pledge = $this->callAPISuccess('pledge', 'create', $params);
409 'id' => $pledge['id'],
411 $pledge = $this->callAPISuccess('pledge', 'get', $new_params);
412 $this->assertEquals($pledge['values'][$pledgeID]['contact_id'], $this->_individualId
, 'In line ' . __LINE__
);
413 $this->assertEquals($pledge['values'][$pledgeID]['pledge_status'], 'Cancelled', 'In line ' . __LINE__
);
414 $pledge = $this->callAPISuccess('pledge', 'delete', $new_params);
418 * Here we ensure we are maintaining our 'contract' & supporting previously working syntax
419 * ie contribution_type_id
421 public function testCreateUpdatePledgeLegacy() {
423 // we test 'sequential' param here too
424 $pledgeID = $this->pledgeCreate($this->_individualId
);
428 $original = $this->callAPISuccess('pledge', 'get', $old_params);
429 //Make sure it came back
430 $this->assertEquals($original['values'][0]['pledge_id'], $pledgeID, 'In line ' . __LINE__
);
431 //set up list of old params, verify
432 $old_contact_id = $original['values'][0]['contact_id'];
433 $old_frequency_unit = $original['values'][0]['pledge_frequency_unit'];
434 $old_frequency_interval = $original['values'][0]['pledge_frequency_interval'];
435 $old_status_id = $original['values'][0]['pledge_status'];
437 //check against values in CiviUnitTestCase::createPledge()
438 $this->assertEquals($old_contact_id, $this->_individualId
, 'In line ' . __LINE__
);
439 $this->assertEquals($old_frequency_unit, 'year', 'In line ' . __LINE__
);
440 $this->assertEquals($old_frequency_interval, 5, 'In line ' . __LINE__
);
441 $this->assertEquals($old_status_id, 'Pending', 'In line ' . __LINE__
);
444 'contact_id' => $this->_individualId
,
445 'pledge_status_id' => 3,
447 'contribution_type_id' => 1,
448 'start_date' => date('Ymd'),
449 'installments' => 10,
452 $pledge = $this->callAPISuccess('pledge', 'create', $params);
454 'id' => $pledge['id'],
456 $pledge = $this->callAPISuccess('pledge', 'get', $new_params);
457 $this->assertEquals($pledge['values'][$pledgeID]['contact_id'], $this->_individualId
, 'In line ' . __LINE__
);
458 $this->assertEquals($pledge['values'][$pledgeID]['pledge_status'], 'Cancelled', 'In line ' . __LINE__
);
459 $pledge = $this->callAPISuccess('pledge', 'delete', $new_params);
462 ///////////////// civicrm_pledge_delete methods
463 public function testDeleteEmptyParamsPledge() {
464 $pledge = $this->callAPIFailure('pledge', 'delete', array(), 'Mandatory key(s) missing from params array: id');
468 public function testDeleteWrongParamPledge() {
470 'pledge_source' => 'SSF',
472 $pledge = $this->callAPIFailure('pledge', 'delete', $params, 'Mandatory key(s) missing from params array: id');
476 * Legacy support for pledge_id
478 public function testDeletePledge() {
480 $pledgeID = $this->pledgeCreate($this->_individualId
);
482 'pledge_id' => $pledgeID,
484 $result = $this->callAPIAndDocument('pledge', 'delete', $params, __FUNCTION__
, __FILE__
);
488 * Std is to accept id
490 public function testDeletePledgeUseID() {
492 $pledgeID = $this->pledgeCreate($this->_individualId
);
496 $result = $this->callAPIAndDocument('pledge', 'delete', $params, __FUNCTION__
, __FILE__
);
500 * Test to make sure empty get returns nothing
501 * Note that the function gives incorrect results if no pledges exist as it does a
502 * contact search instead - test only checks that the get finds the one existing
504 public function testGetEmpty() {
505 $result = $this->callAPISuccess('pledge', 'create', $this->_params
);
506 $result = $this->callAPISuccess('pledge', 'get', array());
507 $this->assertAPISuccess($result, "This test is failing because it's acting like a contact get when no params set. Not sure the fix");
508 $this->assertEquals(1, $result['count'], 'in line ' . __LINE__
);
509 $pledgeID = array('id' => $result['id']);
510 $pledge = $this->callAPISuccess('pledge', 'delete', $pledgeID);