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