Merge pull request #14925 from civicrm/5.16
[civicrm-core.git] / tests / phpunit / api / v3 / ContactTypeTest.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2019 |
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 /**
29 * Class api_v3_ContactTypeTest
30 * @group headless
31 */
32 class api_v3_ContactTypeTest extends CiviUnitTestCase {
33 protected $_apiversion;
34
35 public function setUp() {
36 parent::setUp();
37 $this->useTransaction(TRUE);
38 $params = [
39 'label' => 'sub_individual',
40 'name' => 'sub_individual',
41 // Individual
42 'parent_id' => 1,
43 'is_active' => 1,
44 ];
45 $result = CRM_Contact_BAO_ContactType::add($params);
46 $this->subTypeIndividual = $params['name'];
47
48 $params = [
49 'label' => 'sub_organization',
50 'name' => 'sub_organization',
51 // Organization
52 'parent_id' => 3,
53 'is_active' => 1,
54 ];
55 $result = CRM_Contact_BAO_ContactType::add($params);
56 $this->subTypeOrganization = $params['name'];
57
58 $params = [
59 'label' => 'sub_household',
60 'name' => 'sub_household',
61 // Household
62 'parent_id' => 2,
63 'is_active' => 1,
64 ];
65 $result = CRM_Contact_BAO_ContactType::add($params);
66 $this->subTypeHousehold = $params['name'];
67 }
68
69 /**
70 * Test add methods with valid data.
71 * success expected
72 * @param int $version
73 * @dataProvider versionThreeAndFour
74 */
75 public function testContactCreate($version) {
76 $this->_apiversion = $version;
77
78 // check for Type:Individual Subtype:sub_individual
79 $contactParams = [
80 'first_name' => 'Anne',
81 'last_name' => 'Grant',
82 'contact_type' => 'Individual',
83 'contact_sub_type' => $this->subTypeIndividual,
84 ];
85 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
86 $params = [
87 'contact_id' => $contact['id'],
88 ];
89 $result = $this->callAPISuccess('contact', 'get', $params);
90 $this->assertEquals($result['values'][$contact['id']]['first_name'], $contactParams['first_name'], "In line " . __LINE__);
91 $this->assertEquals($result['values'][$contact['id']]['last_name'], $contactParams['last_name'], "In line " . __LINE__);
92 $this->assertEquals($result['values'][$contact['id']]['contact_type'], $contactParams['contact_type'], "In line " . __LINE__);
93 $this->assertEquals(end($result['values'][$contact['id']]['contact_sub_type']), $contactParams['contact_sub_type'], "In line " . __LINE__);
94 $this->callAPISuccess('contact', 'delete', $params);
95
96 // check for Type:Organization Subtype:sub_organization
97 $contactParams = [
98 'organization_name' => 'Compumentor',
99 'contact_type' => 'Organization',
100 'contact_sub_type' => $this->subTypeOrganization,
101 ];
102 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
103
104 $params = [
105 'contact_id' => $contact['id'],
106 ];
107 $getContacts = $this->callAPISuccess('contact', 'get', $params);
108 $result = $getContacts['values'][$contact['id']];
109 $this->assertEquals($result['organization_name'], $contactParams['organization_name'], "In line " . __LINE__);
110 $this->assertEquals($result['contact_type'], $contactParams['contact_type'], "In line " . __LINE__);
111 $this->assertEquals(end($result['contact_sub_type']), $contactParams['contact_sub_type'], "In line " . __LINE__);
112 $this->callAPISuccess('contact', 'delete', $params);
113 }
114
115 /**
116 * Test add with invalid data.
117 * @param int $version
118 * @dataProvider versionThreeAndFour
119 */
120 public function testContactAddInvalidData($version) {
121 $this->_apiversion = $version;
122
123 // check for Type:Individual Subtype:sub_household
124 $contactParams = [
125 'first_name' => 'Anne',
126 'last_name' => 'Grant',
127 'contact_type' => 'Individual',
128 'contact_sub_type' => $this->subTypeHousehold,
129 ];
130 $contact = $this->callAPIFailure('contact', 'create', $contactParams);
131
132 // check for Type:Organization Subtype:sub_individual
133 $contactParams = [
134 'organization_name' => 'Compumentor',
135 'contact_type' => 'Organization',
136 'contact_sub_type' => $this->subTypeIndividual,
137 ];
138 $contact = $this->callAPIFailure('contact', 'create', $contactParams);
139 }
140
141 /**
142 * Test update with no subtype to valid subtype.
143 * success expected
144 * @param int $version
145 * @dataProvider versionThreeAndFour
146 */
147 public function testContactUpdateNoSubtypeValid($version) {
148 $this->_apiversion = $version;
149
150 // check for Type:Individual
151 $contactParams = [
152 'first_name' => 'Anne',
153 'last_name' => 'Grant',
154 'contact_type' => 'Individual',
155 ];
156 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
157 // subype:sub_individual
158 $updateParams = [
159 'first_name' => 'John',
160 'last_name' => 'Grant',
161 'contact_id' => $contact['id'],
162 'contact_type' => 'Individual',
163 'contact_sub_type' => $this->subTypeIndividual,
164 ];
165 $updateContact = $this->callAPISuccess('contact', 'create', $updateParams);
166 $this->assertEquals($updateContact['id'], $contact['id'], "In line " . __LINE__);
167
168 $params = [
169 'contact_id' => $contact['id'],
170 ];
171 $getContacts = $this->callAPISuccess('contact', 'get', $params);
172 $result = $getContacts['values'][$contact['id']];
173
174 $this->assertEquals($result['first_name'], $updateParams['first_name'], "In line " . __LINE__);
175 $this->assertEquals($result['last_name'], $updateParams['last_name'], "In line " . __LINE__);
176 $this->assertEquals($result['contact_type'], $updateParams['contact_type'], "In line " . __LINE__);
177 $this->assertEquals(end($result['contact_sub_type']), $updateParams['contact_sub_type'], "In line " . __LINE__);
178 $this->callAPISuccess('contact', 'delete', $params);
179
180 // check for Type:Organization
181 $contactParams = [
182 'organization_name' => 'Compumentor',
183 'contact_type' => 'Organization',
184 ];
185 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
186
187 // subype:sub_organization
188 $updateParams = [
189 'organization_name' => 'Intel Arts',
190 'contact_id' => $contact['id'],
191 'contact_type' => 'Organization',
192 'contact_sub_type' => $this->subTypeOrganization,
193 ];
194 $updateContact = $this->callAPISuccess('contact', 'create', $updateParams);
195 $this->assertEquals($updateContact['id'], $contact['id'], "In line " . __LINE__);
196
197 $params = [
198 'contact_id' => $contact['id'],
199 ];
200 $getContacts = $this->callAPISuccess('contact', 'get', $params);
201 $result = $getContacts['values'][$contact['id']];
202
203 $this->assertEquals($result['organization_name'], $updateParams['organization_name'], "In line " . __LINE__);
204 $this->assertEquals($result['contact_type'], $updateParams['contact_type'], "In line " . __LINE__);
205 $this->assertEquals(end($result['contact_sub_type']), $updateParams['contact_sub_type'], "In line " . __LINE__);
206 $this->callAPISuccess('contact', 'delete', $params);
207 }
208
209 /**
210 * Test update with no subtype to invalid subtype.
211 * @param int $version
212 * @dataProvider versionThreeAndFour
213 */
214 public function testContactUpdateNoSubtypeInvalid($version) {
215 $this->_apiversion = $version;
216
217 // check for Type:Individual
218 $contactParams = [
219 'first_name' => 'Anne',
220 'last_name' => 'Grant',
221 'contact_type' => 'Individual',
222 ];
223 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
224
225 // subype:sub_household
226 $updateParams = [
227 'first_name' => 'John',
228 'last_name' => 'Grant',
229 'contact_id' => $contact['id'],
230 'contact_type' => 'Individual',
231 'contact_sub_type' => $this->subTypeHousehold,
232 ];
233 $updateContact = $this->callAPIFailure('contact', 'create', $updateParams);
234 $params = [
235 'contact_id' => $contact['id'],
236 ];
237 $this->callAPISuccess('contact', 'delete', $params);
238
239 // check for Type:Organization
240 $contactParams = [
241 'organization_name' => 'Compumentor',
242 'contact_type' => 'Organization',
243 ];
244 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
245
246 $updateParams = [
247 'organization_name' => 'Intel Arts',
248 'contact_id' => $contact['id'],
249 'contact_type' => 'Organization',
250 'contact_sub_type' => $this->subTypeIndividual,
251 ];
252 $updateContact = $this->callAPIFailure('contact', 'create', $updateParams);
253 $params = [
254 'contact_id' => $contact['id'],
255 ];
256 $this->callAPISuccess('contact', 'delete', $params);
257 }
258
259 /**
260 * Test update with no subtype to valid subtype.
261 * success expected
262 * @param int $version
263 * @dataProvider versionThreeAndFour
264 */
265 public function testContactUpdateSubtypeValid($version) {
266 $this->_apiversion = $version;
267
268 $params = [
269 'label' => 'sub2_individual',
270 'name' => 'sub2_individual',
271 // Individual
272 'parent_id' => 1,
273 'is_active' => 1,
274 ];
275 $getSubtype = CRM_Contact_BAO_ContactType::add($params);
276 $subtype = $params['name'];
277
278 // check for Type:Individual subype:sub_individual
279 $contactParams = [
280 'first_name' => 'Anne',
281 'last_name' => 'Grant',
282 'contact_type' => 'Individual',
283 'contact_sub_type' => $this->subTypeIndividual,
284 ];
285 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
286 // subype:sub2_individual
287 $updateParams = [
288 'id' => $contact['id'],
289 'first_name' => 'John',
290 'last_name' => 'Grant',
291 'contact_id' => $contact['id'],
292 'contact_type' => 'Individual',
293 'contact_sub_type' => $subtype,
294 ];
295 $updateContact = $this->callAPISuccess('contact', 'create', $updateParams);
296
297 $this->assertEquals($updateContact['id'], $contact['id'], "In line " . __LINE__);
298
299 $params = [
300 'contact_id' => $contact['id'],
301 ];
302 $getContacts = $this->callAPISuccess('contact', 'get', $params);
303 $result = $getContacts['values'][$contact['id']];
304
305 $this->assertEquals($result['first_name'], $updateParams['first_name'], "In line " . __LINE__);
306 $this->assertEquals($result['last_name'], $updateParams['last_name'], "In line " . __LINE__);
307 $this->assertEquals($result['contact_type'], $updateParams['contact_type'], "In line " . __LINE__);
308 $this->assertEquals(end($result['contact_sub_type']), $updateParams['contact_sub_type'], "In line " . __LINE__);
309 $this->callAPISuccess('contact', 'delete', $params);
310
311 $params = [
312 'label' => 'sub2_organization',
313 'name' => 'sub2_organization',
314 // Organization
315 'parent_id' => 3,
316 'is_active' => 1,
317 ];
318 $getSubtype = CRM_Contact_BAO_ContactType::add($params);
319 $subtype = $params['name'];
320
321 // check for Type:Organization subype:sub_organization
322 $contactParams = [
323 'organization_name' => 'Compumentor',
324 'contact_type' => 'Organization',
325 'contact_sub_type' => $this->subTypeOrganization,
326 ];
327 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
328
329 // subype:sub2_organization
330 $updateParams = [
331 'organization_name' => 'Intel Arts',
332 'contact_id' => $contact['id'],
333 'contact_type' => 'Organization',
334 'contact_sub_type' => $subtype,
335 ];
336 $updateContact = $this->callAPISuccess('contact', 'create', $updateParams);
337 $this->assertEquals($updateContact['id'], $contact['id'], "In line " . __LINE__);
338
339 $params = [
340 'contact_id' => $contact['id'],
341 ];
342 $getContacts = $this->callAPISuccess('contact', 'get', $params);
343 $result = $getContacts['values'][$contact['id']];
344
345 $this->assertEquals($result['organization_name'], $updateParams['organization_name'], "In line " . __LINE__);
346 $this->assertEquals($result['contact_type'], $updateParams['contact_type'], "In line " . __LINE__);
347 $this->assertEquals(end($result['contact_sub_type']), $updateParams['contact_sub_type'], "In line " . __LINE__);
348 $this->callAPISuccess('contact', 'delete', $params);
349 }
350
351 /**
352 * Test update with no subtype to invalid subtype.
353 * @param int $version
354 * @dataProvider versionThreeAndFour
355 */
356 public function testContactUpdateSubtypeInvalid($version) {
357 $this->_apiversion = $version;
358
359 // check for Type:Individual subtype:sub_individual
360 $contactParams = [
361 'first_name' => 'Anne',
362 'last_name' => 'Grant',
363 'contact_type' => 'Individual',
364 'contact_sub_type' => $this->subTypeIndividual,
365 ];
366 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
367
368 // subype:sub_household
369 $updateParams = [
370 'first_name' => 'John',
371 'last_name' => 'Grant',
372 'contact_id' => $contact['id'],
373 'contact_type' => 'Individual',
374 'contact_sub_type' => $this->subTypeHousehold,
375 ];
376 $updateContact = $this->callAPIFailure('contact', 'create', $updateParams);
377 $params = [
378 'contact_id' => $contact['id'],
379 ];
380 $this->callAPISuccess('contact', 'delete', $params);
381
382 // check for Type:Organization subtype:
383 $contactParams = [
384 'organization_name' => 'Compumentor',
385 'contact_type' => 'Organization',
386 'contact_sub_type' => $this->subTypeOrganization,
387 ];
388 $contact = $this->callAPISuccess('contact', 'create', $contactParams);
389
390 $updateParams = [
391 'organization_name' => 'Intel Arts',
392 'contact_id' => $contact['id'],
393 'contact_sub_type' => $this->subTypeIndividual,
394 ];
395 $updateContact = $this->callAPIFailure('contact', 'create', $updateParams);
396 $params = [
397 'contact_id' => $contact['id'],
398 ];
399 $this->callAPISuccess('contact', 'delete', $params);
400 }
401
402 }