Merge pull request #9790 from fliespl/patch-3
[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
368 global $_GET;
369 $_GET = array(
370 'cid' => 9,
371 'context' => 'activity',
372 'activity_type_id' => 1,
373 'is_unit_test' => 1,
374 );
375 $obj = new CRM_Activity_Page_AJAX();
376
377 $activities = $obj->getContactActivity();
378 // This should include activities of type Meeting only.
379 foreach ($activities['data'] as $value) {
380 $this->assertContains('Meeting', $value['activity_type']);
381 }
382 unset($_GET['activity_type_id']);
383
384 $_GET['activity_type_exclude_id'] = 1;
385 $activities = $obj->getContactActivity();
386 // None of the activities should be of type Meeting.
387 foreach ($activities['data'] as $value) {
388 $this->assertNotEquals('Meeting', $value['activity_type']);
389 }
390 }
391
392 /**
393 * Test getActivities BAO method for getting count
394 */
395 public function testGetActivitiesCountforContactSummaryWithNoActivities() {
396 $op = new PHPUnit_Extensions_Database_Operation_Insert();
397 $op->execute($this->_dbconn,
398 $this->createFlatXMLDataSet(
399 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
400 )
401 );
402
403 $params = array(
404 'contact_id' => 17,
405 'admin' => FALSE,
406 'caseId' => NULL,
407 'context' => 'home',
408 'activity_type_id' => NULL,
409 'offset' => 0,
410 'rowCount' => 0,
411 'sort' => NULL,
412 );
413 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($params);
414
415 //since we are loading activities from dataset, we know total number of activities for this contact
416 // this contact does not have any activity
417 $this->assertEquals(0, $activityCount);
418 $this->assertEquals(0, CRM_Activity_BAO_Activity::getActivitiesCount($params));
419 }
420
421 /**
422 * Test getActivities BAO method.
423 */
424 public function testGetActivitiesForAdminDashboard() {
425 $this->setUpForActivityDashboardTests();
426 $activitiesDeprecatedFn = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
427 $activitiesNew = CRM_Activity_BAO_Activity::getActivities($this->_params);
428 // $this->assertEquals($activities, $activitiesDeprecatedFn);
429
430 //since we are loading activities from dataset, we know total number of activities
431 // with no contact ID and there should be 8 schedule activities shown on dashboard
432 $count = 8;
433 foreach (array($activitiesNew, $activitiesDeprecatedFn) as $activities) {
434 $this->assertEquals($count, count($activities));
435
436 foreach ($activities as $key => $value) {
437 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
438 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
439 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
440 }
441 }
442 }
443
444 /**
445 * Test getActivities BAO method.
446 */
447 public function testGetActivitiesForAdminDashboardNoViewContacts() {
448 CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
449 $this->setUpForActivityDashboardTests();
450 $activitiesDeprecated = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
451 foreach (array($activitiesDeprecated, CRM_Activity_BAO_Activity::getActivities($this->_params)) as $activities) {
452 // Skipped until we get back to the upgraded version properly.
453 //$this->assertEquals(0, count($activities));
454 }
455 }
456
457 /**
458 * Test getActivities BAO method.
459 */
460 public function testGetActivitiesForAdminDashboardAclLimitedViewContacts() {
461 CRM_Core_Config::singleton()->userPermissionClass->permissions = array('access CiviCRM');
462 $this->allowedContacts = array(1, 3, 4, 5);
463 $this->hookClass->setHook('civicrm_aclWhereClause', array($this, 'aclWhereMultipleContacts'));
464 $this->setUpForActivityDashboardTests();
465 $activitiesDeprecated = CRM_Activity_BAO_Activity::deprecatedGetActivities($this->_params);
466 foreach (array($activitiesDeprecated, CRM_Activity_BAO_Activity::getActivities($this->_params)) as $activities) {
467 //$this->assertEquals(1, count($activities));
468 }
469
470 }
471
472 /**
473 * Test getActivities BAO method.
474 */
475 public function testGetActivitiesforNonAdminDashboard() {
476 $op = new PHPUnit_Extensions_Database_Operation_Insert();
477 $op->execute($this->_dbconn,
478 $this->createFlatXMLDataSet(
479 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
480 )
481 );
482
483 $contactID = 9;
484 $params = array(
485 'contact_id' => $contactID,
486 'admin' => FALSE,
487 'caseId' => NULL,
488 'context' => 'home',
489 'activity_type_id' => NULL,
490 'offset' => 0,
491 'rowCount' => 0,
492 'sort' => NULL,
493 );
494 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
495
496 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
497 //since we are loading activities from dataset, we know total number of activities for this contact
498 // 5 activities ( 2 scheduled, 3 Completed ), note that dashboard shows only scheduled activities
499 $count = 2;
500 $this->assertEquals($count, count($activities));
501
502 foreach ($activities as $key => $value) {
503 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
504 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
505 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
506
507 if ($key == 3) {
508 $this->assertArrayHasKey($contactID, $value['target_contact_name']);
509 }
510 elseif ($key == 4) {
511 $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
512 }
513 }
514 }
515 }
516
517 /**
518 * Test target contact count.
519 */
520 public function testTargetCountforContactSummary() {
521 $targetCount = 5;
522 $contactId = $this->individualCreate();
523 $targetContactIDs = array();
524 for ($i = 0; $i < $targetCount; $i++) {
525 $targetContactIDs[] = $this->individualCreate(array(), $i);
526 }
527 // Create activities with 5 target contacts.
528 $activityParams = array(
529 'source_contact_id' => $contactId,
530 'target_contact_id' => $targetContactIDs,
531 );
532 $this->activityCreate($activityParams);
533
534 $params = array(
535 'contact_id' => $contactId,
536 'context' => 'activity',
537 );
538 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
539 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
540 //verify target count
541 $this->assertEquals($targetCount, $activities[1]['target_contact_counter']);
542 }
543
544 }
545
546 /**
547 * Test getActivities BAO method.
548 */
549 public function testGetActivitiesforContactSummary() {
550 $op = new PHPUnit_Extensions_Database_Operation_Insert();
551 $op->execute($this->_dbconn,
552 $this->createFlatXMLDataSet(
553 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
554 )
555 );
556
557 $contactID = 9;
558 $params = array(
559 'contact_id' => $contactID,
560 'admin' => FALSE,
561 'caseId' => NULL,
562 'context' => 'activity',
563 'activity_type_id' => NULL,
564 'offset' => 0,
565 'rowCount' => 0,
566 'sort' => NULL,
567 );
568 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($params);
569
570 //since we are loading activities from dataset, we know total number of activities for this contact
571 // 5 activities, Contact Summary should show all activities
572 $count = 5;
573 foreach (array($activitiesDep, CRM_Activity_BAO_Activity::getActivities($params)) as $activities) {
574
575 $this->assertEquals($count, count($activities));
576
577 foreach ($activities as $key => $value) {
578 $this->assertEquals($value['subject'], "subject {$key}", 'Verify activity subject is correct.');
579
580 if ($key > 8) {
581 $this->assertEquals($value['status_id'], 2, 'Verify all activities are scheduled.');
582 }
583 else {
584 $this->assertEquals($value['status_id'], 1, 'Verify all activities are scheduled.');
585 }
586
587 if ($key > 8) {
588 $this->assertEquals($value['activity_type_id'], 1, 'Verify activity type is correct.');
589 }
590 else {
591 $this->assertEquals($value['activity_type_id'], 2, 'Verify activity type is correct.');
592 }
593
594 if ($key == 3) {
595 $this->assertArrayHasKey($contactID, $value['target_contact_name']);
596 }
597 elseif ($key == 4) {
598 $this->assertArrayHasKey($contactID, $value['assignee_contact_name']);
599 }
600 }
601 }
602 }
603
604 /**
605 * Test getActivities BAO method.
606 */
607 public function testGetActivitiesforContactSummaryWithActivities() {
608 $op = new PHPUnit_Extensions_Database_Operation_Insert();
609 $op->execute($this->_dbconn,
610 $this->createFlatXMLDataSet(
611 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
612 )
613 );
614
615 // parameters for different test cases, check each array key for the specific test-case
616 $testCases = array(
617 'with-no-activity' => array(
618 'params' => array(
619 'contact_id' => 17,
620 'admin' => FALSE,
621 'caseId' => NULL,
622 'context' => 'home',
623 'activity_type_id' => NULL,
624 'offset' => 0,
625 'rowCount' => 0,
626 'sort' => NULL,
627 ),
628 ),
629 'with-activity' => array(
630 'params' => array(
631 'contact_id' => 1,
632 'admin' => FALSE,
633 'caseId' => NULL,
634 'context' => 'home',
635 'activity_type_id' => NULL,
636 'offset' => 0,
637 'rowCount' => 0,
638 'sort' => NULL,
639 ),
640 ),
641 'with-activity_type' => array(
642 'params' => array(
643 'contact_id' => 3,
644 'admin' => FALSE,
645 'caseId' => NULL,
646 'context' => 'home',
647 'activity_type_id' => 2,
648 'offset' => 0,
649 'rowCount' => 0,
650 'sort' => NULL,
651 ),
652 ),
653 'exclude-all-activity_type' => array(
654 'params' => array(
655 'contact_id' => 3,
656 'admin' => FALSE,
657 'caseId' => NULL,
658 'context' => 'home',
659 'activity_type_exclude_id' => array(1, 2),
660 'offset' => 0,
661 'rowCount' => 0,
662 'sort' => NULL,
663 ),
664 ),
665 'sort-by-subject' => array(
666 'params' => array(
667 'contact_id' => 1,
668 'admin' => FALSE,
669 'caseId' => NULL,
670 'context' => 'home',
671 'activity_type_id' => NULL,
672 'offset' => 0,
673 'rowCount' => 0,
674 'sort' => 'subject DESC',
675 ),
676 ),
677 );
678
679 foreach ($testCases as $caseName => $testCase) {
680 $activitiesDep = CRM_Activity_BAO_Activity::deprecatedGetActivities($testCase['params']);
681 $activityCount = CRM_Activity_BAO_Activity::deprecatedGetActivitiesCount($testCase['params']);
682 $activitiesNew = CRM_Activity_BAO_Activity::getActivities($testCase['params']);
683
684 foreach (array($activitiesDep, $activitiesNew) as $activities) {
685 //$this->assertEquals($activityCount, CRM_Activity_BAO_Activity::getActivitiesCount($testCase['params']));
686 if ($caseName == 'with-no-activity') {
687 $this->assertEquals(0, count($activities));
688 $this->assertEquals(0, $activityCount);
689 }
690 elseif ($caseName == 'with-activity') {
691 // contact id 1 is assigned as source, target and assignee for activity id 1, 7 and 8 respectively
692 $this->assertEquals(3, count($activities));
693 $this->assertEquals(3, $activityCount);
694 $this->assertEquals(1, $activities[1]['source_contact_id']);
695 // @todo - this is a discrepancy between old & new - review.
696 //$this->assertEquals(TRUE, array_key_exists(1, $activities[7]['target_contact_name']));
697 $this->assertEquals(TRUE, array_key_exists(1, $activities[8]['assignee_contact_name']));
698 }
699 elseif ($caseName == 'with-activity_type') {
700 // contact id 3 for activity type 2 is assigned as assignee, source and target for
701 // activity id 1, 3 and 8 respectively
702 $this->assertEquals(3, count($activities));
703 $this->assertEquals(3, $activityCount);
704 // ensure activity type id is 2
705 $this->assertEquals(2, $activities[1]['activity_type_id']);
706 $this->assertEquals(3, $activities[3]['source_contact_id']);
707 // @todo review inconsistency between 2 versions.
708 // $this->assertEquals(TRUE, array_key_exists(3, $activities[8]['target_contact_name']));
709 $this->assertEquals(TRUE, array_key_exists(3, $activities[1]['assignee_contact_name']));
710 }
711 if ($caseName == 'exclude-all-activity_type') {
712 $this->assertEquals(0, count($activities));
713 $this->assertEquals(0, $activityCount);
714 }
715 if ($caseName == 'sort-by-subject') {
716 $this->assertEquals(3, count($activities));
717 $this->assertEquals(3, $activityCount);
718 // activities should be order by 'subject DESC'
719 $subjectOrder = array(
720 'subject 8',
721 'subject 7',
722 'subject 1',
723 );
724 $count = 0;
725 foreach ($activities as $activity) {
726 $this->assertEquals($subjectOrder[$count], $activity['subject']);
727 $count++;
728 }
729 }
730 }
731 }
732 }
733
734 /**
735 * CRM-20308: Test from email address when a 'copy of Activity' event occur
736 */
737 public function testEmailAddressOfActivityCopy() {
738 // Case 1: assert the 'From' Email Address of source Actvity Contact ID
739 // create activity with source contact ID which has email address
740 $assigneeContactId = $this->individualCreate();
741 $sourceContactParams = array(
742 'first_name' => 'liz',
743 'last_name' => 'hurleey',
744 'email' => substr(sha1(rand()), 0, 7) . '@testemail.com',
745 );
746 $sourceContactID = $this->individualCreate($sourceContactParams);
747 $sourceDisplayName = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $sourceContactID, 'display_name');
748
749 // create an activity using API
750 $params = array(
751 'source_contact_id' => $sourceContactID,
752 'subject' => 'Scheduling Meeting ' . substr(sha1(rand()), 0, 4),
753 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Meeting'),
754 'assignee_contact_id' => array($assigneeContactId),
755 'activity_date_time' => date('Ymd'),
756 );
757 $activity = $this->callAPISuccess('Activity', 'create', $params);
758
759 // Check that from address is in "Source-Display-Name <source-email>"
760 $formAddress = CRM_Case_BAO_Case::getReceiptFrom($activity['id']);
761 $expectedFromAddress = sprintf("%s <%s>", $sourceDisplayName, $sourceContactParams['email']);
762 $this->assertEquals($expectedFromAddress, $formAddress);
763
764 // Case 2: System Default From Address
765 // but first erase the email address of existing source contact ID
766 $withoutEmailParams = array(
767 'email' => '',
768 );
769 $sourceContactID = $this->individualCreate($withoutEmailParams);
770 $params = array(
771 'source_contact_id' => $sourceContactID,
772 'subject' => 'Scheduling Meeting ' . substr(sha1(rand()), 0, 4),
773 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Meeting'),
774 'activity_date_time' => date('Ymd'),
775 );
776 $activity = $this->callAPISuccess('Activity', 'create', $params);
777 // fetch domain info
778 $domainInfo = $this->callAPISuccess('Domain', 'getsingle', array('id' => CRM_Core_Config::domainID()));
779
780 $formAddress = CRM_Case_BAO_Case::getReceiptFrom($activity['id']);
781 if (!empty($domainInfo['from_email'])) {
782 $expectedFromAddress = sprintf("%s <%s>", $domainInfo['from_name'], $domainInfo['from_email']);
783 }
784 // Case 3: fetch default Organization Contact email address
785 elseif (!empty($domainInfo['domain_email'])) {
786 $expectedFromAddress = sprintf("%s <%s>", $domainInfo['name'], $domainInfo['domain_email']);
787 }
788 $this->assertEquals($expectedFromAddress, $formAddress);
789
790 // TODO: Case 4 about checking the $formAddress on basis of logged contact ID respectively needs,
791 // to change the domain setting, which isn't straight forward in test environment
792 }
793
794 /**
795 * Set up for testing activity queries.
796 */
797 protected function setUpForActivityDashboardTests() {
798 $op = new PHPUnit_Extensions_Database_Operation_Insert();
799 $op->execute($this->_dbconn,
800 $this->createFlatXMLDataSet(
801 dirname(__FILE__) . '/activities_for_dashboard_count.xml'
802 )
803 );
804
805 $this->_params = array(
806 'contact_id' => NULL,
807 'admin' => TRUE,
808 'caseId' => NULL,
809 'context' => 'home',
810 'activity_type_id' => NULL,
811 'offset' => 0,
812 'rowCount' => 0,
813 'sort' => NULL,
814 );
815 }
816
817 public function testSendEmailBasic() {
818 $contactId = $this->individualCreate();
819
820 // create a logged in USER since the code references it for sendEmail user.
821 $this->createLoggedInUser();
822 $session = CRM_Core_Session::singleton();
823 $loggedInUser = $session->get('userID');
824
825 $contact = $this->civicrm_api('contact', 'getsingle', array('id' => $contactId, 'version' => $this->_apiversion));
826 $contactDetailsIntersectKeys = array(
827 'contact_id' => '',
828 'sort_name' => '',
829 'display_name' => '',
830 'do_not_email' => '',
831 'preferred_mail_format' => '',
832 'is_deceased' => '',
833 'email' => '',
834 'on_hold' => '',
835 );
836 $contactDetails = array(
837 array_intersect_key($contact, $contactDetailsIntersectKeys),
838 );
839
840 $subject = __FUNCTION__ . ' subject';
841 $html = __FUNCTION__ . ' html';
842 $text = __FUNCTION__ . ' text';
843 $userID = $loggedInUser;
844
845 list($sent, $activity_id) = $email_result = CRM_Activity_BAO_Activity::sendEmail(
846 $contactDetails,
847 $subject,
848 $text,
849 $html,
850 $contact['email'],
851 $userID,
852 $from = __FUNCTION__ . '@example.com'
853 );
854
855 $activity = $this->civicrm_api('activity', 'getsingle', array('id' => $activity_id, 'version' => $this->_apiversion));
856 $details = "-ALTERNATIVE ITEM 0-
857 $html
858 -ALTERNATIVE ITEM 1-
859 $text
860 -ALTERNATIVE END-
861 ";
862 $this->assertEquals($activity['details'], $details, 'Activity details does not match.');
863 $this->assertEquals($activity['subject'], $subject, 'Activity subject does not match.');
864 }
865
866 public function testSendEmailWithCampaign() {
867 // Create a contact and contactDetails array.
868 $contactId = $this->individualCreate();
869
870 // create a logged in USER since the code references it for sendEmail user.
871 $this->createLoggedInUser();
872 $session = CRM_Core_Session::singleton();
873 $loggedInUser = $session->get('userID');
874
875 $contact = $this->civicrm_api('contact', 'getsingle', array('id' => $contactId, 'version' => $this->_apiversion));
876 $contactDetailsIntersectKeys = array(
877 'contact_id' => '',
878 'sort_name' => '',
879 'display_name' => '',
880 'do_not_email' => '',
881 'preferred_mail_format' => '',
882 'is_deceased' => '',
883 'email' => '',
884 'on_hold' => '',
885 );
886 $contactDetails = array(
887 array_intersect_key($contact, $contactDetailsIntersectKeys),
888 );
889
890 // Create a campaign.
891 $result = $this->civicrm_api('Campaign', 'create', array(
892 'version' => $this->_apiversion,
893 'title' => __FUNCTION__ . ' campaign',
894 ));
895 $campaign_id = $result['id'];
896
897 $subject = __FUNCTION__ . ' subject';
898 $html = __FUNCTION__ . ' html';
899 $text = __FUNCTION__ . ' text';
900 $userID = $loggedInUser;
901
902 list($sent, $activity_id) = $email_result = CRM_Activity_BAO_Activity::sendEmail(
903 $contactDetails,
904 $subject,
905 $text,
906 $html,
907 $contact['email'],
908 $userID,
909 $from = __FUNCTION__ . '@example.com',
910 $attachments = NULL,
911 $cc = NULL,
912 $bcc = NULL,
913 $contactIds = NULL,
914 $additionalDetails = NULL,
915 NULL,
916 $campaign_id
917 );
918 $activity = $this->civicrm_api('activity', 'getsingle', array('id' => $activity_id, 'version' => $this->_apiversion));
919 $this->assertEquals($activity['campaign_id'], $campaign_id, 'Activity campaign_id does not match.');
920 }
921
922 }