Merge pull request #15061 from eileenmcnaughton/agile
[civicrm-core.git] / tests / phpunit / CRM / Contact / BAO / ContactType / ContactTest.php
1 <?php
2
3 /**
4 * Class CRM_Contact_BAO_ContactType_ContactTest
5 * @group headless
6 */
7 class CRM_Contact_BAO_ContactType_ContactTest extends CiviUnitTestCase {
8
9 public function setUp() {
10 parent::setUp();
11
12 $params = [
13 'label' => 'indiv_student',
14 'name' => 'indiv_student',
15 // Individual
16 'parent_id' => 1,
17 'is_active' => 1,
18 ];
19 $result = CRM_Contact_BAO_ContactType::add($params);
20 $this->student = $params['name'];
21
22 $params = [
23 'label' => 'indiv_parent',
24 'name' => 'indiv_parent',
25 // Individual
26 'parent_id' => 1,
27 'is_active' => 1,
28 ];
29 $result = CRM_Contact_BAO_ContactType::add($params);
30 $this->parent = $params['name'];
31
32 $params = [
33 'label' => 'org_sponsor',
34 'name' => 'org_sponsor',
35 // Organization
36 'parent_id' => 3,
37 'is_active' => 1,
38 ];
39 $result = CRM_Contact_BAO_ContactType::add($params);
40 $this->sponsor = $params['name'];
41
42 $params = [
43 'label' => 'org_team',
44 'name' => 'org_team',
45 // Organization
46 'parent_id' => 3,
47 'is_active' => 1,
48 ];
49 $result = CRM_Contact_BAO_ContactType::add($params);
50 $this->team = $params['name'];
51 }
52
53 public function tearDown() {
54 $this->quickCleanup(['civicrm_contact']);
55 $query = "
56 DELETE FROM civicrm_contact_type
57 WHERE name IN ('{$this->student}','{$this->parent}','{$this->sponsor}', '{$this->team}');";
58 CRM_Core_DAO::executeQuery($query);
59 }
60
61 /**
62 * Methods create Contact with valid data.
63 *
64 * Success expected
65 */
66 public function testCreateContact() {
67 //check for Type:Individual
68 $params = [
69 'first_name' => 'Anne',
70 'last_name' => 'Grant',
71 'contact_type' => 'Individual',
72 ];
73 try {
74 $contact = CRM_Contact_BAO_Contact::add($params);
75 }
76 catch (Exception$expected) {
77 }
78 $this->assertEquals($contact->first_name, 'Anne');
79 $this->assertEquals($contact->contact_type, 'Individual');
80 CRM_Contact_BAO_Contact::deleteContact($contact->id);
81
82 //check for Type:Organization
83 $params = [
84 'organization_name' => 'Compumentor',
85 'contact_type' => 'Organization',
86 ];
87 try {
88 $contact = CRM_Contact_BAO_Contact::add($params);
89 }
90 catch (Exception$expected) {
91 }
92 $this->assertEquals($contact->organization_name, 'Compumentor');
93 $this->assertEquals($contact->contact_type, 'Organization');
94 CRM_Contact_BAO_Contact::deleteContact($contact->id);
95
96 //check for Type:Household
97 $params = [
98 'household_name' => 'John Does home',
99 'contact_type' => 'Household',
100 ];
101 try {
102 $contact = CRM_Contact_BAO_Contact::add($params);
103 }
104 catch (Exception$expected) {
105 }
106 $this->assertEquals($contact->household_name, 'John Does home');
107 $this->assertEquals($contact->contact_type, 'Household');
108 CRM_Contact_BAO_Contact::deleteContact($contact->id);
109
110 //check for Type:Individual, Subtype:Student
111 $params = [
112 'first_name' => 'Bill',
113 'last_name' => 'Adams',
114 'contact_type' => 'Individual',
115 'contact_sub_type' => $this->student,
116 ];
117 try {
118 $contact = CRM_Contact_BAO_Contact::add($params);
119 }
120 catch (Exception$expected) {
121 }
122 $this->assertEquals($contact->first_name, 'Bill');
123 $this->assertEquals($contact->contact_type, 'Individual');
124 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $contact->contact_sub_type), $this->student);
125 CRM_Contact_BAO_Contact::deleteContact($contact->id);
126
127 //check for Type:Organization, Subtype:Sponsor
128 $params = [
129 'organization_name' => 'Conservation Corp',
130 'contact_type' => 'Organization',
131 'contact_sub_type' => $this->sponsor,
132 ];
133 try {
134 $contact = CRM_Contact_BAO_Contact::add($params);
135 }
136 catch (Exception$expected) {
137 }
138 $this->assertEquals($contact->organization_name, 'Conservation Corp');
139 $this->assertEquals($contact->contact_type, 'Organization');
140 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $contact->contact_sub_type), $this->sponsor);
141 CRM_Contact_BAO_Contact::deleteContact($contact->id);
142 }
143
144 /**
145 * Update the contact with no subtype to a valid subtype.
146 *
147 * Success expected.
148 */
149 public function testUpdateContactNoSubtypeToValid() {
150 $params = [
151 'first_name' => 'Anne',
152 'last_name' => 'Grant',
153 'contact_type' => 'Individual',
154 ];
155 try {
156 $contact = CRM_Contact_BAO_Contact::add($params);
157 }
158 catch (Exception$expected) {
159 }
160 $updateParams = [
161 'contact_sub_type' => $this->student,
162 'contact_type' => 'Individual',
163 'contact_id' => $contact->id,
164 ];
165 try {
166 $updatedContact = CRM_Contact_BAO_Contact::add($updateParams);
167 }
168 catch (Exception$expected) {
169 }
170 $this->assertEquals($updatedContact->id, $contact->id);
171 $this->assertEquals($updatedContact->contact_type, 'Individual');
172 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $updatedContact->contact_sub_type), $this->student);
173 CRM_Contact_BAO_Contact::deleteContact($contact->id);
174
175 $params = [
176 'organization_name' => 'Compumentor',
177 'contact_type' => 'Organization',
178 ];
179 try {
180 $contact = CRM_Contact_BAO_Contact::add($params);
181 }
182 catch (Exception$expected) {
183 }
184
185 $updateParams = [
186 'contact_sub_type' => $this->sponsor,
187 'contact_type' => 'Organization',
188 'contact_id' => $contact->id,
189 ];
190 try {
191 $updatedContact = CRM_Contact_BAO_Contact::add($updateParams);
192 }
193 catch (Exception$expected) {
194 }
195 $this->assertEquals($updatedContact->id, $contact->id);
196 $this->assertEquals($updatedContact->contact_type, 'Organization');
197 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $updatedContact->contact_sub_type), $this->sponsor);
198 CRM_Contact_BAO_Contact::deleteContact($contact->id);
199 }
200
201 /**
202 * Update the contact with subtype to another valid subtype.
203 * success expected
204 */
205 public function testUpdateContactSubtype() {
206 $params = [
207 'first_name' => 'Anne',
208 'last_name' => 'Grant',
209 'contact_type' => 'Individual',
210 'contact_sub_type' => $this->student,
211 ];
212 try {
213 $contact = CRM_Contact_BAO_Contact::add($params);
214 }
215 catch (Exception$expected) {
216 }
217
218 $updateParams = [
219 'contact_sub_type' => $this->parent,
220 'contact_type' => 'Individual',
221 'contact_id' => $contact->id,
222 ];
223 try {
224 $updatedContact = CRM_Contact_BAO_Contact::add($updateParams);
225 }
226 catch (Exception$expected) {
227 }
228 $this->assertEquals($updatedContact->id, $contact->id);
229 $this->assertEquals($updatedContact->contact_type, 'Individual');
230 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $updatedContact->contact_sub_type), $this->parent);
231 CRM_Contact_BAO_Contact::deleteContact($contact->id);
232
233 $params = [
234 'organization_name' => 'Compumentor',
235 'contact_type' => 'Organization',
236 'contact_sub_type' => $this->sponsor,
237 ];
238 try {
239 $contact = CRM_Contact_BAO_Contact::add($params);
240 }
241 catch (Exception$expected) {
242 }
243
244 $updateParams = [
245 'contact_sub_type' => $this->team,
246 'contact_type' => 'Organization',
247 'contact_id' => $contact->id,
248 ];
249 try {
250 $updatedContact = CRM_Contact_BAO_Contact::add($updateParams);
251 }
252 catch (Exception$expected) {
253 }
254
255 $this->assertEquals($updatedContact->id, $contact->id);
256 $this->assertEquals($updatedContact->contact_type, 'Organization');
257 $this->assertEquals(str_replace(CRM_Core_DAO::VALUE_SEPARATOR, '', $updatedContact->contact_sub_type), $this->team);
258 CRM_Contact_BAO_Contact::deleteContact($contact->id);
259
260 $params = [
261 'first_name' => 'Anne',
262 'last_name' => 'Grant',
263 'contact_type' => 'Individual',
264 'contact_sub_type' => $this->student,
265 ];
266 try {
267 $contact = CRM_Contact_BAO_Contact::add($params);
268 }
269 catch (Exception$expected) {
270 }
271
272 $updateParams = [
273 'contact_sub_type' => 'null',
274 'contact_type' => 'Individual',
275 'contact_id' => $contact->id,
276 ];
277 try {
278 $updatedContact = CRM_Contact_BAO_Contact::add($updateParams);
279 }
280 catch (Exception$expected) {
281 }
282
283 $this->assertEquals($updatedContact->id, $contact->id);
284 $this->assertEquals($updatedContact->contact_type, 'Individual');
285 $this->assertEquals($updatedContact->contact_sub_type, 'null');
286 CRM_Contact_BAO_Contact::deleteContact($contact->id);
287 }
288
289 /**
290 * Unit test to ensure that removing any subtype from CustomGroup's
291 * extend_for setting, won't delete any custom data of contact
292 *
293 * Success expected
294 */
295 public function testCRM19133() {
296 $subtypesToPreserve = [$this->student, $this->parent];
297
298 // Create custom group that extends student and parent subtype
299 $apiParams = [
300 'title' => 'custom group',
301 'extends' => ['Individual', $subtypesToPreserve],
302 'is_active' => TRUE,
303 ];
304 $result = civicrm_api3('customGroup', 'create', $apiParams);
305 $customGroupId = $result['id'];
306
307 // Create desired custom field
308 $apiParams = [
309 'debug' => 1,
310 'custom_group_id' => $result['id'],
311 'label' => 'custom field',
312 'html_type' => 'Text',
313 'data_type' => 'String',
314 'is_active' => TRUE,
315 ];
316 $result = civicrm_api3('custom_field', 'create', $apiParams);
317 $customFieldId = $result['id'];
318
319 // Create contact of subtype parent and student
320 $params = [
321 'first_name' => 'Anne',
322 'last_name' => 'Grant',
323 'contact_type' => 'Individual',
324 'contact_sub_type' => [$this->student, $this->parent],
325 ];
326 $contact = CRM_Contact_BAO_Contact::add($params);
327
328 // Record custom value for desired customGroup
329 $this->callAPISuccess('CustomValue', 'create', [
330 'entity_id' => $contact->id,
331 'custom_' . $customFieldId => 'value 1',
332 ]);
333
334 // Subtype to be removed from customGroup setting
335 $subtypesToBeRemoved = [$this->student];
336 CRM_Contact_BAO_ContactType::deleteCustomRowsOfSubtype($customGroupId, $subtypesToBeRemoved, $subtypesToPreserve);
337
338 // Check with correct value to assert that custom data is not deleted
339 $result = $this->callAPISuccess('Contact', 'Get', ['custom_' . $customFieldId => 'value 1']);
340 $this->assertEquals(1, $result['count']);
341 $this->assertEquals($contact->id, $result['id']);
342
343 //Check with incorrect custom value that our previous assertion was correct
344 $result = $this->callAPISuccess('Contact', 'Get', ['custom_' . $customFieldId => 'wrong value']);
345 $this->assertEquals(0, $result['count']);
346 }
347
348 }