Merge remote-tracking branch 'upstream/4.5' into 4.5-master-2014-12-22-22-01-44
[civicrm-core.git] / tests / phpunit / api / v3 / ProfileTest.php
CommitLineData
6a488035 1<?php
b6708aeb 2
3/*
4 +--------------------------------------------------------------------+
06a1bc01 5| CiviCRM version 4.5 |
b6708aeb 6+--------------------------------------------------------------------+
06a1bc01 7| Copyright CiviCRM LLC (c) 2004-2014 |
b6708aeb 8+--------------------------------------------------------------------+
9| This file is a part of CiviCRM. |
10| |
11| CiviCRM is free software; you can copy, modify, and distribute it |
12| under the terms of the GNU Affero General Public License |
13| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
14| |
15| CiviCRM is distributed in the hope that it will be useful, but |
16| WITHOUT ANY WARRANTY; without even the implied warranty of |
17| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
18| See the GNU Affero General Public License for more details. |
19| |
20| You should have received a copy of the GNU Affero General Public |
21| License and the CiviCRM Licensing Exception along |
22| with this program; if not, contact CiviCRM LLC |
23| at info[AT]civicrm[DOT]org. If you have questions about the |
24| GNU Affero General Public License or the licensing of CiviCRM, |
25| see the CiviCRM license FAQ at http://civicrm.org/licensing |
26+--------------------------------------------------------------------+
27*/
6a488035
TO
28
29/**
30 * Include class definitions
31 */
32require_once 'tests/phpunit/CiviTest/CiviUnitTestCase.php';
33
34/**
35 * Test APIv3 civicrm_profile_* functions
36 *
37 * @package CiviCRM
38 */
39class api_v3_ProfileTest extends CiviUnitTestCase {
40 protected $_apiversion;
9da2e77c 41 protected $_profileID = 0;
174dbdd5
E
42 protected $_membershipTypeID;
43 protected $_contactID;
4cbe18b8
EM
44
45 /**
46 * @return array
47 */
6a488035
TO
48 function get_info() {
49 return array(
50 'name' => 'Profile Test',
51 'description' => 'Test all profile API methods.',
52 'group' => 'CiviCRM API Tests',
53 );
54 }
55
56 function setUp() {
57 $this->_apiversion = 3;
58 parent::setUp();
59 $config = CRM_Core_Config::singleton();
60 $config->countryLimit[1] = 1013;
61 $config->stateLimit[1] = 1013;
9da2e77c 62 $this->createLoggedInUser();
174dbdd5 63 $this->_membershipTypeID = $this->membershipTypeCreate();
6a488035
TO
64 }
65
66 function tearDown() {
7fbb4198 67
6a488035 68 $this->quickCleanup(array(
21170390 69 'civicrm_contact',
70 'civicrm_phone',
71 'civicrm_address',
174dbdd5
E
72 'civicrm_membership',
73 'civicrm_contribution',
21170390 74 ), TRUE);
174dbdd5 75 $this->callAPISuccess('membership_type', 'delete', array('id' => $this->_membershipTypeID));
f01ce56b 76 // ok can't be bothered wring an api to do this & truncating is crazy
9da2e77c 77 CRM_Core_DAO::executeQuery(" DELETE FROM civicrm_uf_group WHERE id IN ($this->_profileID, 26)");
6a488035
TO
78 }
79
7fbb4198 80 ////////////// test $this->callAPISuccess3_profile_get //////////////////
6a488035
TO
81
82 /**
100fef9d 83 * Check Without ProfileId
6a488035
TO
84 */
85 function testProfileGetWithoutProfileId() {
86 $params = array(
87 'contact_id' => 1,
6a488035 88 );
7fbb4198 89 $result = $this->callAPIFailure('profile', 'get', $params,
90 'Mandatory key(s) missing from params array: profile_id'
91 );
6a488035
TO
92 }
93
94 /**
100fef9d 95 * Check with no invalid profile Id
6a488035
TO
96 */
97 function testProfileGetInvalidProfileId() {
98 $params = array(
99 'contact_id' => 1,
100 'profile_id' => 1000,
6a488035 101 );
d0e1eff2 102 $result = $this->callAPIFailure('profile', 'get', $params);
6a488035
TO
103 }
104
105 /**
100fef9d 106 * Check with success
6a488035
TO
107 */
108 function testProfileGet() {
109 $pofileFieldValues = $this->_createIndividualContact();
110 $expected = current($pofileFieldValues);
111 $contactId = key($pofileFieldValues);
112 $params = array(
9da2e77c 113 'profile_id' => $this->_profileID,
6a488035 114 'contact_id' => $contactId,
6a488035 115 );
f01ce56b 116 $result = $this->callAPISuccess('profile', 'get', $params);
6a488035 117 foreach ($expected as $profileField => $value) {
9da2e77c 118 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values']));
6a488035 119 }
6a488035
TO
120 }
121
f01ce56b 122 function testProfileGetMultiple() {
123 $pofileFieldValues = $this->_createIndividualContact();
124 $expected = current($pofileFieldValues);
125 $contactId = key($pofileFieldValues);
126 $params = array(
9da2e77c 127 'profile_id' => array($this->_profileID, 1, 'Billing'),
f01ce56b 128 'contact_id' => $contactId,
129 );
130
131 $result = $this->callAPIAndDocument('profile', 'get', $params, __FUNCTION__, __FILE__);
132 foreach ($expected as $profileField => $value) {
9da2e77c 133 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values'][$this->_profileID]), " error message: " . "missing/mismatching value for {$profileField}");
f01ce56b 134 }
135 $this->assertEquals('abc1', $result['values'][1]['first_name'], " error message: " . "missing/mismatching value for {$profileField}");
136 $this->assertFalse(array_key_exists('email-Primary', $result['values'][1]), 'profile 1 doesn not include email');
137 $this->assertEquals($result['values']['Billing'], array(
138 'billing_first_name' => 'abc1',
e0efd2d0 139 'billing_middle_name' => 'J.',
f01ce56b 140 'billing_last_name' => 'xyz1',
b29f74b6 141 'billing_street_address-5' => '5 Saint Helier St',
142 'billing_city-5' => 'Gotham City',
e0efd2d0 143 'billing_state_province_id-5' => '1021',
45c30250 144 'billing_country_id-5' => '1228',
e0efd2d0 145 'billing_postal_code-5' => '90210',
146 'billing-email-5' => 'abc1.xyz1@yahoo.com',
147 'email-5' => 'abc1.xyz1@yahoo.com',
f01ce56b 148 ));
149 }
150
b29f74b6 151 function testProfileGetBillingUseIsBillingLocation() {
152 $individual = $this->_createIndividualContact();
153 $contactId = key($individual);
154 $this->callAPISuccess('address', 'create', array(
155 'is_billing' => 1,
156 'street_address' => 'is billing st',
157 'location_type_id' => 2,
158 'contact_id' => $contactId,
21170390 159 ));
b29f74b6 160
161 $expected = current($individual);
162
163 $params = array(
9da2e77c 164 'profile_id' => array($this->_profileID, 1, 'Billing'),
b29f74b6 165 'contact_id' => $contactId,
166 );
167
168 $result = $this->callAPISuccess('profile', 'get', $params);
169 $this->assertEquals('abc1', $result['values'][1]['first_name']);
170 $this->assertEquals(array(
171 'billing_first_name' => 'abc1',
172 'billing_middle_name' => 'J.',
173 'billing_last_name' => 'xyz1',
174 'billing_street_address-5' => 'is billing st',
175 'billing_city-5' => '',
176 'billing_state_province_id-5' => '',
177 'billing_country_id-5' => '',
178 'billing-email-5' => 'abc1.xyz1@yahoo.com',
179 'email-5' => 'abc1.xyz1@yahoo.com',
180 'billing_postal_code-5' => '',
181 ), $result['values']['Billing']);
182 }
183
f01ce56b 184 function testProfileGetMultipleHasBillingLocation() {
185 $individual = $this->_createIndividualContact();
186 $contactId = key($individual);
187 $this->callAPISuccess('address', 'create', array('contact_id' => $contactId , 'street_address' => '25 Big Street', 'city' => 'big city', 'location_type_id' => 5));
188 $this->callAPISuccess('email', 'create', array('contact_id' => $contactId , 'email' => 'big@once.com', 'location_type_id' => 2, 'is_billing' => 1));
189
190 $expected = current($individual);
191
192 $params = array(
9da2e77c 193 'profile_id' => array($this->_profileID, 1, 'Billing'),
f01ce56b 194 'contact_id' => $contactId,
195 );
196
197 $result = $this->callAPISuccess('profile', 'get', $params, __FUNCTION__, __FILE__);
198 $this->assertEquals('abc1', $result['values'][1]['first_name']);
199 $this->assertEquals($result['values']['Billing'], array(
200 'billing_first_name' => 'abc1',
e0efd2d0 201 'billing_middle_name' => 'J.',
f01ce56b 202 'billing_last_name' => 'xyz1',
203 'billing_street_address-5' => '25 Big Street',
204 'billing_city-5' => 'big city',
205 'billing_state_province_id-5' => '',
206 'billing_country_id-5' => '',
207 'billing-email-5' => 'big@once.com',
e0efd2d0 208 'email-5' => 'big@once.com',
209 'billing_postal_code-5' => '',
f01ce56b 210 ));
211 }
b29f74b6 212
5a9e1452 213 /**
100fef9d 214 * Get Billing empty contact - this will return generic defaults
5a9e1452 215 */
216 function testProfileGetBillingEmptyContact() {
217
218 $params = array(
219 'profile_id' => array('Billing'),
220 );
221
222 $result = $this->callAPISuccess('profile', 'get', $params);
223 $this->assertEquals(array(
224 'billing_first_name' => '',
225 'billing_middle_name' => '',
226 'billing_last_name' => '',
227 'billing_street_address-5' => '',
228 'billing_city-5' => '',
229 'billing_state_province_id-5' => '',
230 'billing_country_id-5' => '1228',
231 'billing_email-5' => '',
232 'email-5' => '',
233 'billing_postal_code-5' => '',
234 ), $result['values']['Billing']);
235 }
b29f74b6 236
7fbb4198 237 /**
100fef9d 238 * Check contact activity profile without activity id
7fbb4198 239 */
6a488035
TO
240 function testContactActivityGetWithoutActivityId() {
241 list($params, $expected) = $this->_createContactWithActivity();
242
243 unset($params['activity_id']);
7fbb4198 244 $result = $this->callAPIFailure('profile', 'get', $params,
245 'Mandatory key(s) missing from params array: activity_id');
6a488035
TO
246 }
247
7fbb4198 248 /**
100fef9d 249 * Check contact activity profile wrong activity id
7fbb4198 250 */
6a488035
TO
251 function testContactActivityGetWrongActivityId() {
252 list($params, $expected) = $this->_createContactWithActivity();
253
254 $params['activity_id'] = 100001;
7fbb4198 255 $result = $this->callAPIFailure('profile', 'get', $params,
21170390 256 'Invalid Activity Id (aid).');
6a488035
TO
257 }
258
c490a46a 259 /**
100fef9d 260 * Check contact activity profile with wrong activity type
c490a46a 261 */
6a488035
TO
262 function testContactActivityGetWrongActivityType() {
263 //flush cache by calling with reset
264 $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, TRUE, 'name', TRUE);
265
266 $sourceContactId = $this->householdCreate();
267
268 $activityparams = array(
269 'source_contact_id' => $sourceContactId,
270 'activity_type_id' => '2',
271 'subject' => 'Test activity',
272 'activity_date_time' => '20110316',
273 'duration' => '120',
274 'location' => 'Pensulvania',
275 'details' => 'a test activity',
276 'status_id' => '1',
6a488035
TO
277 'priority_id' => '1',
278 );
279
7fbb4198 280 $activity = $this->callAPISuccess('activity', 'create', $activityparams);
6a488035
TO
281
282 $activityValues = array_pop($activity['values']);
283
284 list($params, $expected) = $this->_createContactWithActivity();
285
286 $params['activity_id'] = $activityValues['id'];
7fbb4198 287 $result = $this->callAPIFailure('profile', 'get', $params,
288 'This activity cannot be edited or viewed via this profile.'
289 );
6a488035
TO
290 }
291
c490a46a 292 /**
100fef9d 293 * Check contact activity profile with success
c490a46a 294 */
6a488035
TO
295 function testContactActivityGetSuccess() {
296 list($params, $expected) = $this->_createContactWithActivity();
297
7fbb4198 298 $result = $this->callAPISuccess('profile', 'get', $params);
6a488035
TO
299
300 foreach ($expected as $profileField => $value) {
301 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values']), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$profileField}"
302 );
303 }
6a488035
TO
304 }
305
6a488035 306 /**
9dec4e61 307 * Check getfields works & gives us our fields
308 */
309 function testGetFields() {
310 $this->_createIndividualProfile();
311 $this->_addCustomFieldToProfile($this->_profileID);
9da2e77c 312 $result = $this->callAPIAndDocument('profile', 'getfields', array('action' => 'submit', 'profile_id' => $this->_profileID), __FUNCTION__, __FILE__,
9dec4e61 313 'demonstrates retrieving profile fields passing in an id');
314 $this->assertArrayKeyExists('first_name', $result['values']);
315 $this->assertEquals('2', $result['values']['first_name']['type']);
9da2e77c 316 $this->assertEquals('Email', $result['values']['email-primary']['title']);
9dec4e61 317 $this->assertEquals('civicrm_state_province', $result['values']['state_province-1']['pseudoconstant']['table']);
318 $this->assertEquals('defaultValue', $result['values']['custom_1']['default_value']);
319 $this->assertFalse(array_key_exists('participant_status', $result['values']));
320 }
c490a46a 321
9dec4e61 322 /**
b0b44427 323 * Check getfields works & gives us our fields - partipant profile
6a488035 324 */
9dec4e61 325 function testGetFieldsParticipantProfile() {
326 $result = $this->callAPISuccess('profile', 'getfields', array(
327 'action' => 'submit',
328 'profile_id' => 'participant_status',
329 'get_options' => 'all')
330 );
29fbb90a
E
331 $this->assertTrue(array_key_exists('participant_status_id', $result['values']));
332 $this->assertEquals('Attended', $result['values']['participant_status_id']['options'][2]);
333 $this->assertEquals(array('participant_status'), $result['values']['participant_status_id']['api.aliases']);
6a488035 334 }
b0b44427 335
336 /**
337 * Check getfields works & gives us our fields - membership_batch_entry
338 * (getting to the end with no e-notices is pretty good evidence it's working)
339 */
340 function testGetFieldsMembershipBatchProfile() {
341 $result = $this->callAPISuccess('profile', 'getfields', array(
342 'action' => 'submit',
343 'profile_id' => 'membership_batch_entry',
344 'get_options' => 'all')
345 );
346 $this->assertTrue(array_key_exists('total_amount', $result['values']));
7c3f2c03
E
347 $this->assertTrue(array_key_exists('financial_type_id', $result['values']));
348 $this->assertEquals(array('contribution_type_id', 'contribution_type', 'financial_type'), $result['values']['financial_type_id']['api.aliases']);
349 $this->assertTrue(!array_key_exists('financial_type', $result['values']));
b0b44427 350 $this->assertEquals(12, $result['values']['receive_date']['type']);
351 }
352
353 /**
354 * Check getfields works & gives us our fields - do them all
355 * (getting to the end with no e-notices is pretty good evidence it's working)
356 */
357 function testGetFieldsAllProfiles() {
358 $result = $this->callAPISuccess('uf_group', 'get', array('return' => 'id'));
359 $profileIDs = array_keys($result['values']);
360 foreach ($profileIDs as $profileID) {
21170390 361 $result = $this->callAPISuccess('profile', 'getfields', array(
362 'action' => 'submit',
363 'profile_id' => $profileID,
364 'get_options' => 'all')
365 );
b0b44427 366 }
367 }
9dec4e61 368 /////////////// test $this->callAPISuccess3_profile_set //////////////////
6a488035
TO
369
370 /**
100fef9d 371 * Check Without ProfileId
6a488035 372 */
9dec4e61 373 function testProfileSubmitWithoutProfileId() {
6a488035
TO
374 $params = array(
375 'contact_id' => 1,
6a488035 376 );
9dec4e61 377 $result = $this->callAPIFailure('profile', 'submit', $params,
7fbb4198 378 'Mandatory key(s) missing from params array: profile_id'
379 );
6a488035
TO
380 }
381
382 /**
100fef9d 383 * Check with no invalid profile Id
6a488035 384 */
9dec4e61 385 function testProfileSubmitInvalidProfileId() {
6a488035
TO
386 $params = array(
387 'contact_id' => 1,
388 'profile_id' => 1000,
6a488035 389 );
9dec4e61 390 $result = $this->callAPIFailure('profile', 'submit', $params);
6a488035
TO
391 }
392
393 /**
100fef9d 394 * Check with missing required field in profile
6a488035 395 */
9dec4e61 396 function testProfileSubmitCheckProfileRequired() {
6a488035
TO
397 $pofileFieldValues = $this->_createIndividualContact();
398 current($pofileFieldValues);
399 $contactId = key($pofileFieldValues);
400 $updateParams = array(
401 'first_name' => 'abc2',
402 'last_name' => 'xyz2',
403 'phone-1-1' => '022 321 826',
404 'country-1' => '1013',
405 'state_province-1' => '1000',
406 );
407
9da2e77c 408 $params = array_merge(array('profile_id' => $this->_profileID, 'contact_id' => $contactId),
6a488035
TO
409 $updateParams
410 );
411
9dec4e61 412 $result = $this->callAPIFailure('profile', 'submit', $params,
9da2e77c 413 "Missing required parameters for profile id $this->_profileID: email-Primary"
7fbb4198 414 );
6a488035
TO
415 }
416
417 /**
100fef9d 418 * Check with success
6a488035 419 */
9dec4e61 420 function testProfileSubmit() {
6a488035
TO
421 $pofileFieldValues = $this->_createIndividualContact();
422 current($pofileFieldValues);
423 $contactId = key($pofileFieldValues);
424
425 $updateParams = array(
426 'first_name' => 'abc2',
427 'last_name' => 'xyz2',
5aa090ea 428 'email-primary' => 'abc2.xyz2@gmail.com',
6a488035
TO
429 'phone-1-1' => '022 321 826',
430 'country-1' => '1013',
431 'state_province-1' => '1000',
432 );
433
434 $params = array_merge(array(
9da2e77c 435 'profile_id' => $this->_profileID,
21170390 436 'contact_id' => $contactId,
437 ), $updateParams);
6a488035 438
9dec4e61 439 $result = $this->callAPIAndDocument('profile', 'submit', $params, __FUNCTION__, __FILE__);
6a488035
TO
440
441 $getParams = array(
9da2e77c 442 'profile_id' => $this->_profileID,
6a488035 443 'contact_id' => $contactId,
6a488035 444 );
7fbb4198 445 $profileDetails = $this->callAPISuccess('profile', 'get', $getParams);
6a488035
TO
446
447 foreach ($updateParams as $profileField => $value) {
f5bf5e4f 448 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $profileDetails['values']), "missing/mismatching value for {$profileField}"
6a488035
TO
449 );
450 }
f5bf5e4f
E
451 unset($params['email-primary']);
452 $params['email-Primary'] = 'my@mail.com';
702c5ce2 453 $this->callAPISuccess('profile', 'submit', $params);
5aa090ea 454 $profileDetails = $this->callAPISuccess('profile', 'get', $getParams);
f5bf5e4f 455 $this->assertEquals('my@mail.com', $profileDetails['values']['email-Primary']);
6a488035
TO
456 }
457
7c3f2c03
E
458 /**
459 * Ensure caches are being cleared so we don't get into a debugging trap because of cached metadata
460 * First we delete & create to increment the version & then check for caching probs
461 */
462 function testProfileSubmitCheckCaching() {
463 $this->callAPISuccess('membership_type', 'delete', array('id' => $this->_membershipTypeID));
464 $this->_membershipTypeID = $this->membershipTypeCreate();
465
466 $membershipTypes = $this->callAPISuccess('membership_type', 'get', array());
467 $profileFields = $this->callAPISuccess('profile', 'getfields', array('get_options' => 'all', 'action' => 'submit', 'profile_id' => 'membership_batch_entry'));
468 $getoptions = $this->callAPISuccess('membership', 'getoptions', array('field' => 'membership_type', 'context' => 'validate'));
469 $this->assertEquals(array_keys($membershipTypes['values']), array_keys($getoptions['values']));
f5c68f3c 470 $this->assertEquals(array_keys($membershipTypes['values']), array_keys($profileFields['values']['membership_type_id']['options']));
7c3f2c03
E
471
472}
f5c68f3c
E
473
474 /**
475 * Test that the fields are returned in the right order despite the faffing around that goes on
476 */
477 function testMembershipGetFieldsOrder() {
478 $result = $this->callAPISuccess('profile', 'getfields', array('action' => 'submit', 'profile_id' => 'membership_batch_entry'));
479 $weight = 1;
480 foreach($result['values'] as $fieldName => $field) {
481 if($fieldName == 'profile_id') {
482 continue;
483 }
484 $this->assertEquals($field['weight'], $weight);
485 $weight++;
486 }
487 }
7c3f2c03
E
488 /**
489 * Check we can submit membership batch profiles (create mode)
490 */
491 function testProfileSubmitMembershipBatch() {
492 $this->_contactID = $this->individualCreate();
493 $this->callAPISuccess('profile', 'submit', array(
494 'profile_id' => 'membership_batch_entry',
495 'financial_type_id' => 1,
496 'membership_type' => $this->_membershipTypeID,
497 'join_date' => 'now',
498 'total_amount' => 10,
499 'contribution_status_id' => 1,
500 'receive_date' => 'now',
501 'contact_id' => $this->_contactID,
502 ));
503 }
158d3e03 504 /**
100fef9d 505 * Set is deprecated but we need to ensure it still works
158d3e03 506 */
507 function testLegacySet() {
508 $pofileFieldValues = $this->_createIndividualContact();
509 current($pofileFieldValues);
510 $contactId = key($pofileFieldValues);
511
512 $updateParams = array(
513 'first_name' => 'abc2',
514 'last_name' => 'xyz2',
515 'email-Primary' => 'abc2.xyz2@gmail.com',
516 'phone-1-1' => '022 321 826',
517 'country-1' => '1013',
518 'state_province-1' => '1000',
519 );
520
521 $params = array_merge(array(
9da2e77c 522 'profile_id' => $this->_profileID,
158d3e03 523 'contact_id' => $contactId,
524 ), $updateParams);
525
526 $result = $this->callAPISuccess('profile', 'set', $params);
527 $this->assertArrayKeyExists('values', $result);
528 $getParams = array(
9da2e77c 529 'profile_id' => $this->_profileID,
158d3e03 530 'contact_id' => $contactId,
531 );
532 $profileDetails = $this->callAPISuccess('profile', 'get', $getParams);
533
534 foreach ($updateParams as $profileField => $value) {
535 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $profileDetails['values']), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$profileField}"
536 );
537 }
538 }
c490a46a
CW
539
540 /**
100fef9d 541 * Check contact activity profile without activity id
c490a46a 542 */
9dec4e61 543 function testContactActivitySubmitWithoutActivityId() {
6a488035
TO
544 list($params, $expected) = $this->_createContactWithActivity();
545
546 $params = array_merge($params, $expected);
547 unset($params['activity_id']);
9dec4e61 548 $result = $this->callAPIFailure('profile', 'submit', $params);
6a488035 549 $this->assertEquals($result['error_message'], 'Mandatory key(s) missing from params array: activity_id');
6a488035
TO
550 }
551
c490a46a 552 /**
100fef9d 553 * Check contact activity profile wrong activity id
c490a46a 554 */
9dec4e61 555 function testContactActivitySubmitWrongActivityId() {
6a488035 556 list($params, $expected) = $this->_createContactWithActivity();
6a488035
TO
557 $params = array_merge($params, $expected);
558 $params['activity_id'] = 100001;
9dec4e61 559 $result = $this->callAPIFailure('profile', 'submit', $params);
6a488035 560 $this->assertEquals($result['error_message'], 'Invalid Activity Id (aid).');
6a488035
TO
561 }
562
c490a46a 563 /**
100fef9d 564 * Check contact activity profile with wrong activity type
c490a46a 565 */
9dec4e61 566 function testContactActivitySubmitWrongActivityType() {
6a488035
TO
567 //flush cache by calling with reset
568 $activityTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, TRUE, 'name', TRUE);
569
570 $sourceContactId = $this->householdCreate();
571
572 $activityparams = array(
573 'source_contact_id' => $sourceContactId,
574 'activity_type_id' => '2',
575 'subject' => 'Test activity',
576 'activity_date_time' => '20110316',
577 'duration' => '120',
578 'location' => 'Pensulvania',
579 'details' => 'a test activity',
580 'status_id' => '1',
6a488035
TO
581 'priority_id' => '1',
582 );
583
7fbb4198 584 $activity = $this->callAPISuccess('activity', 'create', $activityparams);
6a488035
TO
585
586 $activityValues = array_pop($activity['values']);
587
588 list($params, $expected) = $this->_createContactWithActivity();
589
590 $params = array_merge($params, $expected);
591 $params['activity_id'] = $activityValues['id'];
9dec4e61 592 $result = $this->callAPIFailure('profile', 'submit', $params,
7fbb4198 593 'This activity cannot be edited or viewed via this profile.');
6a488035
TO
594 }
595
c490a46a 596 /**
100fef9d 597 * Check contact activity profile with success
c490a46a 598 */
9dec4e61 599 function testContactActivitySubmitSuccess() {
6a488035
TO
600 list($params, $expected) = $this->_createContactWithActivity();
601
602 $updateParams = array(
603 'first_name' => 'abc2',
604 'last_name' => 'xyz2',
605 'email-Primary' => 'abc2.xyz2@yahoo.com',
606 'activity_subject' => 'Test Meeting',
607 'activity_details' => 'a test activity details',
608 'activity_duration' => '100',
609 'activity_date_time' => '03/08/2010',
610 'activity_status_id' => '2',
611 );
612 $profileParams = array_merge($params, $updateParams);
c3d3e837
E
613 $this->callAPISuccess('profile', 'submit', $profileParams);
614 $result = $this->callAPISuccess('profile', 'get', $params);
6a488035
TO
615
616 foreach ($updateParams as $profileField => $value) {
617 $this->assertEquals($value, CRM_Utils_Array::value($profileField, $result['values']), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$profileField}"
618 );
619 }
6a488035
TO
620 }
621
6a488035 622 /**
100fef9d 623 * Check profile apply Without ProfileId
6a488035
TO
624 */
625 function testProfileApplyWithoutProfileId() {
626 $params = array(
627 'contact_id' => 1,
6a488035 628 );
7fbb4198 629 $result = $this->callAPIFailure('profile', 'apply', $params,
630 'Mandatory key(s) missing from params array: profile_id');
6a488035
TO
631 }
632
633 /**
100fef9d 634 * Check profile apply with no invalid profile Id
6a488035
TO
635 */
636 function testProfileApplyInvalidProfileId() {
637 $params = array(
638 'contact_id' => 1,
639 'profile_id' => 1000,
6a488035 640 );
d0e1eff2 641 $result = $this->callAPIFailure('profile', 'apply', $params);
6a488035
TO
642 }
643
644 /**
100fef9d 645 * Check with success
6a488035
TO
646 */
647 function testProfileApply() {
648 $pofileFieldValues = $this->_createIndividualContact();
649 current($pofileFieldValues);
650 $contactId = key($pofileFieldValues);
651
652 $params = array(
9da2e77c 653 'profile_id' => $this->_profileID,
6a488035 654 'contact_id' => $contactId,
6a488035
TO
655 'first_name' => 'abc2',
656 'last_name' => 'xyz2',
657 'email-Primary' => 'abc2.xyz2@gmail.com',
658 'phone-1-1' => '022 321 826',
659 'country-1' => '1013',
660 'state_province-1' => '1000',
661 );
662
7fbb4198 663 $result = $this->callAPIAndDocument('profile', 'apply', $params, __FUNCTION__, __FILE__);
6a488035
TO
664
665 // Expected field values
666 $expected['contact'] = array(
667 'contact_id' => $contactId,
668 'contact_type' => 'Individual',
669 'first_name' => 'abc2',
670 'last_name' => 'xyz2',
671 );
672 $expected['email'] = array(
673 'location_type_id' => 1,
674 'is_primary' => 1,
675 'email' => 'abc2.xyz2@gmail.com',
676 );
677
678 $expected['phone'] = array(
679 'location_type_id' => 1,
680 'is_primary' => 1,
681 'phone_type_id' => 1,
682 'phone' => '022 321 826',
683 );
684 $expected['address'] = array(
685 'location_type_id' => 1,
686 'is_primary' => 1,
687 'country_id' => 1013,
688 'state_province_id' => 1000,
689 );
690
691 foreach ($expected['contact'] as $field => $value) {
692 $this->assertEquals($value, CRM_Utils_Array::value($field, $result['values']), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$field}"
693 );
694 }
695
696 foreach (array(
697 'email', 'phone', 'address') as $fieldType) {
698 $typeValues = array_pop($result['values'][$fieldType]);
699 foreach ($expected[$fieldType] as $field => $value) {
700 $this->assertEquals($value, CRM_Utils_Array::value($field, $typeValues), "In line " . __LINE__ . " error message: " . "missing/mismatching value for {$field} ({$fieldType})"
701 );
702 }
703 }
704 }
705
4cbe18b8 706 /**
c490a46a 707 * Helper function to create an Individual with address/email/phone info. Import UF Group and UF Fields
4cbe18b8
EM
708 * @param array $params
709 *
710 * @return mixed
711 */
e0efd2d0 712 function _createIndividualContact($params = array()) {
713 $contactParams = array_merge(array(
6a488035
TO
714 'first_name' => 'abc1',
715 'last_name' => 'xyz1',
6a488035 716 'email' => 'abc1.xyz1@yahoo.com',
6a488035
TO
717 'api.address.create' => array(
718 'location_type_id' => 1,
719 'is_primary' => 1,
b29f74b6 720 'street_address' => '5 Saint Helier St',
6a488035
TO
721 'county' => 'Marin',
722 'country' => 'United States',
723 'state_province' => 'Michigan',
724 'supplemental_address_1' => 'Hallmark Ct',
725 'supplemental_address_2' => 'Jersey Village',
e0efd2d0 726 'postal_code' => '90210',
b29f74b6 727 'city' => 'Gotham City',
728 'is_billing' => 0,
6a488035
TO
729 ),
730 'api.phone.create' => array(
731 'location_type_id' => '1',
732 'phone' => '021 512 755',
733 'phone_type_id' => '1',
734 'is_primary' => '1',
735 ),
e0efd2d0 736 ), $params
6a488035
TO
737 );
738
174dbdd5 739 $this->_contactID = $this->individualCreate($contactParams);
9dec4e61 740 $this->_createIndividualProfile();
6a488035 741 // expected result of above created profile with contact Id $contactId
174dbdd5 742 $profileData[$this->_contactID] = array(
6a488035
TO
743 'first_name' => 'abc1',
744 'last_name' => 'xyz1',
9da2e77c 745 'email-primary' => 'abc1.xyz1@yahoo.com',
6a488035
TO
746 'phone-1-1' => '021 512 755',
747 'country-1' => '1228',
748 'state_province-1' => '1021',
749 );
750
751 return $profileData;
752 }
753
4cbe18b8
EM
754 /**
755 * @return array
756 */
6a488035
TO
757 function _createContactWithActivity() {
758 // @TODO: Create profile with custom fields
759 $op = new PHPUnit_Extensions_Database_Operation_Insert();
760 $op->execute($this->_dbconn,
bbfd46a5 761 $this->createFlatXMLDataSet(
6a488035
TO
762 dirname(__FILE__) . '/dataset/uf_group_contact_activity_26.xml'
763 )
764 );
765 // hack: xml data set do not accept \ 1 (CRM_Core_DAO::VALUE_SEPARATOR)
766 CRM_Core_DAO::setFieldValue('CRM_Core_DAO_UFGroup', '26', 'group_type', 'Individual,Contact,Activity' . CRM_Core_DAO::VALUE_SEPARATOR . 'ActivityType:1');
767
768 $sourceContactId = $this->individualCreate();
769 $contactParams = array(
770 'first_name' => 'abc1',
771 'last_name' => 'xyz1',
772 'contact_type' => 'Individual',
773 'email' => 'abc1.xyz1@yahoo.com',
6a488035
TO
774 'api.address.create' => array(
775 'location_type_id' => 1,
776 'is_primary' => 1,
777 'name' => 'Saint Helier St',
778 'county' => 'Marin',
779 'country' => 'United States',
780 'state_province' => 'Michigan',
781 'supplemental_address_1' => 'Hallmark Ct',
782 'supplemental_address_2' => 'Jersey Village',
783 ),
784 );
785
7fbb4198 786 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
6a488035
TO
787
788 $keys = array_keys($contact['values']);
789 $contactId = array_pop($keys);
790
791 $this->assertEquals(0, $contact['values'][$contactId]['api.address.create']['is_error'], "In line " . __LINE__ . " error message: " . CRM_Utils_Array::value('error_message', $contact['values'][$contactId]['api.address.create'])
792 );
793
794 $activityParams = array(
795 'source_contact_id' => $sourceContactId,
796 'assignee_contact_id' => $contactId,
797 'activity_type_id' => '1',
798 'subject' => 'Make-it-Happen Meeting',
799 'activity_date_time' => '20110316',
800 'duration' => '120',
801 'location' => 'Pensulvania',
802 'details' => 'a test activity',
803 'status_id' => '1',
6a488035
TO
804 'priority_id' => '1',
805 );
7fbb4198 806 $activity = $this->callAPISuccess('activity', 'create', $activityParams);
6a488035
TO
807
808 $activityValues = array_pop($activity['values']);
809
810 // valid parameters for above profile
811 $profileParams = array(
812 'profile_id' => 26,
813 'contact_id' => $contactId,
814 'activity_id' => $activityValues['id'],
21170390 815 );
6a488035
TO
816
817 // expected result of above created profile
818 $expected = array(
819 'first_name' => 'abc1',
820 'last_name' => 'xyz1',
821 'email-Primary' => 'abc1.xyz1@yahoo.com',
822 'activity_subject' => 'Make-it-Happen Meeting',
823 'activity_details' => 'a test activity',
824 'activity_duration' => '120',
825 'activity_date_time_time' => '12:00AM',
826 'activity_date_time' => '03/16/2011',
827 'activity_status_id' => '1',
828 );
829
830 return array($profileParams, $expected);
831 }
9dec4e61 832 /**
833 * Create a profile
834 */
835 function _createIndividualProfile() {
9da2e77c
E
836
837 // creating these via the api as we want to utilise & test the flushing of caches when fields created
838 // via the api
839
840 $ufGroupParams = array(
841 'group_type' => 'Individual,Contact',// really we should remove this & test the ufField create sets it
842 'name' => 'test_individual_contact_profile',
843 'title' => 'Flat Coffee',
844 'api.uf_field.create' => array(
845 array(
846 'field_name' => 'first_name',
847 'is_required' => 1,
848 'visibility' => 'Public Pages and Listings',
849 'field_type' => 'Individual',
91d8fc8a 850 'label' => 'First Name',
9da2e77c
E
851 ),
852 array(
853 'field_name' => 'last_name',
854 'is_required' => 1,
855 'visibility' => 'Public Pages and Listings',
856 'field_type' => 'Individual',
91d8fc8a 857 'label' => 'Last Name',
9da2e77c
E
858 ),
859 array(
860 'field_name' => 'email',
861 'is_required' => 1,
862 'visibility' => 'Public Pages and Listings',
863 'field_type' => 'Contact',
864 'label' => 'Email',
865 ),
866 array(
867 'field_name' => 'phone',
868 'is_required' => 1,
869 'visibility' => 'Public Pages and Listings',
870 'field_type' => 'Contact',
871 'location_type_id' => 1,
872 'phone_type_id' => 1,
873 'label' => 'Phone'
874 ),
875 array(
876 'field_name' => 'country',
877 'is_required' => 1,
878 'visibility' => 'Public Pages and Listings',
879 'field_type' => 'Contact',
880 'location_type_id' => 1,
881 'label' => 'Country'
882 ),
883 array(
884 'field_name' => 'state_province',
885 'is_required' => 1,
886 'visibility' => 'Public Pages and Listings',
887 'field_type' => 'Contact',
888 'location_type_id' => 1,
889 'label' => 'State Province'
890 ),
891 array(
892 'field_name' => 'postal_code',
893 'is_required' => 0,
894 'field_type' => 'Contact',
895 'location_type_id' => 1,
896 'label' => 'State Province'
897 ),
898 ),
9dec4e61 899 );
9da2e77c
E
900 $profile = $this->callAPISuccess('uf_group', 'create', $ufGroupParams);
901 $this->_profileID = $profile['id'];
9dec4e61 902 }
903
4cbe18b8 904 /**
100fef9d 905 * @param int $profileID
4cbe18b8 906 */
9dec4e61 907 function _addCustomFieldToProfile($profileID) {
908 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, '');
909 $this->uFFieldCreate(array('uf_group_id' => $profileID, 'field_name' => 'custom_' . $ids['custom_field_id'], 'contact_type' => 'Contact'));
910 }
6a488035
TO
911}
912