2 require_once 'CiviTest/CiviUnitTestCase.php';
3 require_once 'CiviTest/Contact.php';
4 require_once 'CiviTest/Custom.php';
7 * Class CRM_Core_BAO_CustomFieldTest
9 class CRM_Core_BAO_CustomFieldTest
extends CiviUnitTestCase
{
15 'name' => 'Custom Field BAOs',
16 'description' => 'Test all Core_BAO_CustomField methods.',
17 'group' => 'CiviCRM BAO Tests',
25 function testCreateCustomfield() {
26 $customGroup = Custom
::createGroup(array(), 'Individual');
29 'data_type' => 'String',
30 'html_type' => 'Text',
31 'custom_group_id' => $customGroup->id
,
33 $customField = CRM_Core_BAO_CustomField
::create($fields);
34 $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
35 'Database check for created CustomField.'
38 'id' => $customFieldID,
39 'label' => 'editTestFld',
41 'data_type' => 'String',
42 'html_type' => 'Text',
43 'custom_group_id' => $customGroup->id
,
46 $customField = CRM_Core_BAO_CustomField
::create($fields);
47 $this->assertDBNotNull('CRM_Core_DAO_CustomField', 1, 'id', 'is_active', 'Database check for edited CustomField.');
48 $this->assertDBNotNull('CRM_Core_DAO_CustomField', $fields['label'], 'id', 'label', 'Database check for edited CustomField.');
50 $dbFieldName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'name', 'id', 'Database check for edited CustomField.');
51 $dbColumnName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'column_name', 'id', 'Database check for edited CustomField.');
52 $this->assertEquals(strtolower("{$dbFieldName}_{$customFieldID}"), $dbColumnName,
53 "Column name ends in ID");
55 Custom
::deleteGroup($customGroup);
58 function testCreateCustomfieldColumnName() {
59 $customGroup = Custom
::createGroup(array(), 'Individual');
61 'label' => 'testFld 2',
62 'column_name' => 'special_colname',
63 'data_type' => 'String',
64 'html_type' => 'Text',
65 'custom_group_id' => $customGroup->id
,
67 $customField = CRM_Core_BAO_CustomField
::create($fields);
68 $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
69 'Database check for created CustomField.'
71 $dbColumnName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'column_name', 'id', 'Database check for edited CustomField.');
72 $this->assertEquals($fields['column_name'], $dbColumnName,
73 "Column name set as specified");
75 Custom
::deleteGroup($customGroup);
78 function testCreateCustomfieldName() {
79 $customGroup = Custom
::createGroup(array(), 'Individual');
81 'label' => 'testFld 2',
82 'name' => 'special_fldlname',
83 'data_type' => 'String',
84 'html_type' => 'Text',
85 'custom_group_id' => $customGroup->id
,
87 $customField = CRM_Core_BAO_CustomField
::create($fields);
88 $customFieldID = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
89 'Database check for created CustomField.'
91 $dbFieldName = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customFieldID, 'name', 'id', 'Database check for edited CustomField.');
92 $this->assertEquals($fields['name'], $dbFieldName,
93 "Column name set as specified");
95 Custom
::deleteGroup($customGroup);
99 function testGetFields() {
100 $customGroup = Custom
::createGroup(array(), 'Individual');
102 'label' => 'testFld1',
103 'data_type' => 'String',
104 'html_type' => 'Text',
106 'custom_group_id' => $customGroup->id
,
108 $customField1 = CRM_Core_BAO_CustomField
::create($fields);
109 $customFieldID1 = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
110 'Database check for created CustomField.'
113 'label' => 'testFld2',
114 'data_type' => 'String',
115 'html_type' => 'Text',
117 'custom_group_id' => $customGroup->id
,
119 $customField2 = CRM_Core_BAO_CustomField
::create($fields);
120 $customFieldID2 = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
121 'Database check for created CustomField.'
123 $getCustomFields = array();
124 $getCustomFields = CRM_Core_BAO_CustomField
::getFields('Individual', TRUE, TRUE);
125 //CRM_Core_Error::debug('fdf',$getCustomFields);
126 //$this->assertEquals( 'testFld1', $getCustomFields[$customFieldID1][0], 'Confirm First Custom field label' );
127 //$this->assertEquals( 'testFld2', $getCustomFields[$customFieldID2][0], 'Confirm Second Custom field label' );
130 Custom
::deleteGroup($customGroup);
133 function testGetDisplayedValues() {
134 $customGroup = Custom
::createGroup(array(), 'Individual');
136 'label' => 'testCountryFld1',
137 'data_type' => 'Country',
138 'html_type' => 'Select Country',
140 'default_value' => 1228,
141 'custom_group_id' => $customGroup->id
,
143 $customField1 = CRM_Core_BAO_CustomField
::create($fields);
144 $customFieldID1 = $this->assertDBNotNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id', 'custom_group_id',
145 'Database check for created CustomField.'
148 $options[$customFieldID1]['attributes'] = array(
149 'label' => 'testCountryFld1',
150 'data_type' => 'Country',
151 'html_type' => 'Select Country',
153 $display = CRM_Core_BAO_CustomField
::getDisplayValue($fields['default_value'], $customFieldID1, $options);
155 $this->assertEquals('United States', $display, 'Confirm Country display Name');
157 Custom
::deleteGroup($customGroup);
160 function testDeleteCustomfield() {
161 $customGroup = Custom
::createGroup(array(), 'Individual');
163 'groupId' => $customGroup->id
,
164 'label' => 'Throwaway Field',
165 'dataType' => 'Memo',
166 'htmlType' => 'TextArea',
169 $customField = Custom
::createField(array(), $fields);
170 $this->assertNotNull($customField);
171 CRM_Core_BAO_CustomField
::deleteField($customField);
172 $this->assertDBNull('CRM_Core_DAO_CustomField', $customGroup->id
, 'id',
173 'custom_group_id', 'Database check for deleted Custom Field.'
175 Custom
::deleteGroup($customGroup);
179 * Move a custom field from $groupA to $groupB. Make sure that data records are
180 * correctly matched and created.
182 function testMoveField() {
183 $countriesByName = array_flip(CRM_Core_PseudoConstant
::country(FALSE, FALSE));
184 $this->assertTrue($countriesByName['Andorra'] > 0);
186 'A' => Custom
::createGroup(array(
187 'title' => 'Test_Group A',
188 'name' => 'test_group_a',
189 'extends' => array('Individual'),
195 'B' => Custom
::createGroup(array(
196 'title' => 'Test_Group B',
197 'name' => 'test_group_b',
198 'extends' => array('Individual'),
206 'countryA' => Custom
::createField(array(
208 'groupId' => $groups['A']->id
,
209 'label' => 'Country A',
210 'dataType' => 'Country',
211 'htmlType' => 'Select Country',
213 'countryB' => Custom
::createField(array(
215 'groupId' => $groups['A']->id
,
216 'label' => 'Country B',
217 'dataType' => 'Country',
218 'htmlType' => 'Select Country',
220 'countryC' => Custom
::createField(array(
222 'groupId' => $groups['B']->id
,
223 'label' => 'Country C',
224 'dataType' => 'Country',
225 'htmlType' => 'Select Country',
229 'alice' => Contact
::createIndividual(array(
230 'first_name' => 'Alice',
231 'last_name' => 'Albertson',
232 'custom_' . $fields['countryA']->id
=> $countriesByName['Andorra'],
233 'custom_' . $fields['countryB']->id
=> $countriesByName['Barbados'],
235 'bob' => Contact
::createIndividual(array(
236 'first_name' => 'Bob',
237 'last_name' => 'Roberts',
238 'custom_' . $fields['countryA']->id
=> $countriesByName['Austria'],
239 'custom_' . $fields['countryB']->id
=> $countriesByName['Bermuda'],
240 'custom_' . $fields['countryC']->id
=> $countriesByName['Chad'],
242 'carol' => Contact
::createIndividual(array(
243 'first_name' => 'Carol',
244 'last_name' => 'Carolson',
245 'custom_' . $fields['countryC']->id
=> $countriesByName['Cambodia'],
250 CRM_Core_BAO_CustomField
::moveField($fields['countryB']->id
, $groups['B']->id
);
252 // Group[A] no longer has fields[countryB]
253 $errorScope = CRM_Core_TemporaryErrorScope
::useException();
255 $this->assertDBQuery(1, "SELECT {$fields['countryB']->column_name} FROM {$groups['A']->table_name}");
256 $this->fail('Expected exception when querying column on wrong table');
258 catch(PEAR_Exception
$e) {}
261 // Alice: Group[B] has fields[countryB], but fields[countryC] did not exist before
262 $this->assertDBQuery(1,
263 "SELECT count(*) FROM {$groups['B']->table_name}
265 AND {$fields['countryB']->column_name} = %3
266 AND {$fields['countryC']->column_name} is null",
268 1 => array($contacts['alice'], 'Integer'),
269 3 => array($countriesByName['Barbados'], 'Integer'),
273 // Bob: Group[B] has merged fields[countryB] and fields[countryC] on the same record
274 $this->assertDBQuery(1,
275 "SELECT count(*) FROM {$groups['B']->table_name}
277 AND {$fields['countryB']->column_name} = %3
278 AND {$fields['countryC']->column_name} = %4",
280 1 => array($contacts['bob'], 'Integer'),
281 3 => array($countriesByName['Bermuda'], 'Integer'),
282 4 => array($countriesByName['Chad'], 'Integer'),
286 // Carol: Group[B] still has fields[countryC] but did not get fields[countryB]
287 $this->assertDBQuery(1,
288 "SELECT count(*) FROM {$groups['B']->table_name}
290 AND {$fields['countryB']->column_name} is null
291 AND {$fields['countryC']->column_name} = %4",
293 1 => array($contacts['carol'], 'Integer'),
294 4 => array($countriesByName['Cambodia'], 'Integer'),
298 Custom
::deleteGroup($groups['A']);
299 Custom
::deleteGroup($groups['B']);