Merge remote-tracking branch 'upstream/4.6' into 4.6-master-2015-07-02-11-04-42
[civicrm-core.git] / tests / phpunit / api / v3 / CaseTypeTest.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2015 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 require_once 'CiviTest/CiviCaseTestCase.php';
29
30 /**
31 * Class api_v3_CaseTypeTest
32 */
33 class api_v3_CaseTypeTest extends CiviCaseTestCase {
34
35 public function setUp() {
36 $this->quickCleanup(array('civicrm_case_type'));
37 parent::setUp();
38
39 $this->fixtures['Application_with_Definition'] = array(
40 'title' => 'Application with Definition',
41 'name' => 'Application_with_Definition',
42 'is_active' => 1,
43 'weight' => 4,
44 'definition' => array(
45 'activityTypes' => array(
46 array('name' => 'First act'),
47 ),
48 'activitySets' => array(
49 array(
50 'name' => 'set1',
51 'label' => 'Label 1',
52 'timeline' => 1,
53 'activityTypes' => array(
54 array('name' => 'Open Case', 'status' => 'Completed'),
55 ),
56 ),
57 ),
58 'caseRoles' => array(
59 array('name' => 'First role', 'creator' => 1, 'manager' => 1),
60 ),
61 ),
62 );
63 }
64
65 /**
66 * Tears down the fixture, for example, closes a network connection.
67 *
68 * This method is called after a test is executed.
69 */
70 public function tearDown() {
71 parent::tearDown();
72 $this->quickCleanup(array('civicrm_case_type', 'civicrm_uf_match'));
73 }
74
75 /**
76 * Check with empty array.
77 */
78 public function testCaseTypeCreateEmpty() {
79 $this->callAPIFailure('CaseType', 'create', array());
80 }
81
82 /**
83 * Check if required fields are not passed.
84 */
85 public function testCaseTypeCreateWithoutRequired() {
86 $params = array(
87 'name' => 'this case should fail',
88 );
89 $this->callAPIFailure('CaseType', 'create', $params);
90
91 $params = array(
92 'name' => 'this case should fail',
93 'weight' => 4,
94 );
95 $this->callAPIFailure('CaseType', 'create', $params);
96 }
97
98 /**
99 * Test create methods with valid data.
100 *
101 * Success expected.
102 */
103 public function testCaseTypeCreate() {
104 // Create Case Type.
105 $params = array(
106 'title' => 'Application',
107 'name' => 'Application',
108 'is_active' => 1,
109 'weight' => 4,
110 );
111
112 $result = $this->callAPISuccess('CaseType', 'create', $params);
113 $id = $result['id'];
114
115 // Check result.
116 $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
117 $this->assertEquals($result['values'][$id]['id'], $id);
118 $this->assertEquals($result['values'][$id]['title'], $params['title']);
119 }
120
121 /**
122 * Create a case with an invalid name.
123 */
124 public function testCaseTypeCreate_invalidName() {
125 // Create Case Type
126 $params = array(
127 'title' => 'Application',
128 'name' => 'Appl ication', // spaces are not allowed
129 'is_active' => 1,
130 'weight' => 4,
131 );
132
133 $this->callAPIFailure('CaseType', 'create', $params);
134 }
135
136
137 /**
138 * Test update (create with id) function with valid parameters.
139 */
140 public function testCaseTypeUpdate() {
141 // Create Case Type
142 $params = array(
143 'title' => 'Application',
144 'name' => 'Application',
145 'is_active' => 1,
146 'weight' => 4,
147 );
148 $result = $this->callAPISuccess('CaseType', 'create', $params);
149 $id = $result['id'];
150 $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
151 $caseType = $result['values'][$id];
152
153 // Update Case Type.
154 $params = array('id' => $id);
155 $params['title'] = $caseType['title'] = 'Something Else';
156 $this->callAPISuccess('CaseType', 'create', $params);
157
158 // Verify that updated case Type is exactly equal to the original with new title.
159 $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
160 $this->assertEquals($result['values'][$id], $caseType);
161 }
162
163 /**
164 * Test delete function with valid parameters.
165 */
166 public function testCaseTypeDelete_New() {
167 // Create Case Type.
168 $params = array(
169 'title' => 'Application',
170 'name' => 'Application',
171 'is_active' => 1,
172 'weight' => 4,
173 );
174 $result = $this->callAPISuccess('CaseType', 'create', $params);
175
176 $id = $result['id'];
177 $this->callAPISuccess('CaseType', 'delete', array('id' => $id));
178
179 // Check result - case type should no longer exist
180 $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
181 $this->assertEquals(0, $result['count']);
182 }
183
184 /**
185 * Test create methods with xml file.
186 *
187 * Success expected.
188 */
189 public function testCaseTypeCreateWithDefinition() {
190 // Create Case Type
191 $params = $this->fixtures['Application_with_Definition'];
192 $result = $this->callAPISuccess('CaseType', 'create', $params);
193 $id = $result['id'];
194
195 // Check result
196 $result = $this->callAPISuccess('CaseType', 'get', array('id' => $id));
197 $this->assertEquals($result['values'][$id]['id'], $id);
198 $this->assertEquals($result['values'][$id]['title'], $params['title']);
199 $this->assertEquals($result['values'][$id]['definition'], $params['definition']);
200
201 $caseXml = CRM_Case_XMLRepository::singleton()->retrieve('Application_with_Definition');
202 $this->assertTrue($caseXml instanceof SimpleXMLElement);
203 }
204
205 /**
206 * Create a CaseType+case then delete the CaseType.
207 */
208 public function testCaseTypeDelete_InUse() {
209 // Create Case Type
210 $params = $this->fixtures['Application_with_Definition'];
211 $createCaseType = $this->callAPISuccess('CaseType', 'create', $params);
212
213 $createCase = $this->callAPISuccess('Case', 'create', array(
214 'case_type_id' => $createCaseType['id'],
215 'contact_id' => $this->_loggedInUser,
216 'subject' => 'Example',
217 ));
218
219 // Deletion fails while case-type is in-use
220 $deleteCaseType = $this->callAPIFailure('CaseType', 'delete', array('id' => $createCaseType['id']));
221 $this->assertEquals("You can not delete this case type -- it is assigned to 1 existing case record(s). If you do not want this case type to be used going forward, consider disabling it instead.", $deleteCaseType['error_message']);
222 $getCaseType = $this->callAPISuccess('CaseType', 'get', array('id' => $createCaseType['id']));
223 $this->assertEquals(1, $getCaseType['count']);
224
225 // Deletion succeeds when it's not in-use.
226 $this->callAPISuccess('Case', 'delete', array('id' => $createCase['id']));
227
228 // Check result - case type should no longer exist.
229 $this->callAPISuccess('CaseType', 'delete', array('id' => $createCaseType['id']));
230 $getCaseType = $this->callAPISuccess('CaseType', 'get', array('id' => $createCaseType['id']));
231 $this->assertEquals(0, $getCaseType['count']);
232 }
233
234 }