Merge pull request #16541 from bhahumanists/subtype-issue-991
[civicrm-core.git] / tests / phpunit / Civi / CCase / SequenceListenerTest.php
CommitLineData
b019b130
TO
1<?php
2namespace Civi\CCase;
3
7fe37828
EM
4/**
5 * Class SequenceListenerTest
6 *
7 * @package Civi\CCase
acb109b7 8 * @group headless
7fe37828 9 */
b019b130
TO
10class SequenceListenerTest extends \CiviCaseTestCase {
11
12 public function setUp() {
13 parent::setUp();
9099cab3 14 $this->_params = [
82de141d 15 'case_type' => $this->caseType,
b019b130
TO
16 'subject' => 'Test case',
17 'contact_id' => 17,
9099cab3 18 ];
e3a72b34 19 //Add an activity status with Type = Completed
9099cab3 20 $this->callAPISuccess('OptionValue', 'create', [
e3a72b34
JP
21 'option_group_id' => "activity_status",
22 'filter' => \CRM_Activity_BAO_Activity::COMPLETED,
23 'label' => "Skip Activity",
9099cab3 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');
9099cab3 44 $this->callApiSuccess('Activity', 'create', [
c794d82e 45 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'),
936055db 46 'subject' => 'This is the new subject',
9099cab3 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');
9099cab3 57 $this->callApiSuccess('Activity', 'create', [
c794d82e 58 'id' => self::ag($analyzer->getSingleActivity('Medical evaluation'), 'id'),
b019b130 59 'status_id' => $actStatuses['Completed'],
9099cab3 60 ]);
b019b130 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 70 \CRM_Utils_Time::setTime('2013-11-30 03:00:00');
9099cab3 71 $this->callApiSuccess('Activity', 'create', [
c794d82e 72 'id' => self::ag($analyzer->getSingleActivity('Mental health evaluation'), 'id'),
1453c6db 73 'status_id' => $actStatuses['Skip_Activity'],
9099cab3 74 ]);
b019b130 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'));
1453c6db 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');
9099cab3 86 $this->callApiSuccess('Activity', 'create', [
39b959db
SL
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(),
9099cab3 92 ]);
674829bf
DA
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'));
1453c6db 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 104 \CRM_Utils_Time::setTime('2013-11-30 04:00:00');
9099cab3 105 $this->callApiSuccess('Activity', 'create', [
c794d82e 106 'id' => self::ag($analyzer->getSingleActivity('Secure temporary housing'), 'id'),
b019b130 107 'status_id' => $actStatuses['Completed'],
9099cab3 108 ]);
b019b130 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'));
1453c6db 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');
9099cab3 122 $this->callApiSuccess('Activity', 'create', [
39b959db
SL
123 'id' => self::ag($analyzer->getSingleActivity('Follow up'), 'id'),
124 'status_id' => $actStatuses['Completed'],
9099cab3 125 ]);
674829bf
DA
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'));
1453c6db 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) {
9099cab3 143 $caseTypes[$this->caseType] = [
b019b130
TO
144 'module' => 'org.civicrm.hrcase',
145 'name' => $this->caseType,
146 'file' => __DIR__ . '/HousingSupportWithSequence.xml',
9099cab3 147 ];
b019b130
TO
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}