Merge pull request #10876 from mlutfy/master-crm20468
[civicrm-core.git] / tests / phpunit / CRM / Activity / BAO / ActivityTest.php
1 <?php
2
3 /**
4 * Class CRM_Activity_BAO_ActivityTest
5 * @group headless
6 */
7 class CRM_Activity_BAO_ActivityTest extends CiviUnitTestCase {
8 public function setUp() {
9 parent::setUp();
10 $this->prepareForACLs();
11 CRM_Core_Config::singleton()->userPermissionClass->permissions = array('view all contacts', 'access CiviCRM');
12 }
13
14 /**
15 * Clean up after tests.
16 */
17 public function tearDown() {
18 $tablesToTruncate = array(
19 'civicrm_activity',
20 'civicrm_activity_contact',
21 'civicrm_uf_match',
22 'civicrm_campaign',
23 'civicrm_email',
24 );
25 $this->quickCleanup($tablesToTruncate);
26 $this->cleanUpAfterACLs();
27 parent::tearDown();
28 }
29
30 /**
31 * Test case for create() method.
32 */
33 public function testCreate() {
34 $contactId = $this->individualCreate();
35
36 $params = array(
37 'source_contact_id' => $contactId,
38 'subject' => 'Scheduling Meeting',
39 'activity_type_id' => 2,
40 );
41
42 CRM_Activity_BAO_Activity::create($params);
43
44 $activityId = $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
45 'subject', 'Database check for created activity.'
46 );
47
48 // Now call create() to modify an existing Activity.
49 $params = array(
50 'id' => $activityId,
51 'source_contact_id' => $contactId,
52 'subject' => 'Scheduling Interview',
53 'activity_type_id' => 3,
54 );
55
56 CRM_Activity_BAO_Activity::create($params);
57
58 $activityTypeId = $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Interview',
59 'activity_type_id',
60 'subject', 'Database check on updated activity record.'
61 );
62 $this->assertEquals($activityTypeId, 3, 'Verify activity type id is 3.');
63
64 $this->contactDelete($contactId);
65 }
66
67 /**
68 * Test case for getContactActivity() method.
69 *
70 * getContactActivity() method get activities detail for given target contact id.
71 */
72 public function testGetContactActivity() {
73 $contactId = $this->individualCreate();
74 $params = array(
75 'first_name' => 'liz',
76 'last_name' => 'hurleey',
77 );
78 $targetContactId = $this->individualCreate($params);
79
80 $params = array(
81 'source_contact_id' => $contactId,
82 'subject' => 'Scheduling Meeting',
83 'activity_type_id' => 2,
84 'target_contact_id' => array($targetContactId),
85 'activity_date_time' => date('Ymd'),
86 );
87
88 $this->callAPISuccess('Activity', 'create', $params);
89
90 $activityId = $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting',
91 'id',
92 'subject', 'Database check for created activity.'
93 );
94
95 // @todo - remove this deprecated functions
96 $activities = CRM_Activity_BAO_Activity::getContactActivity($targetContactId);
97
98 $this->assertEquals($activities[$activityId]['subject'], 'Scheduling Meeting', 'Verify activity subject is correct.');
99
100 $this->contactDelete($contactId);
101 $this->contactDelete($targetContactId);
102 }
103
104 /**
105 * Test case for retrieve() method.
106 *
107 * Retrieve($params, $defaults) method return activity detail for given params
108 * and set defaults.
109 */
110 public function testRetrieve() {
111 $contactId = $this->individualCreate();
112 $params = array(
113 'first_name' => 'liz',
114 'last_name' => 'hurleey',
115 );
116 $targetContactId = $this->individualCreate($params);
117
118 $params = array(
119 'source_contact_id' => $contactId,
120 'subject' => 'Scheduling Meeting',
121 'activity_type_id' => 2,
122 'target_contact_id' => array($targetContactId),
123 'activity_date_time' => date('Ymd'),
124 );
125
126 CRM_Activity_BAO_Activity::create($params);
127
128 $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
129 'subject', 'Database check for created activity.'
130 );
131
132 $this->assertDBNotNull('CRM_Activity_DAO_ActivityContact', $targetContactId,
133 'id', 'contact_id',
134 'Database check for created activity target.'
135 );
136
137 $defaults = array();
138 $activity = CRM_Activity_BAO_Activity::retrieve($params, $defaults);
139
140 $this->assertEquals($activity->subject, 'Scheduling Meeting', 'Verify activity subject is correct.');
141 $this->assertEquals($activity->activity_type_id, 2, 'Verify activity type id is correct.');
142 $this->assertEquals($defaults['source_contact_id'], $contactId, 'Verify source contact id is correct.');
143
144 $this->assertEquals($defaults['subject'], 'Scheduling Meeting', 'Verify activity subject is correct.');
145 $this->assertEquals($defaults['activity_type_id'], 2, 'Verify activity type id is correct.');
146
147 $this->assertEquals($defaults['target_contact'][0], $targetContactId, 'Verify target contact id is correct.');
148
149 $this->contactDelete($contactId);
150 $this->contactDelete($targetContactId);
151 }
152
153 /**
154 * Test case for deleteActivity() method.
155 *
156 * deleteActivity($params) method deletes activity for given params.
157 */
158 public function testDeleteActivity() {
159 $contactId = $this->individualCreate();
160 $params = array(
161 'first_name' => 'liz',
162 'last_name' => 'hurleey',
163 );
164 $targetContactId = $this->individualCreate($params);
165
166 $params = array(
167 'source_contact_id' => $contactId,
168 'source_record_id' => $contactId,
169 'subject' => 'Scheduling Meeting',
170 'activity_type_id' => 2,
171 'target_contact_id' => array($targetContactId),
172 'activity_date_time' => date('Ymd'),
173 );
174
175 CRM_Activity_BAO_Activity::create($params);
176
177 $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
178 'subject', 'Database check for created activity.'
179 );
180
181 $this->assertDBNotNull('CRM_Activity_DAO_ActivityContact', $targetContactId,
182 'id', 'contact_id',
183 'Database check for created activity target.'
184 );
185 $params = array(
186 'source_contact_id' => $contactId,
187 'source_record_id' => $contactId,
188 'subject' => 'Scheduling Meeting',
189 'activity_type_id' => 2,
190 );
191
192 CRM_Activity_BAO_Activity::deleteActivity($params);
193
194 $this->assertDBNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
195 'subject', 'Database check for deleted activity.'
196 );
197 $this->contactDelete($contactId);
198 $this->contactDelete($targetContactId);
199 }
200
201 /**
202 * Test case for deleteActivityTarget() method.
203 *
204 * deleteActivityTarget($activityId) method deletes activity target for given activity id.
205 */
206 public function testDeleteActivityTarget() {
207 $contactId = $this->individualCreate();
208 $params = array(
209 'first_name' => 'liz',
210 'last_name' => 'hurleey',
211 );
212 $targetContactId = $this->individualCreate($params);
213
214 $params = array(
215 'source_contact_id' => $contactId,
216 'subject' => 'Scheduling Meeting',
217 'activity_type_id' => 2,
218 'target_contact_id' => array($targetContactId),
219 'activity_date_time' => date('Ymd'),
220 );
221
222 CRM_Activity_BAO_Activity::create($params);
223
224 $activityId = $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
225 'subject', 'Database check for created activity.'
226 );
227
228 $this->assertDBNotNull('CRM_Activity_DAO_ActivityContact', $targetContactId,
229 'id', 'contact_id',
230 'Database check for created activity target.'
231 );
232
233 CRM_Activity_BAO_Activity::deleteActivityContact($activityId, 3);
234
235 $this->assertDBNull('CRM_Activity_DAO_ActivityContact', $targetContactId, 'id',
236 'contact_id', 'Database check for deleted activity target.'
237 );
238
239 $this->contactDelete($contactId);
240 $this->contactDelete($targetContactId);
241 }
242
243 /**
244 * Test case for deleteActivityAssignment() method.
245 *
246 * deleteActivityAssignment($activityId) method deletes activity assignment for given activity id.
247 */
248 public function testDeleteActivityAssignment() {
249 $contactId = $this->individualCreate();
250 $params = array(
251 'first_name' => 'liz',
252 'last_name' => 'hurleey',
253 );
254 $assigneeContactId = $this->individualCreate($params);
255
256 $params = array(
257 'source_contact_id' => $contactId,
258 'subject' => 'Scheduling Meeting',
259 'activity_type_id' => 2,
260 'assignee_contact_id' => array($assigneeContactId),
261 'activity_date_time' => date('Ymd'),
262 );
263
264 CRM_Activity_BAO_Activity::create($params);
265
266 $activityId = $this->assertDBNotNull('CRM_Activity_DAO_Activity', 'Scheduling Meeting', 'id',
267 'subject', 'Database check for created activity.'
268 );
269
270 $this->assertDBNotNull('CRM_Activity_DAO_ActivityContact',
271 $assigneeContactId, 'id', 'contact_id',
272 'Database check for created activity assignment.'
273 );
274
275 CRM_Activity_BAO_Activity::deleteActivityContact($activityId, 1);
276
277 $this->assertDBNull('CRM_Activity_DAO_ActivityContact', $assigneeContactId, 'id',
278 'contact_id', 'Database check for deleted activity assignment.'
279 );
280
281 $this->contactDelete($contactId);
282 $this->contactDelete($assigneeContactId);
283 }
284
285 /**
286 * Test getActivities BAO method for getting count.
287 */
288 public function testGetActivitiesCountForAdminDashboard() {
289 $this->setUpForActivityDashboardTests();
290 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($this->_params);
291 $this->assertEquals(8, $activityCount);
292 $activityCount = CRM_Activity_BAO_Activity::getActivitiesCount($this->_params);
293 $this->assertEquals(8, $activityCount);
294 }
295
296 /**
297 * Test getActivities BAO method for getting count
298 */
299 public function testGetActivitiesCountforNonAdminDashboard() {
300 $op = new PHPUnit_Extensions_Database_Operation_Insert();
301 $op->execute($this->_dbconn,
302 $this->createFlatXMLDataSet(
303 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
304 )
305 );
306
307 $params = array(
308 'contact_id' => 9,
309 'admin' => FALSE,
310 'caseId' => NULL,
311 'context' => 'home',
312 'activity_type_id' => NULL,
313 'offset' => 0,
314 'rowCount' => 0,
315 'sort' => NULL,
316 );
317
318 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($params);
319
320 //since we are loading activities from dataset, we know total number of activities for this contact
321 // 5 activities ( 2 scheduled, 3 Completed ), note that dashboard shows only scheduled activities
322 $count = 2;
323 $this->assertEquals($count, $activityCount);
324 $this->assertEquals(2, CRM_Activity_BAO_Activity::getActivitiesCount($params));
325 }
326
327 /**
328 * Test getActivities BAO method for getting count
329 */
330 public function testGetActivitiesCountforContactSummary() {
331 $op = new PHPUnit_Extensions_Database_Operation_Insert();
332 $op->execute($this->_dbconn,
333 $this->createFlatXMLDataSet(
334 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
335 )
336 );
337
338 $params = array(
339 'contact_id' => 9,
340 'admin' => FALSE,
341 'caseId' => NULL,
342 'context' => 'activity',
343 'activity_type_id' => NULL,
344 'offset' => 0,
345 'rowCount' => 0,
346 'sort' => NULL,
347 );
348 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($params);
349
350 //since we are loading activities from dataset, we know total number of activities for this contact
351 // 5 activities, Contact Summary should show all activities
352 $count = 5;
353 $this->assertEquals($count, $activityCount);
354 $this->assertEquals(5, CRM_Activity_BAO_Activity::getActivitiesCount($params));
355 }
356
357 /**
358 * CRM-18706 - Test Include/Exclude Activity Filters
359 */
360 public function testActivityFilters() {
361 $op = new PHPUnit_Extensions_Database_Operation_Insert();
362 $op->execute($this->_dbconn,
363 $this->createFlatXMLDataSet(
364 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
365 )
366 );
367 Civi::settings()->set('preserve_activity_tab_filter', 1);
368 $this->createLoggedInUser();
369
370 global $_GET;
371 $_GET = array(
372 'cid' => 9,
373 'context' => 'activity',
374 'activity_type_id' => 1,
375 'is_unit_test' => 1,
376 );
377 $expectedFilters = array(
378 'activity_type_filter_id' => 1,
379 'activity_type_exclude_filter_id' => '',
380 );
381
382 list($activities, $activityFilter) = CRM_Activity_Page_AJAX::getContactActivity();
383 //Assert whether filters are correctly set.
384 $this->checkArrayEquals($expectedFilters, $activityFilter);
385 // This should include activities of type Meeting only.
386 foreach ($activities['data'] as $value) {
387 $this->assertContains('Meeting', $value['activity_type']);
388 }
389 unset($_GET['activity_type_id']);
390 $expectedFilters['activity_type_filter_id'] = '';
391
392 $_GET['activity_type_exclude_id'] = $expectedFilters['activity_type_exclude_filter_id'] = 1;
393 list($activities, $activityFilter) = CRM_Activity_Page_AJAX::getContactActivity();
394 $this->checkArrayEquals($expectedFilters, $activityFilter);
395 // None of the activities should be of type Meeting.
396 foreach ($activities['data'] as $value) {
397 $this->assertNotContains('Meeting', $value['activity_type']);
398 }
399 }
400
401 /**
402 * Test getActivities BAO method for getting count
403 */
404 public function testGetActivitiesCountforContactSummaryWithNoActivities() {
405 $op = new PHPUnit_Extensions_Database_Operation_Insert();
406 $op->execute($this->_dbconn,
407 $this->createFlatXMLDataSet(
408 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
409 )
410 );
411
412 $params = array(
413 'contact_id' => 17,
414 'admin' => FALSE,
415 'caseId' => NULL,
416 'context' => 'home',
417 'activity_type_id' => NULL,
418 'offset' => 0,
419 'rowCount' => 0,
420 'sort' => NULL,
421 );
422 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($params);
423
424 //since we are loading activities from dataset, we know total number of activities for this contact
425 // this contact does not have any activity
426 $this->assertEquals(0, $activityCount);
427 $this->assertEquals(0, CRM_Activity_BAO_Activity::getActivitiesCount($params));
428 }
429
430 /**
431 * Test getActivities BAO method.
432 */
433 public function testGetActivitiesForAdminDashboard() {
434 $this->setUpForActivityDashboardTests();
435 $activitiesDeprecatedFn = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
436 $activitiesNew = CRM_Activity_BAO_Activity::getActivities($this->_params);
437 // $this->assertEquals($activities, $activitiesDeprecatedFn);
438
439 //since we are loading activities from dataset, we know total number of activities
440 // with no contact ID and there should be 8 schedule activities shown on dashboard
441 $count = 8;
442 foreach (array($activitiesNew, $activitiesDeprecatedFn) as $activities) {
443 $this->assertEquals($count, count($activities));
444
445 foreach ($activities as $key => $value) {
446 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
447 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
448 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
449 }
450 }
451 }
452
453 /**
454 * Test getActivities BAO method.
455 */
456 public function testGetActivitiesForAdminDashboardNoViewContacts() {
457 CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
458 $this->setUpForActivityDashboardTests();
459 $activitiesDeprecated = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
460 foreach (array($activitiesDeprecated, CRM_Activity_BAO_Activity::getActivities($this->_params)) as $activities) {
461 // Skipped until we get back to the upgraded version properly.
462 //$this->assertEquals(0, count($activities));
463 }
464 }
465
466 /**
467 * Test getActivities BAO method.
468 */
469 public function testGetActivitiesForAdminDashboardAclLimitedViewContacts() {
470 CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
471 $this->allowedContacts = array(1, 3, 4, 5);
472 $this->hookClass->setHook('civicrm_aclWhereClause', array($this, 'aclWhereMultipleContacts'));
473 $this->setUpForActivityDashboardTests();
474 $activitiesDeprecated = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
475 foreach (array($activitiesDeprecated, CRM_Activity_BAO_Activity::getActivities($this->_params)) as $activities) {
476 //$this->assertEquals(1, count($activities));
477 }
478
479 }
480
481 /**
482 * Test getActivities BAO method.
483 */
484 public function testGetActivitiesforNonAdminDashboard() {
485 $op = new PHPUnit_Extensions_Database_Operation_Insert();
486 $op->execute($this->_dbconn,
487 $this->createFlatXMLDataSet(
488 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
489 )
490 );
491
492 $contactID = 9;
493 $params = array(
494 'contact_id' => $contactID,
495 'admin' => FALSE,
496 'caseId' => NULL,
497 'context' => 'home',
498 'activity_type_id' => NULL,
499 'offset' => 0,
500 'rowCount' => 0,
501 'sort' => NULL,
502 );
503 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
504
505 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
506 //since we are loading activities from dataset, we know total number of activities for this contact
507 // 5 activities ( 2 scheduled, 3 Completed ), note that dashboard shows only scheduled activities
508 $count = 2;
509 $this->assertEquals($count, count($activities));
510
511 foreach ($activities as $key => $value) {
512 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
513 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
514 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
515
516 if ($key == 3) {
517 $this->assertArrayHasKey($contactID, $value['target_contact_name']);
518 }
519 elseif ($key == 4) {
520 $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
521 }
522 }
523 }
524 }
525
526 /**
527 * Test target contact count.
528 */
529 public function testTargetCountforContactSummary() {
530 $targetCount = 5;
531 $contactId = $this->individualCreate();
532 $targetContactIDs = array();
533 for ($i = 0; $i < $targetCount; $i++) {
534 $targetContactIDs[] = $this->individualCreate(array(), $i);
535 }
536 // Create activities with 5 target contacts.
537 $activityParams = array(
538 'source_contact_id' => $contactId,
539 'target_contact_id' => $targetContactIDs,
540 );
541 $this->activityCreate($activityParams);
542
543 $params = array(
544 'contact_id' => $contactId,
545 'context' => 'activity',
546 );
547 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
548 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
549 //verify target count
550 $this->assertEquals($targetCount, $activities[1]['target_contact_counter']);
551 }
552
553 }
554
555 /**
556 * Test getActivities BAO method.
557 */
558 public function testGetActivitiesforContactSummary() {
559 $op = new PHPUnit_Extensions_Database_Operation_Insert();
560 $op->execute($this->_dbconn,
561 $this->createFlatXMLDataSet(
562 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
563 )
564 );
565
566 $contactID = 9;
567 $params = array(
568 'contact_id' => $contactID,
569 'admin' => FALSE,
570 'caseId' => NULL,
571 'context' => 'activity',
572 'activity_type_id' => NULL,
573 'offset' => 0,
574 'rowCount' => 0,
575 'sort' => NULL,
576 );
577 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
578
579 //since we are loading activities from dataset, we know total number of activities for this contact
580 // 5 activities, Contact Summary should show all activities
581 $count = 5;
582 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
583
584 $this->assertEquals($count, count($activities));
585
586 foreach ($activities as $key => $value) {
587 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
588
589 if ($key > 8) {
590 $this->assertEquals($value['status_id'], 2, 'Verify all activities are scheduled.');
591 }
592 else {
593 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
594 }
595
596 if ($key > 8) {
597 $this->assertEquals($value['activity_type_id'], 1, 'Verify activity type is correct.');
598 }
599 else {
600 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
601 }
602
603 if ($key == 3) {
604 $this->assertArrayHasKey($contactID, $value['target_contact_name']);
605 }
606 elseif ($key == 4) {
607 $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
608 }
609 }
610 }
611 }
612
613 /**
614 * Test getActivities BAO method.
615 */
616 public function testGetActivitiesforContactSummaryWithActivities() {
617 $op = new PHPUnit_Extensions_Database_Operation_Insert();
618 $op->execute($this->_dbconn,
619 $this->createFlatXMLDataSet(
620 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
621 )
622 );
623
624 // parameters for different test cases, check each array key for the specific test-case
625 $testCases = array(
626 'with-no-activity' => array(
627 'params' => array(
628 'contact_id' => 17,
629 'admin' => FALSE,
630 'caseId' => NULL,
631 'context' => 'home',
632 'activity_type_id' => NULL,
633 'offset' => 0,
634 'rowCount' => 0,
635 'sort' => NULL,
636 ),
637 ),
638 'with-activity' => array(
639 'params' => array(
640 'contact_id' => 1,
641 'admin' => FALSE,
642 'caseId' => NULL,
643 'context' => 'home',
644 'activity_type_id' => NULL,
645 'offset' => 0,
646 'rowCount' => 0,
647 'sort' => NULL,
648 ),
649 ),
650 'with-activity_type' => array(
651 'params' => array(
652 'contact_id' => 3,
653 'admin' => FALSE,
654 'caseId' => NULL,
655 'context' => 'home',
656 'activity_type_id' => 2,
657 'offset' => 0,
658 'rowCount' => 0,
659 'sort' => NULL,
660 ),
661 ),
662 'exclude-all-activity_type' => array(
663 'params' => array(
664 'contact_id' => 3,
665 'admin' => FALSE,
666 'caseId' => NULL,
667 'context' => 'home',
668 'activity_type_exclude_id' => array(1, 2),
669 'offset' => 0,
670 'rowCount' => 0,
671 'sort' => NULL,
672 ),
673 ),
674 'sort-by-subject' => array(
675 'params' => array(
676 'contact_id' => 1,
677 'admin' => FALSE,
678 'caseId' => NULL,
679 'context' => 'home',
680 'activity_type_id' => NULL,
681 'offset' => 0,
682 'rowCount' => 0,
683 'sort' => 'subject DESC',
684 ),
685 ),
686 );
687
688 foreach ($testCases as $caseName => $testCase) {
689 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($testCase['params']);
690 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($testCase['params']);
691 $activitiesNew = CRM_Activity_BAO_Activity::getActivities($testCase['params']);
692
693 foreach (array($activitiesDep, $activitiesNew) as $activities) {
694 //$this->assertEquals($activityCount, CRM_Activity_BAO_Activity::getActivitiesCount($testCase['params']));
695 if ($caseName == 'with-no-activity') {
696 $this->assertEquals(0, count($activities));
697 $this->assertEquals(0, $activityCount);
698 }
699 elseif ($caseName == 'with-activity') {
700 // contact id 1 is assigned as source, target and assignee for activity id 1, 7 and 8 respectively
701 $this->assertEquals(3, count($activities));
702 $this->assertEquals(3, $activityCount);
703 $this->assertEquals(1, $activities[1]['source_contact_id']);
704 // @todo - this is a discrepancy between old & new - review.
705 //$this->assertEquals(TRUE, array_key_exists(1, $activities[7]['target_contact_name']));
706 $this->assertEquals(TRUE, array_key_exists(1, $activities[8]['assignee_contact_name']));
707 }
708 elseif ($caseName == 'with-activity_type') {
709 // contact id 3 for activity type 2 is assigned as assignee, source and target for
710 // activity id 1, 3 and 8 respectively
711 $this->assertEquals(3, count($activities));
712 $this->assertEquals(3, $activityCount);
713 // ensure activity type id is 2
714 $this->assertEquals(2, $activities[1]['activity_type_id']);
715 $this->assertEquals(3, $activities[3]['source_contact_id']);
716 // @todo review inconsistency between 2 versions.
717 // $this->assertEquals(TRUE, array_key_exists(3, $activities[8]['target_contact_name']));
718 $this->assertEquals(TRUE, array_key_exists(3, $activities[1]['assignee_contact_name']));
719 }
720 if ($caseName == 'exclude-all-activity_type') {
721 $this->assertEquals(0, count($activities));
722 $this->assertEquals(0, $activityCount);
723 }
724 if ($caseName == 'sort-by-subject') {
725 $this->assertEquals(3, count($activities));
726 $this->assertEquals(3, $activityCount);
727 // activities should be order by 'subject DESC'
728 $subjectOrder = array(
729 'subject 8',
730 'subject 7',
731 'subject 1',
732 );
733 $count = 0;
734 foreach ($activities as $activity) {
735 $this->assertEquals($subjectOrder[$count], $activity['subject']);
736 $count++;
737 }
738 }
739 }
740 }
741 }
742
743 /**
744 * CRM-20793 : Test getActivities by using activity date and status filter
745 */
746 public function testbyActivityDateAndStatus() {
747 $op = new PHPUnit_Extensions_Database_Operation_Insert();
748 $op->execute($this->_dbconn,
749 $this->createFlatXMLDataSet(
750 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
751 )
752 );
753
754 // activity IDs catagorised by date
755 $lastWeekActivities = array(1, 2, 3);
756 $todayActivities = array(4, 5, 6, 7);
757 $lastTwoMonthsActivities = array(8, 9, 10, 11);
758 $lastYearActivties = array(12, 13, 14, 15, 16);
759
760 // date values later used to set activity date value
761 $lastWeekDate = date('YmdHis', strtotime('1 week ago'));
762 $today = date('YmdHis');
763 $lastTwoMonthAgoDate = date('YmdHis', strtotime('2 months ago'));
764 $lastYearDate = date('YmdHis', strtotime('1 year ago'));
765 for ($i = 1; $i <= 16; $i++) {
766 if (in_array($i, $lastWeekActivities)) {
767 $date = $lastWeekDate;
768 }
769 elseif (in_array($i, $lastTwoMonthsActivities)) {
770 $date = $lastTwoMonthAgoDate;
771 }
772 elseif (in_array($i, $lastYearActivties)) {
773 $date = $lastYearDate;
774 }
775 elseif (in_array($i, $todayActivities)) {
776 $date = $today;
777 }
778 $this->callAPISuccess('Activity', 'create', array(
779 'id' => $i,
780 'activity_date_time' => $date,
781 ));
782 }
783
784 // parameters for different test cases, check each array key for the specific test-case
785 $testCases = array(
786 'todays-activity' => array(
787 'params' => array(
788 'contact_id' => 1,
789 'admin' => TRUE,
790 'caseId' => NULL,
791 'context' => 'activity',
792 'activity_date_relative' => 'this.day',
793 'activity_type_id' => NULL,
794 'offset' => 0,
795 'rowCount' => 0,
796 'sort' => NULL,
797 ),
798 ),
799 'todays-activity-filtered-by-range' => array(
800 'params' => array(
801 'contact_id' => 1,
802 'admin' => TRUE,
803 'caseId' => NULL,
804 'context' => 'activity',
805 'activity_date_low' => date('Y/m/d', strtotime('yesterday')),
806 'activity_date_high' => date('Y/m/d'),
807 'activity_type_id' => NULL,
808 'offset' => 0,
809 'rowCount' => 0,
810 'sort' => NULL,
811 ),
812 ),
813 'last-week-activity' => array(
814 'params' => array(
815 'contact_id' => 1,
816 'admin' => TRUE,
817 'caseId' => NULL,
818 'context' => 'activity',
819 'activity_date_relative' => 'previous.week',
820 'activity_type_id' => NULL,
821 'offset' => 0,
822 'rowCount' => 0,
823 'sort' => NULL,
824 ),
825 ),
826 'this-quarter-activity' => array(
827 'params' => array(
828 'contact_id' => 1,
829 'admin' => TRUE,
830 'caseId' => NULL,
831 'context' => 'activity',
832 'activity_date_relative' => 'this.quarter',
833 'activity_type_id' => NULL,
834 'offset' => 0,
835 'rowCount' => 0,
836 'sort' => NULL,
837 ),
838 ),
839 'last-year-activity' => array(
840 'params' => array(
841 'contact_id' => 1,
842 'admin' => TRUE,
843 'caseId' => NULL,
844 'context' => 'activity',
845 'activity_date_relative' => 'previous.year',
846 'activity_type_id' => NULL,
847 'offset' => 0,
848 'rowCount' => 0,
849 'sort' => NULL,
850 ),
851 ),
852 'activity-of-all-statuses' => array(
853 'params' => array(
854 'contact_id' => 1,
855 'admin' => TRUE,
856 'caseId' => NULL,
857 'context' => 'activity',
858 'activity_status_id' => '1,2',
859 'activity_type_id' => NULL,
860 'offset' => 0,
861 'rowCount' => 0,
862 'sort' => NULL,
863 ),
864 ),
865 );
866
867 foreach ($testCases as $caseName => $testCase) {
868 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($testCase['params']);
869 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($testCase['params']);
870 asort($activitiesDep);
871 $activityIDs = array_keys($activitiesDep);
872
873 if ($caseName == 'todays-activity' || $caseName == 'todays-activity-filtered-by-range') {
874 $this->assertEquals(count($todayActivities), $activityCount);
875 $this->assertEquals(count($todayActivities), count($activitiesDep));
876 $this->checkArrayEquals($todayActivities, $activityIDs);
877 }
878 elseif ($caseName == 'last-week-activity') {
879 $this->assertEquals(count($lastWeekActivities), $activityCount);
880 $this->assertEquals(count($lastWeekActivities), count($activitiesDep));
881 $this->checkArrayEquals($lastWeekActivities, $activityIDs);
882 }
883 elseif ($caseName == 'lhis-quarter-activity') {
884 $this->assertEquals(count($lastTwoMonthsActivities), $activityCount);
885 $this->assertEquals(count($lastTwoMonthsActivities), count($activitiesDep));
886 $this->checkArrayEquals($lastTwoMonthsActivities, $activityIDs);
887 }
888 elseif ($caseName == 'last-year-activity') {
889 $this->assertEquals(count($lastYearActivties), $activityCount);
890 $this->assertEquals(count($lastYearActivties), count($activitiesDep));
891 $this->checkArrayEquals($lastYearActivties, $activityIDs);
892 }
893 elseif ($caseName == 'activity-of-all-statuses') {
894 $this->assertEquals(16, $activityCount);
895 $this->assertEquals(16, count($activitiesDep));
896 }
897 }
898 }
899
900 /**
901 * CRM-20308: Test from email address when a 'copy of Activity' event occur
902 */
903 public function testEmailAddressOfActivityCopy() {
904 // Case 1: assert the 'From' Email Address of source Actvity Contact ID
905 // create activity with source contact ID which has email address
906 $assigneeContactId = $this->individualCreate();
907 $sourceContactParams = array(
908 'first_name' => 'liz',
909 'last_name' => 'hurleey',
910 'email' => substr(sha1(rand()), 0, 7) . '@testemail.com',
911 );
912 $sourceContactID = $this->individualCreate($sourceContactParams);
913 $sourceDisplayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $sourceContactID, 'display_name');
914
915 // create an activity using API
916 $params = array(
917 'source_contact_id' => $sourceContactID,
918 'subject' => 'Scheduling Meeting ' . substr(sha1(rand()), 0, 4),
919 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Meeting'),
920 'assignee_contact_id' => array($assigneeContactId),
921 'activity_date_time' => date('Ymd'),
922 );
923 $activity = $this->callAPISuccess('Activity', 'create', $params);
924
925 // Check that from address is in "Source-Display-Name <source-email>"
926 $formAddress = CRM_Case_BAO_Case::getReceiptFrom($activity['id']);
927 $expectedFromAddress = sprintf("%s <%s>", $sourceDisplayName, $sourceContactParams['email']);
928 $this->assertEquals($expectedFromAddress, $formAddress);
929
930 // Case 2: System Default From Address
931 // but first erase the email address of existing source contact ID
932 $withoutEmailParams = array(
933 'email' => '',
934 );
935 $sourceContactID = $this->individualCreate($withoutEmailParams);
936 $params = array(
937 'source_contact_id' => $sourceContactID,
938 'subject' => 'Scheduling Meeting ' . substr(sha1(rand()), 0, 4),
939 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Meeting'),
940 'activity_date_time' => date('Ymd'),
941 );
942 $activity = $this->callAPISuccess('Activity', 'create', $params);
943 // fetch domain info
944 $domainInfo = $this->callAPISuccess('Domain', 'getsingle', array('id' => CRM_Core_Config::domainID()));
945
946 $formAddress = CRM_Case_BAO_Case::getReceiptFrom($activity['id']);
947 if (!empty($domainInfo['from_email'])) {
948 $expectedFromAddress = sprintf("%s <%s>", $domainInfo['from_name'], $domainInfo['from_email']);
949 }
950 // Case 3: fetch default Organization Contact email address
951 elseif (!empty($domainInfo['domain_email'])) {
952 $expectedFromAddress = sprintf("%s <%s>", $domainInfo['name'], $domainInfo['domain_email']);
953 }
954 $this->assertEquals($expectedFromAddress, $formAddress);
955
956 // TODO: Case 4 about checking the $formAddress on basis of logged contact ID respectively needs,
957 // to change the domain setting, which isn't straight forward in test environment
958 }
959
960 /**
961 * Set up for testing activity queries.
962 */
963 protected function setUpForActivityDashboardTests() {
964 $op = new PHPUnit_Extensions_Database_Operation_Insert();
965 $op->execute($this->_dbconn,
966 $this->createFlatXMLDataSet(
967 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
968 )
969 );
970
971 $this->_params = array(
972 'contact_id' => NULL,
973 'admin' => TRUE,
974 'caseId' => NULL,
975 'context' => 'home',
976 'activity_type_id' => NULL,
977 'offset' => 0,
978 'rowCount' => 0,
979 'sort' => NULL,
980 );
981 }
982
983 public function testSendEmailBasic() {
984 $contactId = $this->individualCreate();
985
986 // create a logged in USER since the code references it for sendEmail user.
987 $this->createLoggedInUser();
988 $session = CRM_Core_Session::singleton();
989 $loggedInUser = $session->get('userID');
990
991 $contact = $this->civicrm_api('contact', 'getsingle', array('id' => $contactId, 'version' => $this->_apiversion));
992 $contactDetailsIntersectKeys = array(
993 'contact_id' => '',
994 'sort_name' => '',
995 'display_name' => '',
996 'do_not_email' => '',
997 'preferred_mail_format' => '',
998 'is_deceased' => '',
999 'email' => '',
1000 'on_hold' => '',
1001 );
1002 $contactDetails = array(
1003 array_intersect_key($contact, $contactDetailsIntersectKeys),
1004 );
1005
1006 $subject = __FUNCTION__ . ' subject';
1007 $html = __FUNCTION__ . ' html';
1008 $text = __FUNCTION__ . ' text';
1009 $userID = $loggedInUser;
1010
1011 list($sent, $activity_id) = $email_result = CRM_Activity_BAO_Activity::sendEmail(
1012 $contactDetails,
1013 $subject,
1014 $text,
1015 $html,
1016 $contact['email'],
1017 $userID,
1018 $from = __FUNCTION__ . '@example.com'
1019 );
1020
1021 $activity = $this->civicrm_api('activity', 'getsingle', array('id' => $activity_id, 'version' => $this->_apiversion));
1022 $details = "-ALTERNATIVE ITEM 0-
1023 $html
1024 -ALTERNATIVE ITEM 1-
1025 $text
1026 -ALTERNATIVE END-
1027 ";
1028 $this->assertEquals($activity['details'], $details, 'Activity details does not match.');
1029 $this->assertEquals($activity['subject'], $subject, 'Activity subject does not match.');
1030 }
1031
1032 public function testSendEmailWithCampaign() {
1033 // Create a contact and contactDetails array.
1034 $contactId = $this->individualCreate();
1035
1036 // create a logged in USER since the code references it for sendEmail user.
1037 $this->createLoggedInUser();
1038 $session = CRM_Core_Session::singleton();
1039 $loggedInUser = $session->get('userID');
1040
1041 $contact = $this->civicrm_api('contact', 'getsingle', array('id' => $contactId, 'version' => $this->_apiversion));
1042 $contactDetailsIntersectKeys = array(
1043 'contact_id' => '',
1044 'sort_name' => '',
1045 'display_name' => '',
1046 'do_not_email' => '',
1047 'preferred_mail_format' => '',
1048 'is_deceased' => '',
1049 'email' => '',
1050 'on_hold' => '',
1051 );
1052 $contactDetails = array(
1053 array_intersect_key($contact, $contactDetailsIntersectKeys),
1054 );
1055
1056 // Create a campaign.
1057 $result = $this->civicrm_api('Campaign', 'create', array(
1058 'version' => $this->_apiversion,
1059 'title' => __FUNCTION__ . ' campaign',
1060 ));
1061 $campaign_id = $result['id'];
1062
1063 $subject = __FUNCTION__ . ' subject';
1064 $html = __FUNCTION__ . ' html';
1065 $text = __FUNCTION__ . ' text';
1066 $userID = $loggedInUser;
1067
1068 list($sent, $activity_id) = $email_result = CRM_Activity_BAO_Activity::sendEmail(
1069 $contactDetails,
1070 $subject,
1071 $text,
1072 $html,
1073 $contact['email'],
1074 $userID,
1075 $from = __FUNCTION__ . '@example.com',
1076 $attachments = NULL,
1077 $cc = NULL,
1078 $bcc = NULL,
1079 $contactIds = NULL,
1080 $additionalDetails = NULL,
1081 NULL,
1082 $campaign_id
1083 );
1084 $activity = $this->civicrm_api('activity', 'getsingle', array('id' => $activity_id, 'version' => $this->_apiversion));
1085 $this->assertEquals($activity['campaign_id'], $campaign_id, 'Activity campaign_id does not match.');
1086 }
1087
1088 }