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