Merge pull request #17253 from mattwire/utf8convertblocksize
[civicrm-core.git] / tests / phpunit / CRM / Core / BAO / UFFieldTest.php
CommitLineData
6a488035 1<?php
aba1cd8b
EM
2
3/**
4 * Class CRM_Core_BAO_UFFieldTest
acb109b7 5 * @group headless
aba1cd8b 6 */
6a488035
TO
7class CRM_Core_BAO_UFFieldTest extends CiviUnitTestCase {
8
00be9182 9 public function setUp() {
6a488035
TO
10 parent::setUp();
11
9099cab3 12 $this->quickCleanup(['civicrm_uf_group', 'civicrm_uf_field']);
6a488035
TO
13 }
14
15 /**
16 * When passing in a GID, fields should be omitted if they already appear in the group.
17 */
18 public function testGetAvailable_byGid() {
9099cab3
CW
19 $ufGroupId = $this->createUFGroup([
20 [
6a488035
TO
21 'field_name' => 'do_not_sms',
22 'field_type' => 'Contact',
9099cab3
CW
23 ],
24 [
6a488035
TO
25 'field_name' => 'first_name',
26 'field_type' => 'Individual',
9099cab3
CW
27 ],
28 [
6a488035
TO
29 'field_name' => 'amount_level',
30 'field_type' => 'Contribution',
9099cab3
CW
31 ],
32 [
6a488035
TO
33 'field_name' => 'participant_note',
34 'field_type' => 'Participant',
9099cab3
CW
35 ],
36 [
09ba1975 37 'field_name' => 'membership_join_date',
6a488035 38 'field_type' => 'Membership',
9099cab3
CW
39 ],
40 [
6a488035
TO
41 'field_name' => 'activity_date_time',
42 'field_type' => 'Activity',
9099cab3
CW
43 ],
44 ]);
6a488035
TO
45 $fields = CRM_Core_BAO_UFField::getAvailableFields($ufGroupId);
46
47 // Make sure that each entity has 1+ present field and 1+ missing (already-used) field
39b959db
SL
48 // already used
49 $this->assertFalse(isset($fields['Contact']['do_not_sms']));
6a488035
TO
50 $this->assertEquals('city', $fields['Contact']['city']['name']);
51
39b959db
SL
52 // already used
53 $this->assertFalse(isset($fields['Individual']['first_name']));
6a488035
TO
54 $this->assertEquals('birth_date', $fields['Individual']['birth_date']['name']);
55
56 $this->assertEquals('organization_name', $fields['Organization']['organization_name']['name']);
57 $this->assertEquals('legal_name', $fields['Organization']['legal_name']['name']);
58
39b959db
SL
59 // already used
60 $this->assertFalse(isset($fields['Contribution']['amount_level']));
6a488035
TO
61 $this->assertEquals('cancel_reason', $fields['Contribution']['cancel_reason']['name']);
62
39b959db
SL
63 // already used
64 $this->assertFalse(isset($fields['Participant']['participant_note']));
6a488035
TO
65 $this->assertEquals('participant_role', $fields['Participant']['participant_role']['name']);
66
39b959db 67 // already used
09ba1975 68 $this->assertFalse(isset($fields['Membership']['membership_join_date']));
6a488035
TO
69 $this->assertEquals('end_date', $fields['Membership']['membership_end_date']['name']);
70
39b959db
SL
71 // already used
72 $this->assertFalse(isset($fields['Activity']['activity_date_time']));
6a488035
TO
73 $this->assertEquals('subject', $fields['Activity']['activity_subject']['name']);
74
75 // Make sure that some of the blacklisted fields don't appear
76 $this->assertFalse(isset($fields['Contribution']['is_pay_later']));
77 $this->assertFalse(isset($fields['Participant']['participant_role_id']));
78 $this->assertFalse(isset($fields['Membership']['membership_type_id']));
79
80 // This behavior is not necessarily desirable, but it's the status quo
81 $this->assertEquals('first_name', $fields['Staff']['first_name']['name']);
82 }
83
84 /**
85 * When passing in $defaults, the currently selected field should still be included -- even if
86 * it's already part of the profile.
87 */
88 public function testGetAvailable_byGidDefaults() {
9099cab3
CW
89 $ufGroupId = $this->createUFGroup([
90 [
6a488035
TO
91 'field_name' => 'do_not_sms',
92 'field_type' => 'Contact',
9099cab3
CW
93 ],
94 [
6a488035
TO
95 'field_name' => 'first_name',
96 'field_type' => 'Individual',
9099cab3
CW
97 ],
98 ]);
99 $defaults = ['field_name' => ['Individual', 'first_name']];
6a488035
TO
100 $fields = CRM_Core_BAO_UFField::getAvailableFields($ufGroupId, $defaults);
101
39b959db
SL
102 // already used
103 $this->assertFalse(isset($fields['Contact']['do_not_sms']));
6a488035
TO
104 $this->assertEquals('city', $fields['Contact']['city']['name']);
105
39b959db
SL
106 // used by me
107 $this->assertEquals('first_name', $fields['Individual']['first_name']['name']);
6a488035
TO
108 $this->assertEquals('birth_date', $fields['Individual']['birth_date']['name']);
109 }
110
111 /**
112 * When omitting a GID, return a list of all fields.
113 */
114 public function testGetAvailable_full() {
115 $fields = CRM_Core_BAO_UFField::getAvailableFields();
116
117 // Make sure that each entity appears with at least one field
118 $this->assertEquals('do_not_sms', $fields['Contact']['do_not_sms']['name']);
119 $this->assertEquals('city', $fields['Contact']['city']['name']);
120
121 $this->assertEquals('first_name', $fields['Individual']['first_name']['name']);
122 $this->assertEquals('birth_date', $fields['Individual']['birth_date']['name']);
123
124 $this->assertEquals('organization_name', $fields['Organization']['organization_name']['name']);
125 $this->assertEquals('legal_name', $fields['Organization']['legal_name']['name']);
126
127 $this->assertEquals('amount_level', $fields['Contribution']['amount_level']['name']);
128 $this->assertEquals('cancel_reason', $fields['Contribution']['cancel_reason']['name']);
129
130 $this->assertEquals('participant_note', $fields['Participant']['participant_note']['name']);
131 $this->assertEquals('participant_role', $fields['Participant']['participant_role']['name']);
132
09ba1975 133 $this->assertEquals('join_date', $fields['Membership']['membership_join_date']['name']);
6a488035
TO
134 $this->assertEquals('end_date', $fields['Membership']['membership_end_date']['name']);
135
136 $this->assertEquals('activity_date_time', $fields['Activity']['activity_date_time']['name']);
137 $this->assertEquals('subject', $fields['Activity']['activity_subject']['name']);
138
139 // Make sure that some of the blacklisted fields don't appear
140 $this->assertFalse(isset($fields['Contribution']['is_pay_later']));
141 $this->assertFalse(isset($fields['Participant']['participant_role_id']));
142 $this->assertFalse(isset($fields['Membership']['membership_type_id']));
143
144 // This behavior is not necessarily desirable, but it's the status quo
145 $this->assertEquals('first_name', $fields['Staff']['first_name']['name']);
146 }
147
148 /**
149 * When omitting a GID, return a list of all fields.
150 */
151 public function testGetAvailableFlat() {
152 $fields = CRM_Core_BAO_UFField::getAvailableFieldsFlat();
153
154 // Make sure that each entity appears with at least one field
155 $this->assertEquals('Contact', $fields['do_not_sms']['field_type']);
156 $this->assertEquals('Contact', $fields['city']['field_type']);
157
158 $this->assertEquals('Individual', $fields['first_name']['field_type']);
159 $this->assertEquals('Individual', $fields['birth_date']['field_type']);
160
161 $this->assertEquals('Organization', $fields['organization_name']['field_type']);
162 $this->assertEquals('Organization', $fields['legal_name']['field_type']);
163
164 $this->assertEquals('Contribution', $fields['amount_level']['field_type']);
165 $this->assertEquals('Contribution', $fields['cancel_reason']['field_type']);
166
167 $this->assertEquals('Participant', $fields['participant_note']['field_type']);
168 $this->assertEquals('Participant', $fields['participant_role']['field_type']);
169
09ba1975 170 $this->assertEquals('Membership', $fields['membership_join_date']['field_type']);
6a488035
TO
171 $this->assertEquals('Membership', $fields['membership_end_date']['field_type']);
172
173 $this->assertEquals('Activity', $fields['activity_date_time']['field_type']);
174 $this->assertEquals('Activity', $fields['activity_subject']['field_type']);
175
176 // Make sure that some of the blacklisted fields don't appear
177 $this->assertFalse(isset($fields['is_pay_later']));
178 $this->assertFalse(isset($fields['participant_role_id']));
179 $this->assertFalse(isset($fields['membership_type_id']));
180 }
181
182 /**
183 * Make sure that the existence of a profile doesn't break listing all fields
184 *
92915c55
TO
185 * public function testGetAvailable_mixed() {
186 * // FIXME
187 * $this->testGetAvailable_full();
188 * // $this->testGetAvailable_byGid();
189 * $this->testGetAvailable_full();
190 * // $this->testGetAvailable_byGid();
191 * } // */
6a488035
TO
192
193 /**
e16033b4
TO
194 * @param array $fields
195 * List of fields to include in the profile.
a6c01b45
CW
196 * @return int
197 * field id
6a488035
TO
198 */
199 protected function createUFGroup($fields) {
200 $ufGroup = CRM_Core_DAO::createTestObject('CRM_Core_DAO_UFGroup');
201 $this->assertTrue(is_numeric($ufGroup->id));
202
203 foreach ($fields as $field) {
9099cab3 204 $defaults = [
6a488035
TO
205 'uf_group_id' => $ufGroup->id,
206 'visibility' => 'Public Pages and Listings',
207 'weight' => 1,
208 'label' => 'Label for ' . $field['field_name'],
209 'is_searchable' => 1,
210 'is_active' => 1,
211 'location_type_id' => NULL,
9099cab3 212 ];
6a488035 213 $params = array_merge($field, $defaults);
bdb36a1a 214 $ufField = $this->callAPISuccess('UFField', 'create', $params);
6a488035
TO
215 $this->assertAPISuccess($ufField);
216 }
217
218 return $ufGroup->id;
219 }
96025800 220
92f06cdd
SL
221 /**
222 * Test ability to modify the acceptable fields for use in a profile via hook
223 */
224 public function testGetFieldsFlatModifiedByHook() {
225 unset(Civi::$statics['UFFieldsFlat']);
226 $this->hookClass->setHook('civicrm_alterUFFields', [$this, 'modifyUFFields']);
227 $fields = CRM_Core_BAO_UFField::getAvailableFieldsFlat();
228
229 $this->assertEquals('Grant', $fields['grant_id']['field_type']);
230 $this->assertEquals('contact_id', $fields['grant_contact_id']['name']);
231 }
232
233 public function modifyUFFields(&$fields) {
234 $fields['Grant'] = CRM_Grant_DAO_Grant::export();
235 }
236
6a488035 237}