Merge pull request #5035 from TeNNoX/master
[civicrm-core.git] / tests / phpunit / api / v3 / ActivityTest.php
1 <?php
2 /**
3 * @file
4 * File for the TestActivity class
5 *
6 * (PHP 5)
7 *
8 * @author Walt Haas <walt@dharmatech.org> (801) 534-1262
9 * @copyright Copyright CiviCRM LLC (C) 2009
10 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html
11 * GNU Affero General Public License version 3
12 * @version $Id: ActivityTest.php 31254 2010-12-15 10:09:29Z eileen $
13 * @package CiviCRM
14 *
15 * This file is part of CiviCRM
16 *
17 * CiviCRM is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Affero General Public License
19 * as published by the Free Software Foundation; either version 3 of
20 * the License, or (at your option) any later version.
21 *
22 * CiviCRM is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU Affero General Public License for more details.
26 *
27 * You should have received a copy of the GNU Affero General Public
28 * License along with this program. If not, see
29 * <http://www.gnu.org/licenses/>.
30 */
31
32 /**
33 * Include class definitions
34 */
35 require_once 'CiviTest/CiviUnitTestCase.php';
36
37
38 /**
39 * Test APIv3 civicrm_activity_* functions
40 *
41 * @package CiviCRM_APIv3
42 * @subpackage API_Activity
43 */
44 class api_v3_ActivityTest extends CiviUnitTestCase {
45 protected $_params;
46 protected $_params2;
47 protected $_entity = 'activity';
48 protected $_apiversion = 3;
49 protected $test_activity_type_value;
50 protected $_contactID;
51
52 /**
53 * Test setup for every test.
54 *
55 * Connect to the database, truncate the tables that will be used
56 * and redirect stdin to a temporary file
57 */
58 public function setUp() {
59 // Connect to the database
60 parent::setUp();
61
62 $this->_contactID = $this->individualCreate();
63 //create activity types
64 $activityTypes = $this->callAPISuccess('option_value', 'create', array(
65 'option_group_id' => 2,
66 'name' => 'Test activity type',
67 'label' => 'Test activity type',
68 'sequential' => 1,
69 ));
70 $this->test_activity_type_value = $activityTypes['values'][0]['value'];
71 $this->test_activity_type_id = $activityTypes['id'];
72 $this->_params = array(
73 'source_contact_id' => $this->_contactID,
74 'activity_type_id' => $this->test_activity_type_value,
75 'subject' => 'test activity type id',
76 'activity_date_time' => '2011-06-02 14:36:13',
77 'status_id' => 2,
78 'priority_id' => 1,
79 'duration' => 120,
80 'location' => 'Pennsylvania',
81 'details' => 'a test activity',
82 );
83 $this->_params2 = array(
84 'source_contact_id' => $this->_contactID,
85 'subject' => 'Eat & drink',
86 'activity_date_time' => date('Ymd'),
87 'duration' => 120,
88 'location' => 'Napier',
89 'details' => 'discuss & eat',
90 'status_id' => 1,
91 'activity_type_id' => $this->test_activity_type_value,
92 );
93 // create a logged in USER since the code references it for source_contact_id
94 $this->createLoggedInUser();
95 }
96
97 /**
98 * Tears down the fixture, for example, closes a network connection.
99 *
100 * This method is called after a test is executed.
101 */
102 public function tearDown() {
103 $tablesToTruncate = array(
104 'civicrm_contact',
105 'civicrm_activity',
106 'civicrm_activity_contact',
107 );
108 $this->quickCleanup($tablesToTruncate, TRUE);
109 $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id));
110 }
111
112 /**
113 * Check fails with empty array.
114 */
115 public function testActivityCreateEmpty() {
116 $this->callAPIFailure('activity', 'create', array());
117 }
118
119 /**
120 * Check if required fields are not passed.
121 */
122 public function testActivityCreateWithoutRequired() {
123 $params = array(
124 'subject' => 'this case should fail',
125 'scheduled_date_time' => date('Ymd'),
126 );
127 $result = $this->callAPIFailure('activity', 'create', $params);
128 }
129
130 /**
131 * Test civicrm_activity_create() with mismatched activity_type_id
132 * and activity_name.
133 */
134 public function testActivityCreateMismatchNameType() {
135 $params = array(
136 'source_contact_id' => $this->_contactID,
137 'subject' => 'Test activity',
138 'activity_date_time' => date('Ymd'),
139 'duration' => 120,
140 'location' => 'Pennsylvania',
141 'details' => 'a test activity',
142 'status_id' => 1,
143 'activity_name' => 'Fubar activity type',
144 'activity_type_id' => 5,
145 'scheduled_date_time' => date('Ymd'),
146 );
147
148 $result = $this->callAPIFailure('activity', 'create', $params);
149 }
150
151 /**
152 * Test civicrm_activity_id() with missing source_contact_id is put with the current user.
153 */
154 public function testActivityCreateWithMissingContactId() {
155 $params = array(
156 'subject' => 'Make-it-Happen Meeting',
157 'activity_date_time' => date('Ymd'),
158 'duration' => 120,
159 'location' => 'Pennsylvania',
160 'details' => 'a test activity',
161 'status_id' => 1,
162 'activity_name' => 'Test activity type',
163 );
164
165 $this->callAPISuccess('activity', 'create', $params);
166 }
167
168 /**
169 * Test civicrm_activity_id() with non-numeric source_contact_id.
170 */
171 public function testActivityCreateWithNonNumericContactId() {
172 $params = array(
173 'source_contact_id' => 'fubar',
174 'subject' => 'Make-it-Happen Meeting',
175 'activity_date_time' => date('Ymd'),
176 'duration' => 120,
177 'location' => 'Pennsylvania',
178 'details' => 'a test activity',
179 'status_id' => 1,
180 'activity_name' => 'Test activity type',
181 );
182
183 $this->callAPIFailure('activity', 'create', $params);
184 }
185
186 /**
187 * Ensure that an invalid activity type causes failure.
188 *
189 * Oddly enough this test was failing because the creation of the invalid type
190 * got added to the set up routine. Probably a mis-fix on a test
191 */
192 public function testActivityCreateWithNonNumericActivityTypeId() {
193 $params = array(
194 'source_contact_id' => $this->_contactID,
195 'subject' => 'Make-it-Happen Meeting',
196 'activity_date_time' => date('Ymd'),
197 'duration' => 120,
198 'location' => 'Pennsylvania',
199 'details' => 'a test activity',
200 'status_id' => 1,
201 'activity_type_id' => 'Invalid Test activity type',
202 );
203
204 $result = $this->callAPIFailure('activity', 'create', $params);
205 }
206
207 /**
208 * Check with incorrect required fields.
209 */
210 public function testActivityCreateWithUnknownActivityTypeId() {
211 $params = array(
212 'source_contact_id' => $this->_contactID,
213 'subject' => 'Make-it-Happen Meeting',
214 'activity_date_time' => date('Ymd'),
215 'duration' => 120,
216 'location' => 'Pennsylvania',
217 'details' => 'a test activity',
218 'status_id' => 1,
219 'activity_type_id' => 699,
220 );
221
222 $result = $this->callAPIFailure('activity', 'create', $params);
223 }
224
225 public function testActivityCreateWithInvalidPriority() {
226 $params = array(
227 'source_contact_id' => $this->_contactID,
228 'subject' => 'Make-it-Happen Meeting',
229 'activity_date_time' => date('Ymd'),
230 'duration' => 120,
231 'location' => 'Pennsylvania',
232 'details' => 'a test activity',
233 'status_id' => 1,
234 'priority_id' => 44,
235 'activity_type_id' => 1,
236 );
237
238 $result = $this->callAPIFailure('activity', 'create', $params,
239 "'44' is not a valid option for field priority_id");
240 $this->assertEquals('priority_id', $result['error_field']);
241 }
242
243
244 /**
245 * Test create succeeds with valid string for priority.
246 */
247 public function testActivityCreateWithValidStringPriority() {
248 $params = array(
249 'source_contact_id' => $this->_contactID,
250 'subject' => 'Make-it-Happen Meeting',
251 'activity_date_time' => date('Ymd'),
252 'duration' => 120,
253 'location' => 'Pennsylvania',
254 'details' => 'a test activity',
255 'status_id' => 1,
256 'priority_id' => 'Urgent',
257 'activity_type_id' => 1,
258 );
259
260 $result = $this->callAPISuccess('activity', 'create', $params);
261 $this->assertEquals(1, $result['values'][$result['id']]['priority_id']);
262 }
263
264 /**
265 * Test create fails with invalid priority string.
266 */
267 public function testActivityCreateWithInValidStringPriority() {
268 $params = array(
269 'source_contact_id' => $this->_contactID,
270 'subject' => 'Make-it-Happen Meeting',
271 'activity_date_time' => date('Ymd'),
272 'duration' => 120,
273 'location' => 'Pennsylvania',
274 'details' => 'a test activity',
275 'status_id' => 1,
276 'priority_id' => 'ergUrgent',
277 'activity_type_id' => 1,
278 );
279
280 $this->callAPIFailure('activity', 'create', $params,
281 "'ergUrgent' is not a valid option for field priority_id");
282 }
283
284 /**
285 * Test civicrm_activity_create() with valid parameters.
286 */
287 public function testActivityCreate() {
288
289 $this->callAPISuccess('activity', 'create', $this->_params);
290 $result = $this->callAPISuccess('activity', 'get', $this->_params);
291 $this->assertEquals($result['values'][$result['id']]['duration'], 120);
292 $this->assertEquals($result['values'][$result['id']]['subject'], 'test activity type id');
293 $this->assertEquals($result['values'][$result['id']]['activity_date_time'], '2011-06-02 14:36:13');
294 $this->assertEquals($result['values'][$result['id']]['location'], 'Pennsylvania');
295 $this->assertEquals($result['values'][$result['id']]['details'], 'a test activity');
296 $this->assertEquals($result['values'][$result['id']]['status_id'], 2);
297 $this->assertEquals($result['values'][$result['id']]['id'], $result['id']);
298 }
299
300 /**
301 * Test civicrm_activity_create() with valid parameters - use type_id.
302 */
303 public function testActivityCreateCampaignTypeID() {
304 $this->enableCiviCampaign();
305
306 $params = array(
307 'source_contact_id' => $this->_contactID,
308 'subject' => 'Make-it-Happen Meeting',
309 'activity_date_time' => '20110316',
310 'duration' => 120,
311 'location' => 'Pennsylvania',
312 'details' => 'a test activity',
313 'status_id' => 1,
314 'activity_type_id' => 29,
315 'priority_id' => 1,
316 );
317
318 $result = $this->callAPISuccess('activity', 'create', $params);
319
320 $result = $this->callAPISuccess('activity', 'get', array('id' => $result['id']));
321 $this->assertEquals($result['values'][$result['id']]['duration'], 120);
322 $this->assertEquals($result['values'][$result['id']]['subject'], 'Make-it-Happen Meeting');
323 $this->assertEquals($result['values'][$result['id']]['activity_date_time'], '2011-03-16 00:00:00');
324 $this->assertEquals($result['values'][$result['id']]['location'], 'Pennsylvania');
325 $this->assertEquals($result['values'][$result['id']]['details'], 'a test activity');
326 $this->assertEquals($result['values'][$result['id']]['status_id'], 1);
327 }
328
329 /**
330 * Test get returns target and assignee contacts.
331 */
332 public function testActivityReturnTargetAssignee() {
333
334 $description = "Example demonstrates setting & retrieving the target & source";
335 $subfile = "GetTargetandAssignee";
336 $params = array(
337 'source_contact_id' => $this->_contactID,
338 'subject' => 'Make-it-Happen Meeting',
339 'activity_date_time' => '20110316',
340 'duration' => 120,
341 'location' => 'Pennsylvania',
342 'details' => 'a test activity',
343 'status_id' => 1,
344 'activity_type_id' => 1,
345 'priority_id' => 1,
346 'target_contact_id' => $this->_contactID,
347 'assignee_contact_id' => $this->_contactID,
348 );
349
350 $result = $this->callAPIAndDocument('activity', 'create', $params, __FUNCTION__, __FILE__, $description, $subfile);
351 $result = $this->callAPISuccess('activity', 'get', array(
352 'id' => $result['id'],
353 'version' => $this->_apiversion,
354 'return.assignee_contact_id' => 1,
355 'return.target_contact_id' => 1,
356 ));
357
358 $this->assertEquals($this->_contactID, $result['values'][$result['id']]['assignee_contact_id'][0]);
359 $this->assertEquals($this->_contactID, $result['values'][$result['id']]['target_contact_id'][0]);
360 }
361
362 /**
363 * Test civicrm_activity_create() using example code.
364 */
365 public function testActivityCreateExample() {
366 require_once 'api/v3/examples/Activity/Create.php';
367 $result = activity_create_example();
368 $expectedResult = activity_create_expectedresult();
369 $this->assertEquals($result, $expectedResult);
370 }
371
372 /**
373 * Test civicrm_activity_create() with valid parameters and custom data.
374 */
375 public function testActivityCreateCustom() {
376 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, __FILE__);
377 $params = $this->_params;
378 $params['custom_' . $ids['custom_field_id']] = "custom string";
379 $result = $this->callAPIAndDocument($this->_entity, 'create', $params, __FUNCTION__, __FILE__);
380 $result = $this->callAPISuccess($this->_entity, 'get', array(
381 'return.custom_' . $ids['custom_field_id'] => 1,
382 'id' => $result['id'],
383 ));
384 $this->assertEquals("custom string", $result['values'][$result['id']]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
385
386 $this->customFieldDelete($ids['custom_field_id']);
387 $this->customGroupDelete($ids['custom_group_id']);
388 }
389
390 /**
391 * Test civicrm_activity_create() with valid parameters and custom data.
392 */
393 public function testActivityCreateCustomContactRefField() {
394
395 $this->callAPISuccess('contact', 'create', array('id' => $this->_contactID, 'sort_name' => 'Contact, Test'));
396 $subfile = 'ContactRefCustomField';
397 $description = "demonstrates create with Contact Reference Custom Field";
398 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, __FILE__);
399 $params = array(
400 'custom_group_id' => $ids['custom_group_id'],
401 'name' => 'Worker_Lookup',
402 'label' => 'Worker Lookup',
403 'html_type' => 'Autocomplete-Select',
404 'data_type' => 'ContactReference',
405 'weight' => 4,
406 'is_searchable' => 1,
407 'is_active' => 1,
408 );
409
410 $customField = $this->callAPISuccess('custom_field', 'create', $params);
411 $params = $this->_params;
412 $params['custom_' . $customField['id']] = "$this->_contactID";
413
414 $result = $this->callAPIAndDocument($this->_entity, 'create', $params, __FUNCTION__, __FILE__, $description, $subfile, 'Create');
415 $result = $this->callAPIAndDocument($this->_entity, 'get', array(
416 'return.custom_' . $customField['id'] => 1,
417 'id' => $result['id'],
418 ), __FUNCTION__, __FILE__, 'Get with Contact Ref Custom Field', 'ContactRefCustomFieldGet', 'get');
419
420 $this->assertEquals('Anderson, Anthony', $result['values'][$result['id']]['custom_' . $customField['id']]);
421 $this->assertEquals($this->_contactID, $result['values'][$result['id']]['custom_' . $customField['id'] . "_id"], ' in line ' . __LINE__);
422 $this->assertEquals('Anderson, Anthony', $result['values'][$result['id']]['custom_' . $customField['id'] . '_1'], ' in line ' . __LINE__);
423 $this->assertEquals($this->_contactID, $result['values'][$result['id']]['custom_' . $customField['id'] . "_1_id"], ' in line ' . __LINE__);
424 $this->customFieldDelete($ids['custom_field_id']);
425 $this->customGroupDelete($ids['custom_group_id']);
426 }
427
428 /**
429 * Test civicrm_activity_create() with an invalid text status_id.
430 */
431 public function testActivityCreateBadTextStatus() {
432
433 $params = array(
434 'source_contact_id' => $this->_contactID,
435 'subject' => 'Discussion on Apis for v3',
436 'activity_date_time' => date('Ymd'),
437 'duration' => 120,
438 'location' => 'Pennsylvania',
439 'details' => 'a test activity',
440 'status_id' => 'Invalid',
441 'activity_name' => 'Test activity type',
442 );
443
444 $this->callAPIFailure('activity', 'create', $params);
445 }
446
447 /**
448 * Test civicrm_activity_create() with an invalid text status_id.
449 */
450 public function testActivityCreateSupportActivityStatus() {
451
452 $params = array(
453 'source_contact_id' => $this->_contactID,
454 'subject' => 'Discussion on Apis for v3',
455 'activity_date_time' => date('Ymd'),
456 'duration' => 120,
457 'location' => 'Pennsylvania',
458 'details' => 'a test activity',
459 'activity_status_id' => 'Invalid',
460 'activity_name' => 'Test activity type',
461 );
462
463 $result = $this->callAPIFailure('activity', 'create', $params,
464 "'Invalid' is not a valid option for field status_id");
465 }
466
467
468 /**
469 * Test civicrm_activity_create() with using a text status_id.
470 */
471 public function testActivityCreateTextStatus() {
472
473 $params = array(
474 'source_contact_id' => $this->_contactID,
475 'subject' => 'Make-it-Happen Meeting',
476 'activity_date_time' => date('Ymd'),
477 'duration' => 120,
478 'location' => 'Pennsylvania',
479 'details' => 'a test activity',
480 'status_id' => 'Scheduled',
481 'activity_name' => 'Test activity type',
482 );
483
484 $result = $this->callAPISuccess('activity', 'create', $params);
485 $this->assertEquals($result['values'][$result['id']]['duration'], 120);
486 $this->assertEquals($result['values'][$result['id']]['subject'], 'Make-it-Happen Meeting');
487 $this->assertEquals($result['values'][$result['id']]['activity_date_time'], date('Ymd') . '000000');
488 $this->assertEquals($result['values'][$result['id']]['location'], 'Pennsylvania');
489 $this->assertEquals($result['values'][$result['id']]['details'], 'a test activity');
490 }
491
492 /**
493 * Test civicrm_activity_get() with no params
494 */
495 public function testActivityGetEmpty() {
496 $result = $this->callAPISuccess('activity', 'get', array());
497 }
498
499 /**
500 * Test civicrm_activity_get() with a good activity ID
501 */
502 public function testActivityGetGoodID1() {
503 // Insert rows in civicrm_activity creating activities 4 and
504 // 13
505 $description = "Function demonstrates getting asignee_contact_id & using it to get the contact";
506 $subfile = 'ReturnAssigneeContact';
507 $activity = $this->callAPISuccess('activity', 'create', $this->_params);
508
509 $contact = $this->callAPISuccess('Contact', 'Create', array(
510 'first_name' => "The Rock",
511 'last_name' => 'roccky',
512 'contact_type' => 'Individual',
513 'version' => 3,
514 'api.activity.create' => array(
515 'id' => $activity['id'],
516 'assignee_contact_id' => '$value.id',
517 ),
518 ));
519
520 $params = array(
521 'activity_id' => $activity['id'],
522 'version' => $this->_apiversion,
523 'sequential' => 1,
524 'return.assignee_contact_id' => 1,
525 'api.contact.get' => array(
526 'id' => '$value.source_contact_id',
527 ),
528 );
529
530 $result = $this->callAPIAndDocument('Activity', 'Get', $params, __FUNCTION__, __FILE__, $description, $subfile);
531
532 $this->assertEquals($activity['id'], $result['id'], 'In line ' . __LINE__);
533
534 $this->assertEquals($contact['id'], $result['values'][0]['assignee_contact_id'][0], 'In line ' . __LINE__);
535
536 $this->assertEquals($this->_contactID, $result['values'][0]['api.contact.get']['values'][0]['contact_id'], 'In line ' . __LINE__);
537 $this->assertEquals($this->test_activity_type_value, $result['values'][0]['activity_type_id'], 'In line ' . __LINE__);
538 $this->assertEquals("test activity type id", $result['values'][0]['subject'], 'In line ' . __LINE__);
539 }
540
541 /**
542 * test that get functioning does filtering.
543 */
544 public function testGetFilter() {
545 $params = array(
546 'source_contact_id' => $this->_contactID,
547 'subject' => 'Make-it-Happen Meeting',
548 'activity_date_time' => '20110316',
549 'duration' => 120,
550 'location' => 'Pennsylvania',
551 'details' => 'a test activity',
552 'status_id' => 1,
553 'activity_name' => 'Test activity type',
554 'priority_id' => 1,
555 );
556 $result = $this->callAPISuccess('Activity', 'Create', $params);
557 $this->callAPISuccess('Activity', 'Get', array('subject' => 'Make-it-Happen Meeting'));
558 $this->assertEquals(1, $result['count']);
559 $this->assertEquals('Make-it-Happen Meeting', $result['values'][$result['id']]['subject']);
560 $this->callAPISuccess('Activity', 'Delete', array('id' => $result['id']));
561 }
562
563
564 /**
565 * Test civicrm_activity_get() with filter target_contact_id
566 */
567 public function testActivityGetTargetFilter() {
568 $params = $this->_params;
569 $contact1Params = array(
570 'first_name' => 'John',
571 'middle_name' => 'J.',
572 'last_name' => 'Anderson',
573 'prefix_id' => 3,
574 'suffix_id' => 3,
575 'email' => 'john_anderson@civicrm.org',
576 'contact_type' => 'Individual',
577 );
578
579 $contact1 = $this->individualCreate($contact1Params);
580 $contact2Params = array(
581 'first_name' => 'Michal',
582 'middle_name' => 'J.',
583 'last_name' => 'Anderson',
584 'prefix_id' => 3,
585 'suffix_id' => 3,
586 'email' => 'michal_anderson@civicrm.org',
587 'contact_type' => 'Individual',
588 );
589
590 $contact2 = $this->individualCreate($contact2Params);
591
592 $params['assignee_contact_id'] = array($contact1, $contact2);
593 $params['target_contact_id'] = array($contact2 => $contact2);
594 $activity = $this->callAPISuccess('Activity', 'Create', $params);
595
596 $activityget = $this->callAPISuccess('Activity', 'get', array(
597 'id' => $activity['id'],
598 'target_contact_id' => $contact2,
599 'return.target_contact_id' => 1,
600 ));
601 $this->assertEquals($activity['id'], $activityget['id'], 'In line ' . __LINE__);
602 $this->assertEquals($contact2, $activityget['values'][$activityget['id']]['target_contact_id'][0], 'In line ' . __LINE__);
603
604 $activityget = $this->callAPISuccess('activity', 'get', array(
605 'target_contact_id' => $this->_contactID,
606 'return.target_contact_id' => 1,
607 'id' => $activity['id'],
608 ));
609 if ($activityget['count'] > 0) {
610 $this->assertNotEquals($contact2, $activityget['values'][$activityget['id']]['target_contact_id'][0], 'In line ' . __LINE__);
611 }
612 }
613
614 /**
615 * test that get functioning does filtering.
616 */
617 public function testGetStatusID() {
618 $params = array(
619 'source_contact_id' => $this->_contactID,
620 'subject' => 'Make-it-Happen Meeting',
621 'activity_date_time' => '20110316',
622 'duration' => 120,
623 'location' => 'Pennsylvania',
624 'details' => 'a test activity',
625 'status_id' => 1,
626 'activity_name' => 'Test activity type',
627 'priority_id' => 1,
628 );
629 $this->callAPISuccess('Activity', 'Create', $params);
630 $result = $this->callAPISuccess('Activity', 'Get', array('activity_status_id' => '1'));
631 $this->assertEquals(1, $result['count'], 'one activity of status 1 should exist');
632
633 $result = $this->callAPISuccess('Activity', 'Get', array('status_id' => '1'));
634 $this->assertEquals(1, $result['count'], 'status_id should also work');
635
636 $result = $this->callAPISuccess('Activity', 'Get', array('activity_status_id' => '2'));
637 $this->assertEquals(0, $result['count'], 'No activities of status 1 should exist');
638 $result = $this->callAPISuccess('Activity', 'Get', array(
639 'version' => $this->_apiversion,
640 'status_id' => '2',
641 ));
642 $this->assertEquals(0, $result['count'], 'No activities of status 1 should exist');
643
644 }
645
646 /**
647 * test that get functioning does filtering.
648 */
649 public function testGetFilterMaxDate() {
650 $params = array(
651 'source_contact_id' => $this->_contactID,
652 'subject' => 'Make-it-Happen Meeting',
653 'activity_date_time' => '20110101',
654 'duration' => 120,
655 'location' => 'Pennsylvania',
656 'details' => 'a test activity',
657 'status_id' => 1,
658 'activity_name' => 'Test activity type',
659 'version' => $this->_apiversion,
660 'priority_id' => 1,
661 );
662 $activityOne = $this->callAPISuccess('Activity', 'Create', $params);
663 $params['activity_date_time'] = 20120216;
664 $activityTwo = $this->callAPISuccess('Activity', 'Create', $params);
665 $result = $this->callAPISuccess('Activity', 'Get', array(
666 'version' => 3,
667 ));
668 $description = "demonstrates _low filter (at time of writing doesn't work if contact_id is set";
669 $subfile = "DateTimeLow";
670 $this->assertEquals(2, $result['count']);
671 $params = array(
672 'version' => 3,
673 'filter.activity_date_time_low' => '20120101000000',
674 'sequential' => 1,
675 );
676 $result = $this->callAPIAndDocument('Activity', 'Get', $params, __FUNCTION__, __FILE__, $description, $subfile);
677 $this->assertEquals(1, $result['count']);
678 $description = "demonstrates _high filter (at time of writing doesn't work if contact_id is set";
679 $subfile = "DateTimeHigh";
680 $this->assertEquals('2012-02-16 00:00:00', $result['values'][0]['activity_date_time']);
681 $params = array(
682 'source_contact_id' => $this->_contactID,
683 'version' => 3,
684 'filter.activity_date_time_high' => '20120101000000',
685 'sequential' => 1,
686 );
687 $result = $this->callAPIAndDocument('Activity', 'Get', $params, __FUNCTION__, __FILE__, $description, $subfile);
688
689 $this->assertEquals(1, $result['count']);
690 $this->assertEquals('2011-01-01 00:00:00', $result['values'][0]['activity_date_time']);
691
692 $this->callAPISuccess('Activity', 'Delete', array('version' => 3, 'id' => $activityOne['id']));
693 $this->callAPISuccess('Activity', 'Delete', array('version' => 3, 'id' => $activityTwo['id']));
694 }
695
696 /**
697 * Test civicrm_activity_get() with a good activity ID which
698 * has associated custom data
699 */
700 public function testActivityGetGoodIDCustom() {
701 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, __FILE__);
702
703 $params = $this->_params;
704 $params['custom_' . $ids['custom_field_id']] = "custom string";
705
706 $this->callAPISuccess($this->_entity, 'create', $params);
707
708 // Retrieve the test value.
709 $params = array(
710 'activity_type_id' => $this->test_activity_type_value,
711 'sequential' => 1,
712 'return.custom_' . $ids['custom_field_id'] => 1,
713 );
714 $result = $this->callAPIAndDocument('activity', 'get', $params, __FUNCTION__, __FILE__);
715 $this->assertEquals("custom string", $result['values'][0]['custom_' . $ids['custom_field_id']]);
716
717 $this->assertEquals($this->test_activity_type_value, $result['values'][0]['activity_type_id']);
718 $this->assertEquals('test activity type id', $result['values'][0]['subject'], 'In line ' . __LINE__);
719 $this->customFieldDelete($ids['custom_field_id']);
720 $this->customGroupDelete($ids['custom_group_id']);
721 }
722
723 /**
724 * Test civicrm_activity_get() with a good activity ID which
725 * has associated custom data
726 */
727 public function testActivityGetContact_idCustom() {
728 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, __FILE__);
729
730 $params = $this->_params;
731 $params['custom_' . $ids['custom_field_id']] = "custom string";
732
733 $result = $this->callAPISuccess($this->_entity, 'create', $params);
734 // Retrieve the test value
735 $params = array(
736 'contact_id' => $this->_params['source_contact_id'],
737 'activity_type_id' => $this->test_activity_type_value,
738 'sequential' => 1,
739 'return.custom_' . $ids['custom_field_id'] => 1,
740 );
741 $result = $this->callAPIAndDocument('activity', 'get', $params, __FUNCTION__, __FILE__);
742 $this->assertEquals("custom string", $result['values'][0]['custom_' . $ids['custom_field_id']], ' in line ' . __LINE__);
743
744 $this->assertEquals($this->test_activity_type_value, $result['values'][0]['activity_type_id'], 'In line ' . __LINE__);
745 $this->assertEquals('test activity type id', $result['values'][0]['subject'], 'In line ' . __LINE__);
746 $this->assertEquals($result['values'][0]['id'], $result['id']);
747 }
748
749 /**
750 * Check activity deletion with empty params.
751 */
752 public function testDeleteActivityForEmptyParams() {
753 $params = array('version' => $this->_apiversion);
754 $this->callAPIFailure('activity', 'delete', $params);
755 }
756
757 /**
758 * Check activity deletion without activity id.
759 */
760 public function testDeleteActivityWithoutId() {
761 $params = array(
762 'activity_name' => 'Meeting',
763 'version' => $this->_apiversion,
764 );
765 $result = $this->callAPIFailure('activity', 'delete', $params);
766 }
767
768 /**
769 * Check activity deletion without activity type.
770 */
771 public function testDeleteActivityWithoutActivityType() {
772 $params = array('id' => 1);
773 $result = $this->callAPIFailure('activity', 'delete', $params);
774 }
775
776 /**
777 * Check activity deletion with incorrect data.
778 */
779 public function testDeleteActivityWithIncorrectActivityType() {
780 $params = array(
781 'id' => 1,
782 'activity_name' => 'Test Activity',
783 );
784
785 $result = $this->callAPIFailure('activity', 'delete', $params);
786 }
787
788 /**
789 * Check activity deletion with correct data.
790 */
791 public function testDeleteActivity() {
792 $result = $this->callAPISuccess('activity', 'create', $this->_params);
793 $params = array(
794 'id' => $result['id'],
795 'version' => $this->_apiversion,
796 );
797
798 $result = $this->callAPISuccess('activity', 'delete', $params);
799 $this->documentMe($params, $result, __FUNCTION__, __FILE__);
800 }
801
802 /**
803 * Check if required fields are not passed.
804 */
805 public function testActivityUpdateWithoutRequired() {
806 $params = array(
807 'subject' => 'this case should fail',
808 'scheduled_date_time' => date('Ymd'),
809 );
810
811 $result = $this->callAPIFailure('activity', 'create', $params);
812 }
813
814 /**
815 * Test civicrm_activity_update() with non-numeric id
816 */
817 public function testActivityUpdateWithNonNumericId() {
818 $params = array(
819 'id' => 'lets break it',
820 'activity_name' => 'Meeting',
821 'subject' => 'this case should fail',
822 'scheduled_date_time' => date('Ymd'),
823 );
824
825 $result = $this->callAPIFailure('activity', 'create', $params);
826 }
827
828 /**
829 * Check with incorrect required fields.
830 */
831 public function testActivityUpdateWithIncorrectContactActivityType() {
832 $params = array(
833 'id' => 1,
834 'activity_name' => 'Test Activity',
835 'subject' => 'this case should fail',
836 'scheduled_date_time' => date('Ymd'),
837 'source_contact_id' => $this->_contactID,
838 );
839
840 $result = $this->callAPIFailure('activity', 'create', $params,
841 'Invalid Activity Id');
842 }
843
844 /**
845 * Test civicrm_activity_update() to update an existing activity
846 */
847 public function testActivityUpdate() {
848 $result = $this->callAPISuccess('activity', 'create', $this->_params);
849
850 $params = array(
851 'id' => $result['id'],
852 'subject' => 'Make-it-Happen Meeting',
853 'activity_date_time' => '20091011123456',
854 'duration' => 120,
855 'location' => '21, Park Avenue',
856 'details' => 'Lets update Meeting',
857 'status_id' => 1,
858 'source_contact_id' => $this->_contactID,
859 'priority_id' => 1,
860 );
861
862 $result = $this->callAPISuccess('activity', 'create', $params);
863 //hack on date comparison - really we should make getAndCheck smarter to handle dates
864 $params['activity_date_time'] = '2009-10-11 12:34:56';
865 // we also unset source_contact_id since it is stored in an aux table
866 unset($params['source_contact_id']);
867 $this->getAndCheck($params, $result['id'], 'activity');
868 }
869
870 /**
871 * Test civicrm_activity_update() with valid parameters
872 * and some custom data
873 */
874 public function testActivityUpdateCustom() {
875 $ids = $this->entityCustomGroupWithSingleFieldCreate(__FUNCTION__, __FILE__);
876
877 $params = $this->_params;
878
879 // Create an activity with custom data
880 //this has been updated from the previous 'old format' function - need to make it work
881 $params = array(
882 'source_contact_id' => $this->_contactID,
883 'subject' => 'Make-it-Happen Meeting',
884 'activity_date_time' => '2009-10-18',
885 'duration' => 120,
886 'location' => 'Pennsylvania',
887 'details' => 'a test activity to check the update api',
888 'status_id' => 1,
889 'activity_name' => 'Test activity type',
890 'version' => $this->_apiversion,
891 'custom_' . $ids['custom_field_id'] => 'custom string',
892 );
893 $result = $this->callAPISuccess('activity', 'create', $params);
894
895 $activityId = $result['id'];
896 $result = $this->callAPISuccess($this->_entity, 'get', array(
897 'return.custom_' . $ids['custom_field_id'] => 1,
898 'version' => 3,
899 'id' => $result['id'],
900 ));
901 $this->assertEquals("custom string", $result['values'][$result['id']]['custom_' . $ids['custom_field_id']]);
902 $this->assertEquals("2009-10-18 00:00:00", $result['values'][$result['id']]['activity_date_time']);
903 $fields = $this->callAPISuccess('activity', 'getfields', array('version' => $this->_apiversion));
904 $this->assertTrue(is_array($fields['values']['custom_' . $ids['custom_field_id']]));
905
906 // Update the activity with custom data.
907 $params = array(
908 'id' => $activityId,
909 'source_contact_id' => $this->_contactID,
910 'subject' => 'Make-it-Happen Meeting',
911 'status_id' => 1,
912 'activity_name' => 'Test activity type',
913 // add this since dates are messed up
914 'activity_date_time' => date('Ymd'),
915 'custom_' . $ids['custom_field_id'] => 'Updated my test data',
916 'version' => $this->_apiversion,
917 );
918 $result = $this->callAPISuccess('Activity', 'Create', $params);
919
920 $result = $this->callAPISuccess($this->_entity, 'get', array(
921 'return.custom_' . $ids['custom_field_id'] => 1,
922 'version' => 3,
923 'id' => $result['id'],
924 ));
925 $this->assertEquals("Updated my test data", $result['values'][$result['id']]['custom_' . $ids['custom_field_id']]);
926 }
927
928 /**
929 * Test civicrm_activity_update() for core activity fields
930 * and some custom data
931 */
932 public function testActivityUpdateCheckCoreFields() {
933 $params = $this->_params;
934 $contact1Params = array(
935 'first_name' => 'John',
936 'middle_name' => 'J.',
937 'last_name' => 'Anderson',
938 'prefix_id' => 3,
939 'suffix_id' => 3,
940 'email' => 'john_anderson@civicrm.org',
941 'contact_type' => 'Individual',
942 );
943
944 $contact1 = $this->individualCreate($contact1Params);
945 $contact2Params = array(
946 'first_name' => 'Michal',
947 'middle_name' => 'J.',
948 'last_name' => 'Anderson',
949 'prefix_id' => 3,
950 'suffix_id' => 3,
951 'email' => 'michal_anderson@civicrm.org',
952 'contact_type' => 'Individual',
953 );
954
955 $contact2 = $this->individualCreate($contact2Params);
956
957 $params['assignee_contact_id'] = array($contact1, $contact2);
958 $params['target_contact_id'] = array($contact2 => $contact2);
959 $result = $this->callAPISuccess('Activity', 'Create', $params);
960
961 $activityId = $result['id'];
962 $getParams = array(
963 'return.assignee_contact_id' => 1,
964 'return.target_contact_id' => 1,
965 'version' => $this->_apiversion,
966 'id' => $activityId,
967 );
968 $result = $this->callAPISuccess($this->_entity, 'get', $getParams);
969 $assignee = $result['values'][$result['id']]['assignee_contact_id'];
970 $target = $result['values'][$result['id']]['target_contact_id'];
971 $this->assertEquals(2, count($assignee), ' in line ' . __LINE__);
972 $this->assertEquals(1, count($target), ' in line ' . __LINE__);
973 $this->assertEquals(TRUE, in_array($contact1, $assignee), ' in line ' . __LINE__);
974 $this->assertEquals(TRUE, in_array($contact2, $target), ' in line ' . __LINE__);
975
976 $contact3Params = array(
977 'first_name' => 'Jijo',
978 'middle_name' => 'J.',
979 'last_name' => 'Anderson',
980 'prefix_id' => 3,
981 'suffix_id' => 3,
982 'email' => 'jijo_anderson@civicrm.org',
983 'contact_type' => 'Individual',
984 );
985
986 $contact4Params = array(
987 'first_name' => 'Grant',
988 'middle_name' => 'J.',
989 'last_name' => 'Anderson',
990 'prefix_id' => 3,
991 'suffix_id' => 3,
992 'email' => 'grant_anderson@civicrm.org',
993 'contact_type' => 'Individual',
994 );
995
996 $contact3 = $this->individualCreate($contact3Params);
997 $contact4 = $this->individualCreate($contact4Params);
998
999 $params = array();
1000 $params['id'] = $activityId;
1001 $params['assignee_contact_id'] = array($contact3 => $contact3);
1002 $params['target_contact_id'] = array($contact4 => $contact4);
1003
1004 $result = $this->callAPISuccess('activity', 'create', $params);
1005
1006 $this->assertEquals($activityId, $result['id'], ' in line ' . __LINE__);
1007
1008 $result = $this->callAPISuccess(
1009 $this->_entity,
1010 'get',
1011 array(
1012 'return.assignee_contact_id' => 1,
1013 'return.target_contact_id' => 1,
1014 'return.source_contact_id' => 1,
1015 'id' => $result['id'],
1016 )
1017 );
1018
1019 $assignee = $result['values'][$result['id']]['assignee_contact_id'];
1020 $target = $result['values'][$result['id']]['target_contact_id'];
1021
1022 $this->assertEquals(1, count($assignee), ' in line ' . __LINE__);
1023 $this->assertEquals(1, count($target), ' in line ' . __LINE__);
1024 $this->assertEquals(TRUE, in_array($contact3, $assignee), ' in line ' . __LINE__);
1025 $this->assertEquals(TRUE, in_array($contact4, $target), ' in line ' . __LINE__);
1026
1027 foreach ($this->_params as $fld => $val) {
1028 $this->assertEquals($val, $result['values'][$result['id']][$fld]);
1029 }
1030 }
1031
1032 /**
1033 * Test civicrm_activity_update() where the DB has a date_time
1034 * value and there is none in the update params.
1035 */
1036 public function testActivityUpdateNotDate() {
1037 $result = $this->callAPISuccess('activity', 'create', $this->_params);
1038
1039 $params = array(
1040 'id' => $result['id'],
1041 'subject' => 'Make-it-Happen Meeting',
1042 'duration' => 120,
1043 'location' => '21, Park Avenue',
1044 'details' => 'Lets update Meeting',
1045 'status_id' => 1,
1046 'source_contact_id' => $this->_contactID,
1047 'priority_id' => 1,
1048 );
1049
1050 $result = $this->callAPISuccess('activity', 'create', $params);
1051 //hack on date comparison - really we should make getAndCheck smarter to handle dates
1052 $params['activity_date_time'] = $this->_params['activity_date_time'];
1053 // we also unset source_contact_id since it is stored in an aux table
1054 unset($params['source_contact_id']);
1055 $this->getAndCheck($params, $result['id'], 'activity');
1056 }
1057
1058 /**
1059 * Check activity update with status.
1060 */
1061 public function testActivityUpdateWithStatus() {
1062 $activity = $this->callAPISuccess('activity', 'create', $this->_params);
1063 $params = array(
1064 'id' => $activity['id'],
1065 'source_contact_id' => $this->_contactID,
1066 'subject' => 'Hurry update works',
1067 'status_id' => 1,
1068 'activity_name' => 'Test activity type',
1069 );
1070
1071 $result = $this->callAPISuccess('activity', 'create', $params);
1072 $this->assertEquals($result['id'], $activity['id']);
1073 $this->assertEquals($result['values'][$activity['id']]['subject'], 'Hurry update works');
1074 $this->assertEquals($result['values'][$activity['id']]['status_id'], 1
1075 );
1076 }
1077
1078 /**
1079 * Test civicrm_activity_update() where the source_contact_id
1080 * is not in the update params.
1081 */
1082 public function testActivityUpdateKeepSource() {
1083 $activity = $this->callAPISuccess('activity', 'create', $this->_params);
1084 // Updating the activity but not providing anything for the source contact
1085 // (It was set as $this->_contactID earlier.)
1086 $params = array(
1087 'id' => $activity['id'],
1088 'subject' => 'Updated Make-it-Happen Meeting',
1089 'duration' => 120,
1090 'location' => '21, Park Avenue',
1091 'details' => 'Lets update Meeting',
1092 'status_id' => 1,
1093 'activity_name' => 'Test activity type',
1094 'priority_id' => 1,
1095 );
1096
1097 $result = $this->callAPISuccess('activity', 'create', $params);
1098 $findactivity = $this->callAPISuccess('Activity', 'Get', array('id' => $activity['id']));
1099 }
1100
1101 /**
1102 * Test civicrm_activities_contact_get()
1103 */
1104 public function testActivitiesContactGet() {
1105 $activity = $this->callAPISuccess('activity', 'create', $this->_params);
1106 $activity2 = $this->callAPISuccess('activity', 'create', $this->_params2);
1107 // Get activities associated with contact $this->_contactID.
1108 $params = array(
1109 'contact_id' => $this->_contactID,
1110 );
1111 $result = $this->callAPISuccess('activity', 'get', $params);
1112
1113 $this->assertEquals(2, $result['count'], 'In line ' . __LINE__);
1114 $this->assertEquals($this->test_activity_type_value, $result['values'][$activity['id']]['activity_type_id']);
1115 $this->assertEquals('Test activity type', $result['values'][$activity['id']]['activity_name']);
1116 $this->assertEquals('Test activity type', $result['values'][$activity2['id']]['activity_name']);
1117 }
1118
1119 /**
1120 * Test chained Activity format.
1121 */
1122 public function testChainedActivityGet() {
1123
1124 $activity = $this->callAPISuccess('Contact', 'Create', array(
1125 'display_name' => "bob brown",
1126 'contact_type' => 'Individual',
1127 'api.activity_type.create' => array(
1128 'weight' => '2',
1129 'label' => 'send out letters',
1130 'filter' => 0,
1131 'is_active' => 1,
1132 'is_optgroup' => 1,
1133 'is_default' => 0,
1134 ),
1135 'api.activity.create' => array(
1136 'subject' => 'send letter',
1137 'activity_type_id' => '$value.api.activity_type.create.values.0.value',
1138 ),
1139 ));
1140
1141 $result = $this->callAPISuccess('Activity', 'Get', array(
1142 'id' => $activity['id'],
1143 'return.assignee_contact_id' => 1,
1144 'api.contact.get' => array('api.pledge.get' => 1),
1145 ));
1146 }
1147
1148 /**
1149 * Test civicrm_activity_contact_get() with invalid Contact ID.
1150 */
1151 public function testActivitiesContactGetWithInvalidContactId() {
1152 $params = array('contact_id' => 'contact');
1153 $this->callAPIFailure('activity', 'get', $params);
1154 }
1155
1156 /**
1157 * Test civicrm_activity_contact_get() with contact having no Activity.
1158 */
1159 public function testActivitiesContactGetHavingNoActivity() {
1160 $params = array(
1161 'first_name' => 'dan',
1162 'last_name' => 'conberg',
1163 'email' => 'dan.conberg@w.co.in',
1164 'contact_type' => 'Individual',
1165 );
1166
1167 $contact = $this->callAPISuccess('contact', 'create', $params);
1168 $params = array(
1169 'contact_id' => $contact['id'],
1170 );
1171 $result = $this->callAPISuccess('activity', 'get', $params);
1172 $this->assertEquals($result['count'], 0);
1173 }
1174
1175 /**
1176 * Test getfields function.
1177 */
1178 public function testGetFields() {
1179 $params = array('action' => 'create');
1180 $result = $this->callAPIAndDocument('activity', 'getfields', $params, __FUNCTION__, __FILE__, NULL, NULL, 'getfields');
1181 $this->assertTrue(is_array($result['values']), 'get fields doesn\'t return values array');
1182 foreach ($result['values'] as $key => $value) {
1183 $this->assertTrue(is_array($value), $key . " is not an array");
1184 }
1185 }
1186
1187 }