Merge pull request #11250 from agh1/no-update-indices
[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();
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}