Merge pull request #17679 from civicrm/5.27
[civicrm-core.git] / tests / phpunit / CRM / Contact / BAO / ContactType / ContactTypeTest.php
1 <?php
2 use Civi\Api4\ContactType;
3
4 /**
5 * Class CRM_Contact_BAO_ContactType_ContactTypeTest
6 * @group headless
7 */
8 class CRM_Contact_BAO_ContactType_ContactTypeTest extends CiviUnitTestCase {
9
10 public function setUp() {
11 parent::setUp();
12 $params = [
13 'label' => 'sub1_individual',
14 'name' => 'sub1_individual',
15 'parent_id:name' => 'Individual',
16 'is_active' => 1,
17 ];
18
19 $this->ids['ContactType'][] = ContactType::create()->setValues($params)->execute()->first()['id'];
20
21 $params = [
22 'label' => 'sub2_individual',
23 'name' => 'sub2_individual',
24 'parent_id:name' => 'Individual',
25 'is_active' => 1,
26 ];
27
28 $this->ids['ContactType'][] = ContactType::create()->setValues($params)->execute()->first()['id'];
29
30 $params = [
31 'label' => 'sub_organization',
32 'name' => 'sub_organization',
33 'parent_id:name' => 'Organization',
34 'is_active' => 1,
35 ];
36
37 $this->ids['ContactType'][] = ContactType::create()->setValues($params)->execute()->first()['id'];
38
39 $params = [
40 'label' => 'sub_household',
41 'name' => 'sub_household',
42 'parent_id:name' => 'Household',
43 'is_active' => 1,
44 ];
45 $this->ids['ContactType'][] = ContactType::create()->setValues($params)->execute()->first()['id'];
46 }
47
48 /**
49 * Cleanup contact types.
50 *
51 * @throws \API_Exception
52 * @throws \Civi\API\Exception\UnauthorizedException
53 */
54 public function tearDown() {
55 parent::tearDown();
56 ContactType::delete()->addWhere('id', 'IN', $this->ids['ContactType'])->execute();
57 }
58
59 /**
60 * Test contactTypes() and subTypes() methods return correct contact types.
61 */
62 public function testGetMethods() {
63 $result = CRM_Contact_BAO_ContactType::contactTypes(TRUE);
64 $this->assertEquals(array_keys($this->getExpectedContactTypes()), $result);
65
66 // check for type:Individual
67 $result = CRM_Contact_BAO_ContactType::subTypes('Individual');
68 $this->assertEquals(array_keys($this->getExpectedContactSubTypes('Individual')), $result);
69
70 // check for type:Organization
71 $result = CRM_Contact_BAO_ContactType::subTypes('Organization');
72 $this->assertEquals(array_keys($this->getExpectedContactSubTypes('Organization')), $result);
73
74 // check for type:Household
75 $result = CRM_Contact_BAO_ContactType::subTypes('Household');
76 $this->assertEquals(array_keys($this->getExpectedContactSubTypes('Household')), $result);
77
78 // check for all contact types
79 $result = CRM_Contact_BAO_ContactType::subTypes();
80 $subtypes = array_keys($this->getExpectedAllSubtypes());
81 $this->assertEquals(sort($subtypes), sort($result));
82 }
83
84 /**
85 * Test subTypes() methods with invalid data
86 */
87 public function testGetMethodsInvalid() {
88
89 $params = 'invalid';
90 $result = CRM_Contact_BAO_ContactType::subTypes($params);
91 $this->assertEquals(empty($result), TRUE);
92
93 $params = ['invalid'];
94 $result = CRM_Contact_BAO_ContactType::subTypes($params);
95 $this->assertEquals(empty($result), TRUE);
96 }
97
98 /**
99 * Test function for getting contact types.
100 *
101 * @throws \API_Exception
102 */
103 public function testContactTypeInfo() {
104 $blahType = ['is_active' => 0, 'name' => 'blah', 'label' => 'blah blah', 'parent_id:name' => 'Individual'];
105 $createdType = ContactType::create()->setValues($blahType)->execute()->first();
106 $activeTypes = CRM_Contact_BAO_ContactType::contactTypeInfo();
107 $expected = $this->getExpectedContactTypes();
108 $this->assertEquals($expected, $activeTypes);
109 $allTypes = CRM_Contact_BAO_ContactType::contactTypeInfo(TRUE);
110 $expected['blah'] = [
111 'is_active' => 0,
112 'name' => 'blah',
113 'label' => 'blah blah',
114 'id' => $createdType['id'],
115 'parent_id' => 1,
116 'is_reserved' => 0,
117 'parent' => 'Individual',
118 'parent_label' => 'Individual',
119 ];
120 $this->assertEquals($expected, $allTypes);
121 }
122
123 /**
124 * Get all expected types.
125 *
126 * @return array
127 */
128 public function getExpectedContactTypes() {
129 return [
130 'Individual' =>
131 [
132 'id' => '1',
133 'name' => 'Individual',
134 'label' => 'Individual',
135 'is_active' => '1',
136 'is_reserved' => '1',
137 ],
138 'Household' =>
139 [
140 'id' => '2',
141 'name' => 'Household',
142 'label' => 'Household',
143 'is_active' => '1',
144 'is_reserved' => '1',
145 ],
146 'Organization' =>
147 [
148 'id' => '3',
149 'name' => 'Organization',
150 'label' => 'Organization',
151 'is_active' => '1',
152 'is_reserved' => '1',
153 ],
154 'Student' =>
155 [
156 'id' => '4',
157 'name' => 'Student',
158 'label' => 'Student',
159 'parent_id' => '1',
160 'is_active' => '1',
161 'is_reserved' => '0',
162 'parent' => 'Individual',
163 'parent_label' => 'Individual',
164 ],
165 'Parent' =>
166 [
167 'id' => '5',
168 'name' => 'Parent',
169 'label' => 'Parent',
170 'parent_id' => '1',
171 'is_active' => '1',
172 'is_reserved' => '0',
173 'parent' => 'Individual',
174 'parent_label' => 'Individual',
175 ],
176 'Staff' =>
177 [
178 'id' => '6',
179 'name' => 'Staff',
180 'label' => 'Staff',
181 'parent_id' => '1',
182 'is_active' => '1',
183 'is_reserved' => '0',
184 'parent' => 'Individual',
185 'parent_label' => 'Individual',
186 ],
187 'Team' =>
188 [
189 'id' => '7',
190 'name' => 'Team',
191 'label' => 'Team',
192 'parent_id' => '3',
193 'is_active' => '1',
194 'is_reserved' => '0',
195 'parent' => 'Organization',
196 'parent_label' => 'Organization',
197 ],
198 'Sponsor' =>
199 [
200 'id' => '8',
201 'name' => 'Sponsor',
202 'label' => 'Sponsor',
203 'parent_id' => '3',
204 'is_active' => '1',
205 'is_reserved' => '0',
206 'parent' => 'Organization',
207 'parent_label' => 'Organization',
208 ],
209 'sub1_individual' =>
210 [
211 'id' => $this->ids['ContactType'][0],
212 'name' => 'sub1_individual',
213 'label' => 'sub1_individual',
214 'parent_id' => '1',
215 'is_active' => '1',
216 'is_reserved' => '0',
217 'parent' => 'Individual',
218 'parent_label' => 'Individual',
219 ],
220 'sub2_individual' =>
221 [
222 'id' => $this->ids['ContactType'][1],
223 'name' => 'sub2_individual',
224 'label' => 'sub2_individual',
225 'parent_id' => '1',
226 'is_active' => '1',
227 'is_reserved' => '0',
228 'parent' => 'Individual',
229 'parent_label' => 'Individual',
230 ],
231 'sub_organization' =>
232 [
233 'id' => $this->ids['ContactType'][2],
234 'name' => 'sub_organization',
235 'label' => 'sub_organization',
236 'parent_id' => '3',
237 'is_active' => '1',
238 'is_reserved' => '0',
239 'parent' => 'Organization',
240 'parent_label' => 'Organization',
241 ],
242 'sub_household' =>
243 [
244 'id' => $this->ids['ContactType'][3],
245 'name' => 'sub_household',
246 'label' => 'sub_household',
247 'parent_id' => '2',
248 'is_active' => '1',
249 'is_reserved' => '0',
250 'parent' => 'Household',
251 'parent_label' => 'Household',
252 ],
253 ];
254 }
255
256 /**
257 * Get subtypes for all main types.
258 *
259 * @return array
260 */
261 public function getExpectedAllSubtypes() {
262 return array_merge(
263 $this->getExpectedContactSubTypes('Individual'),
264 $this->getExpectedContactSubTypes('Household'),
265 $this->getExpectedContactSubTypes('Organization')
266 );
267 }
268
269 /**
270 * Get the expected subtypes of the given contact type.
271 *
272 * @param string $parentType
273 *
274 * @return array
275 */
276 public function getExpectedContactSubTypes($parentType) {
277 $expected = $this->getExpectedContactTypes();
278 foreach ($expected as $index => $values) {
279 if (($values['parent_label'] ?? '') !== $parentType) {
280 unset($expected[$index]);
281 }
282 }
283 return $expected;
284 }
285
286 /**
287 * Test add() methods with valid data
288 * success expected
289 */
290 public function testAdd() {
291
292 $params = [
293 'label' => 'indiviSubType',
294 'name' => 'indiviSubType',
295 'parent_id' => 1,
296 'is_active' => 1,
297 ];
298 $result = CRM_Contact_BAO_ContactType::add($params);
299 $this->assertEquals($result->label, $params['label']);
300 $this->assertEquals($result->name, $params['name']);
301 $this->assertEquals($result->parent_id, $params['parent_id']);
302 $this->assertEquals($result->is_active, $params['is_active']);
303 CRM_Contact_BAO_ContactType::del($result->id);
304
305 $params = [
306 'label' => 'householdSubType',
307 'name' => 'householdSubType',
308 'parent_id' => 2,
309 'is_active' => 0,
310 ];
311 $result = CRM_Contact_BAO_ContactType::add($params);
312 $this->assertEquals($result->label, $params['label']);
313 $this->assertEquals($result->name, $params['name']);
314 $this->assertEquals($result->parent_id, $params['parent_id']);
315 $this->assertEquals($result->is_active, $params['is_active']);
316 CRM_Contact_BAO_ContactType::del($result->id);
317 }
318
319 /**
320 * Test add() with invalid data
321 */
322 public function testAddInvalid1() {
323
324 // parent id does not exist in db
325 $params = [
326 'label' => 'subType',
327 'name' => 'subType',
328 // non existent
329 'parent_id' => 100,
330 'is_active' => 1,
331 ];
332 $result = CRM_Contact_BAO_ContactType::add($params);
333 $this->assertEquals($result, NULL);
334 }
335
336 public function testAddInvalid2() {
337
338 // params does not have name and label keys
339 $params = [
340 'parent_id' => 1,
341 'is_active' => 1,
342 ];
343 $result = CRM_Contact_BAO_ContactType::add($params);
344 $this->assertEquals($result, NULL);
345 }
346
347 public function testAddInvalid3() {
348
349 // params does not have parent_id
350 $params = [
351 'label' => 'subType',
352 'name' => 'subType',
353 'is_active' => 1,
354 ];
355 $result = CRM_Contact_BAO_ContactType::add($params);
356 $this->assertEquals($result, NULL);
357 }
358
359 /**
360 * Test del() with valid data.
361 */
362 public function testDel() {
363
364 $params = [
365 'label' => 'indiviSubType',
366 'name' => 'indiviSubType',
367 'parent_id' => 1,
368 'is_active' => 1,
369 ];
370 $subtype = CRM_Contact_BAO_ContactType::add($params);
371 $result = CRM_Contact_BAO_ContactType::subTypes();
372 $this->assertEquals(TRUE, in_array($subtype->name, $result, TRUE));
373 $this->callAPISuccess('ContactType', 'delete', ['id' => $subtype->id]);
374
375 $result = CRM_Contact_BAO_ContactType::subTypes();
376 $this->assertEquals(FALSE, in_array($subtype->name, $result, TRUE));
377 }
378
379 /**
380 * Test del() with invalid data
381 */
382 public function testDelInvalid() {
383 $del = CRM_Contact_BAO_ContactType::del(NULL);
384 $this->assertEquals($del, FALSE);
385 }
386
387 }