Commit | Line | Data |
---|---|---|
b019b130 TO |
1 | <?php |
2 | namespace Civi\CCase; | |
3 | ||
7fe37828 EM |
4 | /** |
5 | * Class SequenceListenerTest | |
6 | * | |
7 | * @package Civi\CCase | |
acb109b7 | 8 | * @group headless |
7fe37828 | 9 | */ |
b019b130 TO |
10 | class SequenceListenerTest extends \CiviCaseTestCase { |
11 | ||
12 | public function setUp() { | |
13 | parent::setUp(); | |
14 | $this->_params = array( | |
82de141d | 15 | 'case_type' => $this->caseType, |
b019b130 TO |
16 | 'subject' => 'Test case', |
17 | 'contact_id' => 17, | |
18 | ); | |
19 | } | |
20 | ||
21 | public function testSequence() { | |
22 | $actStatuses = array_flip(\CRM_Core_PseudoConstant::activityStatus('name')); | |
23 | $caseStatuses = array_flip(\CRM_Case_PseudoConstant::caseStatus('name')); | |
674829bf | 24 | $actTypes = array_flip(\CRM_Activity_BAO_Activity::buildOptions('activity_type_id', 'create')); |
b019b130 TO |
25 | |
26 | // Create case; schedule first activity | |
27 | \CRM_Utils_Time::setTime('2013-11-30 01:00:00'); | |
28 | $case = $this->callAPISuccess('case', 'create', $this->_params); | |
b019b130 | 29 | $analyzer = new \Civi\CCase\Analyzer($case['id']); |
c794d82e TO |
30 | $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id')); |
31 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
32 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
936055db TO |
33 | $this->assertFalse($analyzer->hasActivity('Mental health evaluation')); |
34 | $this->assertFalse($analyzer->hasActivity('Secure temporary housing')); | |
35 | ||
36 | // Edit details of first activity -- but don't finish it yet! | |
37 | \CRM_Utils_Time::setTime('2013-11-30 01:30:00'); | |
38 | $this->callApiSuccess('Activity', 'create', array( | |
c794d82e | 39 | 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'), |
936055db TO |
40 | 'subject' => 'This is the new subject', |
41 | )); | |
936055db | 42 | $analyzer = new \Civi\CCase\Analyzer($case['id']); |
c794d82e TO |
43 | $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id')); |
44 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
45 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
b019b130 TO |
46 | $this->assertFalse($analyzer->hasActivity('Mental health evaluation')); |
47 | $this->assertFalse($analyzer->hasActivity('Secure temporary housing')); | |
48 | ||
49 | // Complete first activity; schedule second | |
50 | \CRM_Utils_Time::setTime('2013-11-30 02:00:00'); | |
51 | $this->callApiSuccess('Activity', 'create', array( | |
c794d82e | 52 | 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'), |
b019b130 TO |
53 | 'status_id' => $actStatuses['Completed'], |
54 | )); | |
55 | $analyzer->flush(); | |
c794d82e TO |
56 | $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id')); |
57 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
58 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
59 | $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time')); | |
60 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id')); | |
b019b130 TO |
61 | $this->assertFalse($analyzer->hasActivity('Secure temporary housing')); |
62 | ||
63 | // Complete second activity; schedule third | |
64 | \CRM_Utils_Time::setTime('2013-11-30 03:00:00'); | |
65 | $this->callApiSuccess('Activity', 'create', array( | |
c794d82e | 66 | 'id' => self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'id'), |
b019b130 TO |
67 | 'status_id' => $actStatuses['Completed'], |
68 | )); | |
69 | $analyzer->flush(); | |
c794d82e TO |
70 | $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id')); |
71 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
72 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
73 | $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time')); | |
74 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id')); | |
75 | $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time')); | |
76 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id')); | |
b019b130 | 77 | |
674829bf DA |
78 | //Add an Activity before the case is closed |
79 | \CRM_Utils_Time::setTime('2013-11-30 04:00:00'); | |
80 | $this->callApiSuccess('Activity', 'create', array( | |
81 | 'activity_name' => 'Follow up', | |
82 | 'activity_type_id' => $actTypes['Follow up'], | |
83 | 'status_id' => $actStatuses['Scheduled'], | |
84 | 'case_id' => $case['id'], | |
85 | 'activity_date_time' => \CRM_Utils_Time::getTime(), | |
86 | )); | |
87 | $analyzer->flush(); | |
88 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
89 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
90 | $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time')); | |
91 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id')); | |
92 | $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time')); | |
93 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id')); | |
94 | $this->assertApproxTime('2013-11-30 04:00:00', self::ag($analyzer->getSingleActivity('Follow up'), 'activity_date_time')); | |
95 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Follow up'), 'status_id')); | |
96 | ||
97 | // Complete third activity; Case should remain open because of the Follow up activity | |
b019b130 TO |
98 | \CRM_Utils_Time::setTime('2013-11-30 04:00:00'); |
99 | $this->callApiSuccess('Activity', 'create', array( | |
c794d82e | 100 | 'id' => self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'id'), |
b019b130 TO |
101 | 'status_id' => $actStatuses['Completed'], |
102 | )); | |
103 | $analyzer->flush(); | |
c794d82e TO |
104 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); |
105 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
106 | $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time')); | |
107 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id')); | |
108 | $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time')); | |
109 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id')); | |
674829bf DA |
110 | $this->assertApproxTime('2013-11-30 04:00:00', self::ag($analyzer->getSingleActivity('Follow up'), 'activity_date_time')); |
111 | $this->assertEquals($actStatuses['Scheduled'], self::ag($analyzer->getSingleActivity('Follow up'), 'status_id')); | |
112 | $this->assertEquals($caseStatuses['Open'], self::ag($analyzer->getCase(), 'status_id')); | |
113 | ||
114 | // Complete the additional Activity; Case closed | |
115 | \CRM_Utils_Time::setTime('2013-11-30 04:00:00'); | |
116 | $this->callApiSuccess('Activity', 'create', array( | |
117 | 'id' => self::ag($analyzer->getSingleActivity('Follow up'), 'id'), | |
118 | 'status_id' => $actStatuses['Completed'], | |
119 | )); | |
120 | $analyzer->flush(); | |
121 | $this->assertApproxTime('2013-11-30 01:00:00', self::ag($analyzer->getSingleActivity('Medical evaluation'), 'activity_date_time')); | |
122 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Medical evaluation'), 'status_id')); | |
123 | $this->assertApproxTime('2013-11-30 02:00:00', self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'activity_date_time')); | |
124 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'status_id')); | |
125 | $this->assertApproxTime('2013-11-30 03:00:00', self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'activity_date_time')); | |
126 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'status_id')); | |
127 | $this->assertApproxTime('2013-11-30 04:00:00', self::ag($analyzer->getSingleActivity('Follow up'), 'activity_date_time')); | |
128 | $this->assertEquals($actStatuses['Completed'], self::ag($analyzer->getSingleActivity('Follow up'), 'status_id')); | |
c794d82e | 129 | $this->assertEquals($caseStatuses['Closed'], self::ag($analyzer->getCase(), 'status_id')); |
b019b130 TO |
130 | } |
131 | ||
132 | /** | |
133 | * @param $caseTypes | |
134 | * @see \CRM_Utils_Hook::caseTypes | |
135 | */ | |
00be9182 | 136 | public function hook_caseTypes(&$caseTypes) { |
b019b130 TO |
137 | $caseTypes[$this->caseType] = array( |
138 | 'module' => 'org.civicrm.hrcase', | |
139 | 'name' => $this->caseType, | |
140 | 'file' => __DIR__ . '/HousingSupportWithSequence.xml', | |
141 | ); | |
142 | } | |
143 | ||
7fe37828 EM |
144 | /** |
145 | * @param $expected | |
146 | * @param $actual | |
147 | * @param int $tolerance | |
148 | */ | |
00be9182 | 149 | public function assertApproxTime($expected, $actual, $tolerance = 1) { |
b019b130 TO |
150 | $diff = abs(strtotime($expected) - strtotime($actual)); |
151 | $this->assertTrue($diff <= $tolerance, sprintf("Check approx time equality. expected=[%s] actual=[%s] tolerance=[%s]", | |
152 | $expected, $actual, $tolerance | |
153 | )); | |
154 | } | |
c794d82e TO |
155 | |
156 | /** | |
157 | * Get a value from an array. This is syntactic-sugar to work-around PHP 5.3's limited syntax. | |
158 | * | |
159 | * @param $array | |
160 | * @param $key | |
161 | * @return mixed | |
162 | */ | |
00be9182 | 163 | public static function ag($array, $key) { |
c794d82e TO |
164 | return $array[$key]; |
165 | } | |
96025800 | 166 | |
ef10e0b5 | 167 | } |