Merge remote-tracking branch 'upstream/4.6' into 4.6-master-2015-07-06-14-41-49
[civicrm-core.git] / tests / phpunit / api / v3 / ContributionSoftTest.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
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. |
13 | |
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. |
18 | |
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 +--------------------------------------------------------------------+
26 */
27
28 require_once 'CiviTest/CiviUnitTestCase.php';
29
30 /**
31 * Test APIv3 civicrm_contribute_* functions
32 *
33 * @package CiviCRM_APIv3
34 * @subpackage API_ContributionSoft
35 */
36 class api_v3_ContributionSoftTest extends CiviUnitTestCase {
37
38 /**
39 * Assume empty database with just civicrm_data.
40 */
41 protected $_individualId; //the hard credit contact
42 protected $_softIndividual1Id; //the first soft credit contact
43 protected $_softIndividual2Id; //the second soft credit contact
44 protected $_contributionId;
45 protected $_financialTypeId = 1;
46 protected $_apiversion = 3;
47 protected $_entity = 'Contribution';
48 public $debug = 0;
49 protected $_params;
50
51
52 public function setUp() {
53 parent::setUp();
54 $this->useTransaction(TRUE);
55
56 $this->_individualId = $this->individualCreate();
57 $this->_softIndividual1Id = $this->individualCreate();
58 $this->_softIndividual2Id = $this->individualCreate();
59 $this->_contributionId = $this->contributionCreate($this->_individualId);
60
61 $paymentProcessor = $this->processorCreate();
62 $this->_params = array(
63 'contact_id' => $this->_individualId,
64 'receive_date' => '20120511',
65 'total_amount' => 100.00,
66 'financial_type_id' => $this->_financialTypeId,
67 'non_deductible_amount' => 10.00,
68 'fee_amount' => 5.00,
69 'net_amount' => 95.00,
70 'source' => 'SSF',
71 'contribution_status_id' => 1,
72 );
73 $this->_processorParams = array(
74 'domain_id' => 1,
75 'name' => 'Dummy',
76 'payment_processor_type_id' => 10,
77 'financial_account_id' => 12,
78 'is_active' => 1,
79 'user_name' => '',
80 'url_site' => 'http://dummy.com',
81 'url_recur' => 'http://dummy.com',
82 'billing_mode' => 1,
83 );
84 }
85
86 /**
87 * Test get methods.
88 * @todo - this might be better broken down into more smaller tests
89 */
90 public function testGetContributionSoft() {
91 //We don't test for PCP fields because there's no PCP API, so we can't create campaigns.
92 $p = array(
93 'contribution_id' => $this->_contributionId,
94 'contact_id' => $this->_softIndividual1Id,
95 'amount' => 10.00,
96 'currency' => 'USD',
97 'soft_credit_type_id' => 4,
98 );
99
100 $this->_softcontribution = $this->callAPISuccess('contribution_soft', 'create', $p);
101 $params = array(
102 'id' => $this->_softcontribution['id'],
103 );
104 $softcontribution = $this->callAPIAndDocument('contribution_soft', 'get', $params, __FUNCTION__, __FILE__);
105 $this->assertEquals(1, $softcontribution['count']);
106 $this->assertEquals($softcontribution['values'][$this->_softcontribution['id']]['contribution_id'], $this->_contributionId);
107 $this->assertEquals($softcontribution['values'][$this->_softcontribution['id']]['contact_id'], $this->_softIndividual1Id);
108 $this->assertEquals($softcontribution['values'][$this->_softcontribution['id']]['amount'], '10.00');
109 $this->assertEquals($softcontribution['values'][$this->_softcontribution['id']]['currency'], 'USD');
110 $this->assertEquals($softcontribution['values'][$this->_softcontribution['id']]['soft_credit_type_id'], 4);
111
112 //create a second soft contribution on the same hard contribution - we are testing that 'id' gets the right soft contribution id (not the contribution id)
113 $p['contact_id'] = $this->_softIndividual2Id;
114 $this->_softcontribution2 = $this->callAPISuccess('contribution_soft', 'create', $p);
115
116 // now we have 2 - test getcount
117 $softcontribution = $this->callAPISuccess('contribution_soft', 'getcount', array());
118 $this->assertEquals(2, $softcontribution);
119
120 //check first contribution
121 $result = $this->callAPISuccess('contribution_soft', 'get', array(
122 'id' => $this->_softcontribution['id'],
123 ));
124 $this->assertEquals(1, $result['count']);
125 $this->assertEquals($this->_softcontribution['id'], $result['id']);
126 $this->assertEquals($this->_softcontribution['id'], $result['id'], print_r($softcontribution, TRUE));
127
128 //test id only format - second soft credit
129 $resultID2 = $this->callAPISuccess('contribution_soft', 'get', array(
130 'id' => $this->_softcontribution2['id'],
131 'format.only_id' => 1,
132 ));
133 $this->assertEquals($this->_softcontribution2['id'], $resultID2);
134
135 //test get by contact id works
136 $result = $this->callAPISuccess('contribution_soft', 'get', array(
137 'contact_id' => $this->_softIndividual2Id,
138 )
139 );
140 $this->assertEquals(1, $result['count']);
141
142 $this->callAPISuccess('contribution_soft', 'Delete', array(
143 'id' => $this->_softcontribution['id'],
144 ));
145 // check one soft credit remains
146 $expectedCount = 1;
147 $this->callAPISuccess('contribution_soft', 'getcount', array(), $expectedCount);
148
149 //check id is same as 2
150 $this->assertEquals($this->_softcontribution2['id'], $this->callAPISuccess('contribution_soft', 'getvalue', array('return' => 'id')));
151
152 $this->callAPISuccess('ContributionSoft', 'Delete', array(
153 'id' => $this->_softcontribution2['id'],
154 ));
155 }
156
157
158 /**
159 * civicrm_contribution_soft.
160 */
161 public function testCreateEmptyParamsContributionSoft() {
162 $softcontribution = $this->callAPIFailure('contribution_soft', 'create', array(),
163 'Mandatory key(s) missing from params array: contribution_id, amount, contact_id'
164 );
165 }
166
167 public function testCreateParamsWithoutRequiredKeysContributionSoft() {
168 $softcontribution = $this->callAPIFailure('contribution_soft', 'create', array(),
169 'Mandatory key(s) missing from params array: contribution_id, amount, contact_id'
170 );
171 }
172
173 public function testCreateContributionSoftInvalidContact() {
174 $params = array(
175 'contact_id' => 999,
176 'contribution_id' => $this->_contributionId,
177 'amount' => 10.00,
178 'currency' => 'USD',
179 );
180
181 $softcontribution = $this->callAPIFailure('contribution_soft', 'create', $params,
182 'contact_id is not valid : 999'
183 );
184 }
185
186 public function testCreateContributionSoftInvalidContributionId() {
187 $params = array(
188 'contribution_id' => 999999,
189 'contact_id' => $this->_softIndividual1Id,
190 'amount' => 10.00,
191 'currency' => 'USD',
192 );
193
194 $softcontribution = $this->callAPIFailure('contribution_soft', 'create', $params,
195 'contribution_id is not valid : 999999'
196 );
197 }
198
199 /**
200 * Function tests that additional financial records are created when fee amount is recorded.
201 */
202 public function testCreateContributionSoft() {
203 $params = array(
204 'contribution_id' => $this->_contributionId,
205 'contact_id' => $this->_softIndividual1Id,
206 'amount' => 10.00,
207 'currency' => 'USD',
208 'soft_credit_type_id' => 5,
209 );
210
211 $softcontribution = $this->callAPIAndDocument('contribution_soft', 'create', $params, __FUNCTION__, __FILE__);
212 $this->assertEquals($softcontribution['values'][$softcontribution['id']]['contribution_id'], $this->_contributionId);
213 $this->assertEquals($softcontribution['values'][$softcontribution['id']]['contact_id'], $this->_softIndividual1Id);
214 $this->assertEquals($softcontribution['values'][$softcontribution['id']]['amount'], '10.00');
215 $this->assertEquals($softcontribution['values'][$softcontribution['id']]['currency'], 'USD');
216 $this->assertEquals($softcontribution['values'][$softcontribution['id']]['soft_credit_type_id'], 5);
217 }
218
219 /**
220 * To Update Soft Contribution.
221 *
222 */
223 public function testCreateUpdateContributionSoft() {
224 //create a soft credit
225 $params = array(
226 'contribution_id' => $this->_contributionId,
227 'contact_id' => $this->_softIndividual1Id,
228 'amount' => 10.00,
229 'currency' => 'USD',
230 'soft_credit_type_id' => 6,
231 );
232
233 $softcontribution = $this->callAPISuccess('contribution_soft', 'create', $params);
234 $softcontributionID = $softcontribution['id'];
235
236 $old_params = array(
237 'contribution_soft_id' => $softcontributionID,
238 );
239 $original = $this->callAPISuccess('contribution_soft', 'get', $old_params);
240 //Make sure it came back
241 $this->assertEquals($original['id'], $softcontributionID);
242 //set up list of old params, verify
243 $old_contribution_id = $original['values'][$softcontributionID]['contribution_id'];
244 $old_contact_id = $original['values'][$softcontributionID]['contact_id'];
245 $old_amount = $original['values'][$softcontributionID]['amount'];
246 $old_currency = $original['values'][$softcontributionID]['currency'];
247 $old_soft_credit_type_id = $original['values'][$softcontributionID]['soft_credit_type_id'];
248
249 //check against original values
250 $this->assertEquals($old_contribution_id, $this->_contributionId);
251 $this->assertEquals($old_contact_id, $this->_softIndividual1Id);
252 $this->assertEquals($old_amount, 10.00);
253 $this->assertEquals($old_currency, 'USD');
254 $this->assertEquals($old_soft_credit_type_id, 6);
255 $params = array(
256 'id' => $softcontributionID,
257 'contribution_id' => $this->_contributionId,
258 'contact_id' => $this->_softIndividual1Id,
259 'amount' => 7.00,
260 'currency' => 'CAD',
261 'soft_credit_type_id' => 7,
262 );
263
264 $softcontribution = $this->callAPISuccess('contribution_soft', 'create', $params);
265
266 $new_params = array(
267 'id' => $softcontribution['id'],
268 );
269 $softcontribution = $this->callAPISuccess('contribution_soft', 'get', $new_params);
270 //check against original values
271 $this->assertEquals($softcontribution['values'][$softcontributionID]['contribution_id'], $this->_contributionId);
272 $this->assertEquals($softcontribution['values'][$softcontributionID]['contact_id'], $this->_softIndividual1Id);
273 $this->assertEquals($softcontribution['values'][$softcontributionID]['amount'], 7.00);
274 $this->assertEquals($softcontribution['values'][$softcontributionID]['currency'], 'CAD');
275 $this->assertEquals($softcontribution['values'][$softcontributionID]['soft_credit_type_id'], 7);
276
277 $params = array(
278 'id' => $softcontributionID,
279 );
280 $result = $this->callAPISuccess('contribution_soft', 'delete', $params);
281 }
282
283 /**
284 * civicrm_contribution_soft_delete methods.
285 *
286 */
287 public function testDeleteEmptyParamsContributionSoft() {
288 $params = array();
289 $softcontribution = $this->callAPIFailure('contribution_soft', 'delete', $params);
290 }
291
292 public function testDeleteWrongParamContributionSoft() {
293 $params = array(
294 'contribution_source' => 'SSF',
295 );
296 $softcontribution = $this->callAPIFailure('contribution_soft', 'delete', $params);
297 }
298
299 public function testDeleteContributionSoft() {
300 //create a soft credit
301 $params = array(
302 'contribution_id' => $this->_contributionId,
303 'contact_id' => $this->_softIndividual1Id,
304 'amount' => 10.00,
305 'currency' => 'USD',
306 );
307
308 $softcontribution = $this->callAPISuccess('contribution_soft', 'create', $params);
309 $softcontributionID = $softcontribution['id'];
310 $params = array(
311 'id' => $softcontributionID,
312 );
313 $result = $this->callAPIAndDocument('contribution_soft', 'delete', $params, __FUNCTION__, __FILE__);
314 }
315
316 ///////////////// civicrm_contribution_search methods
317
318 /**
319 * Test civicrm_contribution_search with empty params.
320 * All available contributions expected.
321 */
322 public function testSearchEmptyParams() {
323 $p = array(
324 'contribution_id' => $this->_contributionId,
325 'contact_id' => $this->_softIndividual1Id,
326 'amount' => 10.00,
327 'currency' => 'USD',
328 );
329 $softcontribution = $this->callAPISuccess('contribution_soft', 'create', $p);
330
331 $result = $this->callAPISuccess('contribution_soft', 'get', array());
332 // We're taking the first element.
333 $res = $result['values'][$softcontribution['id']];
334
335 $this->assertEquals($p['contribution_id'], $res['contribution_id']);
336 $this->assertEquals($p['contact_id'], $res['contact_id']);
337 $this->assertEquals($p['amount'], $res['amount']);
338 $this->assertEquals($p['currency'], $res['currency']);
339 }
340
341 /**
342 * Test civicrm_contribution_soft_search. Success expected.
343 */
344 public function testSearch() {
345 $p1 = array(
346 'contribution_id' => $this->_contributionId,
347 'contact_id' => $this->_softIndividual1Id,
348 'amount' => 10.00,
349 'currency' => 'USD',
350 );
351 $softcontribution1 = $this->callAPISuccess('contribution_soft', 'create', $p1);
352
353 $p2 = array(
354 'contribution_id' => $this->_contributionId,
355 'contact_id' => $this->_softIndividual2Id,
356 'amount' => 25.00,
357 'currency' => 'CAD',
358 );
359 $softcontribution2 = $this->callAPISuccess('contribution_soft', 'create', $p2);
360
361 $params = array(
362 'id' => $softcontribution2['id'],
363 );
364 $result = $this->callAPISuccess('contribution_soft', 'get', $params);
365 $res = $result['values'][$softcontribution2['id']];
366
367 $this->assertEquals($p2['contribution_id'], $res['contribution_id']);
368 $this->assertEquals($p2['contact_id'], $res['contact_id']);
369 $this->assertEquals($p2['amount'], $res['amount']);
370 $this->assertEquals($p2['currency'], $res['currency']);
371 }
372
373 }