Merge pull request #17953 from civicrm/5.28
[civicrm-core.git] / tests / phpunit / api / v4 / Action / BasicCustomFieldTest.php
1 <?php
2
3 /*
4 +--------------------------------------------------------------------+
5 | Copyright CiviCRM LLC. All rights reserved. |
6 | |
7 | This work is published under the GNU AGPLv3 license with some |
8 | permitted exceptions and without any warranty. For full license |
9 | and copyright information, see https://civicrm.org/licensing |
10 +--------------------------------------------------------------------+
11 */
12
13 /**
14 *
15 * @package CRM
16 * @copyright CiviCRM LLC https://civicrm.org/licensing
17 */
18
19
20 namespace api\v4\Action;
21
22 use Civi\Api4\Contact;
23 use Civi\Api4\CustomField;
24 use Civi\Api4\CustomGroup;
25
26 /**
27 * @group headless
28 */
29 class BasicCustomFieldTest extends BaseCustomValueTest {
30
31 public function testWithSingleField() {
32
33 $customGroup = CustomGroup::create(FALSE)
34 ->addValue('name', 'MyIndividualFields')
35 ->addValue('extends', 'Individual')
36 ->execute()
37 ->first();
38
39 CustomField::create(FALSE)
40 ->addValue('label', 'FavColor')
41 ->addValue('custom_group_id', $customGroup['id'])
42 ->addValue('html_type', 'Text')
43 ->addValue('data_type', 'String')
44 ->execute();
45
46 // Individual fields should show up when contact_type = null|Individual but not other contact types
47 $getFields = Contact::getFields(FALSE);
48 $this->assertContains('MyIndividualFields.FavColor', $getFields->execute()->column('name'));
49 $this->assertContains('MyIndividualFields.FavColor', $getFields->setValues(['contact_type' => 'Individual'])->execute()->column('name'));
50 $this->assertNotContains('MyIndividualFields.FavColor', $getFields->setValues(['contact_type' => 'Household'])->execute()->column('name'));
51
52 $contactId = Contact::create(FALSE)
53 ->addValue('first_name', 'Johann')
54 ->addValue('last_name', 'Tester')
55 ->addValue('contact_type', 'Individual')
56 ->addValue('MyIndividualFields.FavColor', 'Red')
57 ->execute()
58 ->first()['id'];
59
60 $contact = Contact::get(FALSE)
61 ->addSelect('first_name')
62 ->addSelect('MyIndividualFields.FavColor')
63 ->addWhere('id', '=', $contactId)
64 ->addWhere('MyIndividualFields.FavColor', '=', 'Red')
65 ->execute()
66 ->first();
67
68 $this->assertEquals('Red', $contact['MyIndividualFields.FavColor']);
69
70 Contact::update()
71 ->addWhere('id', '=', $contactId)
72 ->addValue('MyIndividualFields.FavColor', 'Blue')
73 ->execute();
74
75 $contact = Contact::get(FALSE)
76 ->addSelect('MyIndividualFields.FavColor')
77 ->addWhere('id', '=', $contactId)
78 ->execute()
79 ->first();
80
81 $this->assertEquals('Blue', $contact['MyIndividualFields.FavColor']);
82 }
83
84 public function testWithTwoFields() {
85
86 // First custom set
87 CustomGroup::create(FALSE)
88 ->addValue('name', 'MyContactFields')
89 ->addValue('extends', 'Contact')
90 ->addChain('field1', CustomField::create()
91 ->addValue('label', 'FavColor')
92 ->addValue('custom_group_id', '$id')
93 ->addValue('html_type', 'Text')
94 ->addValue('data_type', 'String'))
95 ->addChain('field2', CustomField::create()
96 ->addValue('label', 'FavFood')
97 ->addValue('custom_group_id', '$id')
98 ->addValue('html_type', 'Text')
99 ->addValue('data_type', 'String'))
100 ->execute();
101
102 // Second custom set
103 CustomGroup::create(FALSE)
104 ->addValue('name', 'MyContactFields2')
105 ->addValue('extends', 'Contact')
106 ->addChain('field1', CustomField::create()
107 ->addValue('label', 'FavColor')
108 ->addValue('custom_group_id', '$id')
109 ->addValue('html_type', 'Text')
110 ->addValue('data_type', 'String'))
111 ->addChain('field2', CustomField::create()
112 ->addValue('label', 'FavFood')
113 ->addValue('custom_group_id', '$id')
114 ->addValue('html_type', 'Text')
115 ->addValue('data_type', 'String'))
116 ->execute();
117
118 $contactId1 = Contact::create(FALSE)
119 ->addValue('first_name', 'Johann')
120 ->addValue('last_name', 'Tester')
121 ->addValue('MyContactFields.FavColor', 'Red')
122 ->addValue('MyContactFields.FavFood', 'Cherry')
123 ->execute()
124 ->first()['id'];
125
126 $contactId2 = Contact::create(FALSE)
127 ->addValue('first_name', 'MaryLou')
128 ->addValue('last_name', 'Tester')
129 ->addValue('MyContactFields.FavColor', 'Purple')
130 ->addValue('MyContactFields.FavFood', 'Grapes')
131 ->execute()
132 ->first()['id'];
133
134 $contact = Contact::get(FALSE)
135 ->addSelect('first_name')
136 ->addSelect('MyContactFields.FavColor')
137 ->addSelect('MyContactFields.FavFood')
138 ->addWhere('id', '=', $contactId1)
139 ->addWhere('MyContactFields.FavColor', '=', 'Red')
140 ->addWhere('MyContactFields.FavFood', '=', 'Cherry')
141 ->execute()
142 ->first();
143
144 $this->assertArrayHasKey('MyContactFields.FavColor', $contact);
145 $this->assertEquals('Red', $contact['MyContactFields.FavColor']);
146
147 // Update 2nd set and ensure 1st hasn't changed
148 Contact::update()
149 ->addWhere('id', '=', $contactId1)
150 ->addValue('MyContactFields2.FavColor', 'Orange')
151 ->addValue('MyContactFields2.FavFood', 'Tangerine')
152 ->execute();
153 $contact = Contact::get(FALSE)
154 ->addSelect('MyContactFields.FavColor', 'MyContactFields2.FavColor', 'MyContactFields.FavFood', 'MyContactFields2.FavFood')
155 ->addWhere('id', '=', $contactId1)
156 ->execute()
157 ->first();
158 $this->assertEquals('Red', $contact['MyContactFields.FavColor']);
159 $this->assertEquals('Orange', $contact['MyContactFields2.FavColor']);
160 $this->assertEquals('Cherry', $contact['MyContactFields.FavFood']);
161 $this->assertEquals('Tangerine', $contact['MyContactFields2.FavFood']);
162
163 // Update 1st set and ensure 2st hasn't changed
164 Contact::update()
165 ->addWhere('id', '=', $contactId1)
166 ->addValue('MyContactFields.FavColor', 'Blue')
167 ->execute();
168 $contact = Contact::get(FALSE)
169 ->addSelect('MyContactFields.FavColor', 'MyContactFields2.FavColor', 'MyContactFields.FavFood', 'MyContactFields2.FavFood')
170 ->addWhere('id', '=', $contactId1)
171 ->execute()
172 ->first();
173 $this->assertEquals('Blue', $contact['MyContactFields.FavColor']);
174 $this->assertEquals('Orange', $contact['MyContactFields2.FavColor']);
175 $this->assertEquals('Cherry', $contact['MyContactFields.FavFood']);
176 $this->assertEquals('Tangerine', $contact['MyContactFields2.FavFood']);
177
178 $search = Contact::get(FALSE)
179 ->addClause('OR', ['MyContactFields.FavColor', '=', 'Blue'], ['MyContactFields.FavFood', '=', 'Grapes'])
180 ->addSelect('id')
181 ->addOrderBy('id')
182 ->execute()
183 ->indexBy('id');
184
185 $this->assertEquals([$contactId1, $contactId2], array_keys((array) $search));
186
187 $search = Contact::get(FALSE)
188 ->addClause('NOT', ['MyContactFields.FavColor', '=', 'Purple'], ['MyContactFields.FavFood', '=', 'Grapes'])
189 ->addSelect('id')
190 ->addOrderBy('id')
191 ->execute()
192 ->indexBy('id');
193
194 $this->assertNotContains($contactId2, array_keys((array) $search));
195
196 $search = Contact::get(FALSE)
197 ->addClause('NOT', ['MyContactFields.FavColor', '=', 'Purple'], ['MyContactFields.FavFood', '=', 'Grapes'])
198 ->addSelect('id')
199 ->addOrderBy('id')
200 ->execute()
201 ->indexBy('id');
202
203 $this->assertContains($contactId1, array_keys((array) $search));
204 $this->assertNotContains($contactId2, array_keys((array) $search));
205
206 $search = Contact::get(FALSE)
207 ->setWhere([['NOT', ['OR', [['MyContactFields.FavColor', '=', 'Blue'], ['MyContactFields.FavFood', '=', 'Grapes']]]]])
208 ->addSelect('id')
209 ->addOrderBy('id')
210 ->execute()
211 ->indexBy('id');
212
213 $this->assertNotContains($contactId1, array_keys((array) $search));
214 $this->assertNotContains($contactId2, array_keys((array) $search));
215 }
216
217 }