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