Merge remote branch 'canonical/master' into merge-20140827
[civicrm-core.git] / tests / phpunit / Civi / CCase / SequenceListenerTest.php
CommitLineData
b019b130
TO
1<?php
2namespace Civi\CCase;
3
4require_once 'CiviTest/CiviCaseTestCase.php';
5
6class SequenceListenerTest extends \CiviCaseTestCase {
7
8 public function setUp() {
9 parent::setUp();
10 $this->_params = array(
82de141d 11 'case_type' => $this->caseType,
b019b130
TO
12 'subject' => 'Test case',
13 'contact_id' => 17,
14 );
15 }
16
17 public function testSequence() {
18 $actStatuses = array_flip(\CRM_Core_PseudoConstant::activityStatus('name'));
19 $caseStatuses = array_flip(\CRM_Case_PseudoConstant::caseStatus('name'));
20
21 // Create case; schedule first activity
22 \CRM_Utils_Time::setTime('2013-11-30 01:00:00');
23 $case = $this->callAPISuccess('case', 'create', $this->_params);
24
25 $analyzer = new \Civi\CCase\Analyzer($case['id']);
c794d82e
TO
26 $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
27 $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
28 $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
936055db
TO
29 $this->assertFalse($analyzer->hasActivity('Mental health evaluation'));
30 $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
31
32 // Edit details of first activity -- but don't finish it yet!
33 \CRM_Utils_Time::setTime('2013-11-30 01:30:00');
34 $this->callApiSuccess('Activity', 'create', array(
c794d82e 35 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'),
936055db
TO
36 'subject' => 'This is the new subject',
37 ));
38
39 $analyzer = new \Civi\CCase\Analyzer($case['id']);
c794d82e
TO
40 $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
41 $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
42 $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
b019b130
TO
43 $this->assertFalse($analyzer->hasActivity('Mental health evaluation'));
44 $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
45
46 // Complete first activity; schedule second
47 \CRM_Utils_Time::setTime('2013-11-30 02:00:00');
48 $this->callApiSuccess('Activity', 'create', array(
c794d82e 49 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'),
b019b130
TO
50 'status_id' => $actStatuses['Completed'],
51 ));
52 $analyzer->flush();
c794d82e
TO
53 $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
54 $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
55 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
56 $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
57 $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
b019b130
TO
58 $this->assertFalse($analyzer->hasActivity('Secure temporary housing'));
59
60 // Complete second activity; schedule third
61 \CRM_Utils_Time::setTime('2013-11-30 03:00:00');
62 $this->callApiSuccess('Activity', 'create', array(
c794d82e 63 'id' => self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'id'),
b019b130
TO
64 'status_id' => $actStatuses['Completed'],
65 ));
66 $analyzer->flush();
c794d82e
TO
67 $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id'));
68 $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
69 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
70 $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
71 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
72 $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time'));
73 $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id'));
b019b130
TO
74
75 // Complete third activity; close case
76 \CRM_Utils_Time::setTime('2013-11-30 04:00:00');
77 $this->callApiSuccess('Activity', 'create', array(
c794d82e 78 'id' => self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'id'),
b019b130
TO
79 'status_id' => $actStatuses['Completed'],
80 ));
81 $analyzer->flush();
c794d82e
TO
82 $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time'));
83 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id'));
84 $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time'));
85 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id'));
86 $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time'));
87 $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id'));
88 $this->assertEquals($caseStatuses['Closed'], self::ag($analyzer->getCase(), 'status_id'));
89 // */
b019b130
TO
90 }
91
92 /**
93 * @param $caseTypes
94 * @see \CRM_Utils_Hook::caseTypes
95 */
96 function hook_caseTypes(&$caseTypes) {
97 $caseTypes[$this->caseType] = array(
98 'module' => 'org.civicrm.hrcase',
99 'name' => $this->caseType,
100 'file' => __DIR__ . '/HousingSupportWithSequence.xml',
101 );
102 }
103
104 function assertApproxTime($expected, $actual, $tolerance = 1) {
105 $diff = abs(strtotime($expected) - strtotime($actual));
106 $this->assertTrue($diff <= $tolerance, sprintf("Check approx time equality. expected=[%s] actual=[%s] tolerance=[%s]",
107 $expected, $actual, $tolerance
108 ));
109 }
c794d82e
TO
110
111 /**
112 * Get a value from an array. This is syntactic-sugar to work-around PHP 5.3's limited syntax.
113 *
114 * @param $array
115 * @param $key
116 * @return mixed
117 */
118 static function ag($array, $key) {
119 return $array[$key];
120 }
b019b130 121}