Merge pull request #12053 from civicrm/5.1
[civicrm-core.git] / tests / phpunit / api / v3 / OptionValueTest.php
CommitLineData
6a488035 1<?php
972322c5 2/*
3 +--------------------------------------------------------------------+
2fe49090 4| CiviCRM version 5 |
972322c5 5+--------------------------------------------------------------------+
8c9251b3 6| Copyright CiviCRM LLC (c) 2004-2018 |
972322c5 7+--------------------------------------------------------------------+
8| This file is a part of CiviCRM. |
9| |
10| CiviCRM is free software; you can copy, modify, and distribute it |
11| under the terms of the GNU Affero General Public License |
12| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13| |
14| CiviCRM is distributed in the hope that it will be useful, but |
15| WITHOUT ANY WARRANTY; without even the implied warranty of |
16| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17| See the GNU Affero General Public License for more details. |
18| |
19| You should have received a copy of the GNU Affero General Public |
20| License and the CiviCRM Licensing Exception along |
21| with this program; if not, contact CiviCRM LLC |
22| at info[AT]civicrm[DOT]org. If you have questions about the |
23| GNU Affero General Public License or the licensing of CiviCRM, |
24| see the CiviCRM license FAQ at http://civicrm.org/licensing |
25+--------------------------------------------------------------------+
e70a7fc0 26 */
6a488035 27
e9479dcf
EM
28/**
29 * Class api_v3_OptionValueTest
acb109b7 30 * @group headless
e9479dcf 31 */
6a488035 32class api_v3_OptionValueTest extends CiviUnitTestCase {
972322c5 33 protected $_apiversion = 3;
b7c9bc4c 34
00be9182 35 public function setUp() {
6a488035 36 parent::setUp();
a73525a7 37 $this->useTransaction(TRUE);
6a488035
TO
38 }
39
972322c5 40 public function testGetCount() {
41 $result = $this->callAPISuccess('option_value', 'getcount', array());
42 $this->assertGreaterThan(100, $result);
43 }
44
6a488035 45 public function testGetOptionValueByID() {
972322c5 46 $result = $this->callAPISuccess('option_value', 'get', array('id' => 1));
ba4a1892
TM
47 $this->assertEquals(1, $result['count']);
48 $this->assertEquals(1, $result['id']);
6a488035
TO
49 }
50
51 public function testGetOptionValueByValue() {
972322c5 52 $result = $this->callAPISuccess('option_value', 'get', array('option_group_id' => 1, 'value' => '1'));
ba4a1892
TM
53 $this->assertEquals(1, $result['count']);
54 $this->assertEquals(1, $result['id']);
6a488035
TO
55 }
56
57 /**
eceb18cc 58 * Test limit param.
6a488035 59 */
00be9182 60 public function testGetOptionValueLimit() {
972322c5 61 $params = array();
62 $result = $this->callAPISuccess('option_value', 'get', $params);
63 $this->assertGreaterThan(1, $result['count'], "Check more than one exists In line " . __LINE__);
6a488035 64 $params['options']['limit'] = 1;
972322c5 65 $result = $this->callAPISuccess('option_value', 'get', $params);
66 $this->assertEquals(1, $result['count'], "Check only 1 retrieved " . __LINE__);
6a488035
TO
67 }
68
69 /**
eceb18cc 70 * Test offset param.
6a488035 71 */
00be9182 72 public function testGetOptionValueOffSet() {
6a488035 73
972322c5 74 $result = $this->callAPISuccess('option_value', 'get', array(
6a488035 75 'option_group_id' => 1,
5896d037
TO
76 'value' => '1',
77 ));
972322c5 78 $result2 = $this->callAPISuccess('option_value', 'get', array(
6a488035 79 'option_group_id' => 1,
5896d037
TO
80 'value' => '1',
81 'options' => array('offset' => 1),
82 ));
972322c5 83 $this->assertGreaterThan($result2['count'], $result['count']);
6a488035
TO
84 }
85
86 /**
eceb18cc 87 * Test offset param.
6a488035 88 */
00be9182 89 public function testGetSingleValueOptionValueSort() {
5c49fee0 90 $description = "Demonstrates use of Sort param (available in many api functions). Also, getsingle.";
5896d037
TO
91 $subfile = 'SortOption';
92 $result = $this->callAPISuccess('option_value', 'getsingle', array(
6c6e6187 93 'option_group_id' => 1,
5896d037
TO
94 'options' => array(
95 'sort' => 'label ASC',
96 'limit' => 1,
97 ),
98 ));
6a488035 99 $params = array(
6c6e6187 100 'option_group_id' => 1,
5896d037 101 'options' => array(
6a488035
TO
102 'sort' => 'label DESC',
103 'limit' => 1,
104 ),
105 );
972322c5 106 $result2 = $this->callAPIAndDocument('option_value', 'getsingle', $params, __FUNCTION__, __FILE__, $description, $subfile);
6a488035
TO
107 $this->assertGreaterThan($result['label'], $result2['label']);
108 }
109
110 /**
111 * Try to emulate a pagination: fetch the first page of 10 options, then fetch the second page with an offset of 9 (instead of 10) and check the start of the second page is the end of the 1st one.
112 */
00be9182 113 public function testGetValueOptionPagination() {
6a488035 114 $pageSize = 10;
5896d037 115 $page1 = $this->callAPISuccess('option_value', 'get', array('options' => array('limit' => $pageSize)));
972322c5 116 $page2 = $this->callAPISuccess('option_value', 'get', array(
6c6e6187 117 'options' => array(
5896d037
TO
118 'limit' => $pageSize,
119 // if you use it for pagination, option.offset=pageSize*pageNumber
120 'offset' => $pageSize - 1,
121 ),
122 ));
6a488035
TO
123 $this->assertEquals($pageSize, $page1['count'], "Check only 10 retrieved in the 1st page " . __LINE__);
124 $this->assertEquals($pageSize, $page2['count'], "Check only 10 retrieved in the 2nd page " . __LINE__);
125
126 $last = array_pop($page1['values']);
127 $first = array_shift($page2['values']);
128
129 $this->assertEquals($first, $last, "the first item of the second page should be the last of the 1st page" . __LINE__);
130 }
131
132 public function testGetOptionGroup() {
972322c5 133 $params = array('option_group_id' => 1);
134 $result = $this->callAPIAndDocument('option_value', 'get', $params, __FUNCTION__, __FILE__);
ba4a1892 135 $this->assertGreaterThan(1, $result['count']);
6a488035 136 }
6a488035 137
c490a46a 138 /**
100fef9d 139 * Test that using option_group_name returns more than 1 & less than all
c490a46a 140 */
6a488035 141 public function testGetOptionGroupByName() {
972322c5 142 $activityTypesParams = array('option_group_name' => 'activity_type', 'option.limit' => 100);
143 $params = array('option.limit' => 100);
144 $activityTypes = $this->callAPISuccess('option_value', 'get', $activityTypesParams);
145 $result = $this->callAPISuccess('option_value', 'get', $params);
ba4a1892
TM
146 $this->assertGreaterThan(1, $activityTypes['count']);
147 $this->assertGreaterThan($activityTypes['count'], $result['count']);
6a488035 148 }
c490a46a 149
6a488035 150 public function testGetOptionDoesNotExist() {
972322c5 151 $result = $this->callAPISuccess('option_value', 'get', array('label' => 'FSIGUBSFGOMUUBSFGMOOUUBSFGMOOBUFSGMOOIIB'));
ba4a1892 152 $this->assertEquals(0, $result['count']);
6a488035 153 }
c490a46a
CW
154
155 /**
fe482240 156 * Check that domain_id is honoured.
c490a46a 157 */
6a488035 158 public function testCreateOptionSpecifyDomain() {
972322c5 159 $result = $this->callAPISuccess('option_group', 'get', array(
6a488035
TO
160 'name' => 'from_email_address',
161 'sequential' => 1,
e5720c45 162 'api.option_value.create' => array('domain_id' => 2, 'name' => 'my@y.com', 'value' => '10'),
5896d037 163 ));
972322c5 164
6a488035 165 $optionValueId = $result['values'][0]['api.option_value.create']['id'];
972322c5 166 $domain_id = $this->callAPISuccess('option_value', 'getvalue', array(
6a488035 167 'id' => $optionValueId,
6a488035
TO
168 'return' => 'domain_id',
169 ));
170 $this->assertEquals(2, $domain_id);
e5720c45 171 $this->callAPISuccess('option_value', 'delete', array('id' => $optionValueId));
c87bbced 172 }
c490a46a
CW
173
174 /**
fe482240 175 * Check that component_id is honoured.
c490a46a 176 */
c87bbced 177 public function testCreateOptionSpecifyComponentID() {
972322c5 178 $result = $this->callAPISuccess('option_group', 'get', array(
c87bbced 179 'name' => 'from_email_address',
6c6e6187 180 'sequential' => 1,
5896d037 181 'api.option_value.create' => array('component_id' => 2, 'name' => 'my@y.com'),
c87bbced 182 ));
183 $this->assertAPISuccess($result);
184 $optionValueId = $result['values'][0]['api.option_value.create']['id'];
972322c5 185 $component_id = $this->callAPISuccess('option_value', 'getvalue', array(
6c6e6187 186 'id' => $optionValueId,
5896d037 187 'return' => 'component_id',
c87bbced 188 ));
189 $this->assertEquals(2, $component_id);
e5720c45 190 $this->callAPISuccess('option_value', 'delete', array('id' => $optionValueId));
c87bbced 191 }
c490a46a
CW
192
193 /**
7ba24c5a 194 * Check that component string is honoured.
c490a46a 195 */
7ba24c5a 196 public function testCreateOptionSpecifyComponentString() {
972322c5 197 $result = $this->callAPISuccess('option_group', 'get', array(
c87bbced 198 'name' => 'from_email_address',
6c6e6187 199 'sequential' => 1,
5896d037 200 'api.option_value.create' => array(
c87bbced 201 'component_id' => 'CiviContribute',
21dfd5f5 202 'name' => 'my@y.com',
5896d037 203 ),
c87bbced 204 ));
205 $this->assertAPISuccess($result);
206 $optionValueId = $result['values'][0]['api.option_value.create']['id'];
972322c5 207 $component_id = $this->callAPISuccess('option_value', 'getvalue', array(
6c6e6187 208 'id' => $optionValueId,
5896d037 209 'return' => 'component_id',
c87bbced 210 ));
211 $this->assertEquals(2, $component_id);
e5720c45 212 $this->callAPISuccess('option_value', 'delete', array('id' => $optionValueId));
c87bbced 213 }
c490a46a
CW
214
215 /**
7ba24c5a 216 * Check that component is honoured when fetching options.
c490a46a 217 */
7ba24c5a 218 public function testGetOptionWithComponent() {
98d41b7d
CW
219 $components = Civi::settings()->get('enable_components');
220 CRM_Core_BAO_ConfigSetting::enableComponent('CiviContribute');
7ba24c5a
CW
221 $this->callAPISuccess('option_group', 'get', array(
222 'name' => 'gender',
5896d037 223 'api.option_value.create' => array(
c87bbced 224 'component_id' => 'CiviContribute',
7ba24c5a 225 'name' => 'Contrib',
5896d037 226 ),
c87bbced 227 ));
7ba24c5a
CW
228 // Verify new option is present
229 $genders = $this->callAPISuccess('contact', 'getoptions', array(
230 'field' => 'gender_id',
231 'context' => 'create',
c87bbced 232 ));
7ba24c5a 233 $this->assertContains('Contrib', $genders['values']);
98d41b7d 234
7ba24c5a
CW
235 // Disable relevant component
236 CRM_Core_BAO_ConfigSetting::disableComponent('CiviContribute');
237 CRM_Core_PseudoConstant::flush();
238 // New option should now be hidden for "create" context
239 $genders = $this->callAPISuccess('contact', 'getoptions', array(
240 'field' => 'gender_id',
241 'context' => 'create',
242 ));
243 $this->assertNotContains('Contrib', $genders['values']);
244 // New option should be visible for "get" context even with component disabled
245 $genders = $this->callAPISuccess('contact', 'getoptions', array(
246 'field' => 'gender_id',
247 'context' => 'get',
248 ));
249 $this->assertContains('Contrib', $genders['values']);
98d41b7d
CW
250
251 // Now disable all components and ensure we can still fetch options with no errors
252 CRM_Core_BAO_ConfigSetting::setEnabledComponents(array());
253 CRM_Core_PseudoConstant::flush();
254 // New option should still be hidden for "create" context
255 $genders = $this->callAPISuccess('contact', 'getoptions', array(
256 'field' => 'gender_id',
257 'context' => 'create',
258 ));
259 $this->assertNotContains('Contrib', $genders['values']);
260
261 // Restore original state
262 CRM_Core_BAO_ConfigSetting::setEnabledComponents($components);
c87bbced 263 }
c490a46a
CW
264
265 /**
fe482240 266 * Check that domain_id is honoured.
c490a46a 267 */
c87bbced 268 public function testCRM12133CreateOptionWeightNoValue() {
972322c5 269 $optionGroup = $this->callAPISuccess(
c87bbced 270 'option_group', 'get', array(
5896d037
TO
271 'name' => 'gender',
272 'sequential' => 1,
e70a7fc0
TO
273 )
274 );
c87bbced 275 $this->assertAPISuccess($optionGroup);
276 $params = array(
277 'option_group_id' => $optionGroup['id'],
6c6e6187 278 'label' => 'my@y.com',
5896d037 279 'weight' => 3,
c87bbced 280 );
6c6e6187 281 $optionValue = $this->callAPISuccess('option_value', 'create', $params);
c87bbced 282 $this->assertAPISuccess($optionValue);
283 $params['weight'] = 4;
5896d037 284 $optionValue2 = $this->callAPISuccess('option_value', 'create', $params);
c87bbced 285 $this->assertAPISuccess($optionValue2);
972322c5 286 $options = $this->callAPISuccess('option_value', 'get', array('option_group_id' => $optionGroup['id']));
c87bbced 287 $this->assertNotEquals($options['values'][$optionValue['id']]['value'], $options['values'][$optionValue2['id']]['value']);
288
6c6e6187 289 //cleanup
972322c5 290 $this->callAPISuccess('option_value', 'delete', array('id' => $optionValue['id']));
291 $this->callAPISuccess('option_value', 'delete', array('id' => $optionValue2['id']));
6a488035
TO
292 }
293
c490a46a 294 /**
fe482240 295 * Check that domain_id is honoured.
c490a46a 296 */
6a488035 297 public function testCreateOptionNoName() {
972322c5 298 $optionGroup = $this->callAPISuccess('option_group', 'get', array(
6a488035 299 'name' => 'gender',
5896d037
TO
300 'sequential' => 1,
301 ));
6a488035 302
972322c5 303 $params = array('option_group_id' => $optionGroup['id'], 'label' => 'my@y.com');
6c6e6187 304 $optionValue = $this->callAPISuccess('option_value', 'create', $params);
6a488035
TO
305 $this->assertAPISuccess($optionValue);
306 $this->getAndCheck($params, $optionValue['id'], 'option_value');
307 }
a4a33486
CW
308
309 /**
fe482240 310 * Check that pseudoconstant reflects new value added.
a4a33486 311 */
6a488035 312 public function testCRM11876CreateOptionPseudoConstantUpdated() {
6c6e6187 313 $optionGroupID = $this->callAPISuccess('option_group', 'getvalue', array(
5896d037 314 'name' => 'payment_instrument',
a4a33486
CW
315 'return' => 'id',
316 ));
317 $newOption = (string) time();
318 $apiResult = $this->callAPISuccess('option_value', 'create', array(
319 'option_group_id' => $optionGroupID,
320 'label' => $newOption,
6a488035
TO
321 ));
322
a4a33486
CW
323 $fields = $this->callAPISuccess('contribution', 'getoptions', array('field' => 'payment_instrument_id'));
324 $this->assertTrue(in_array($newOption, $fields['values']));
325
326 $this->callAPISuccess('option_value', 'delete', array('id' => $apiResult['id']));
327
328 $fields = $this->callAPISuccess('contribution', 'getoptions', array('field' => 'payment_instrument_id'));
329 $this->assertFalse(in_array($newOption, $fields['values']));
6a488035 330 }
6a488035 331
89ab5601 332
c490a46a 333 /**
e4f46be0 334 * Update option value with 'id' parameter and the value to update
89ab5601
PJ
335 * and not passing option group id
336 */
337 public function testUpdateOptionValueNoGroupId() {
338 // create a option group
339 $og = $this->callAPISuccess('option_group', 'create', array('name' => 'our test Option Group', 'is_active' => 1));
340 // create a option value
341 $ov = $this->callAPISuccess('option_value', 'create',
342 array('option_group_id' => $og['id'], 'label' => 'test option value')
343 );
344 // update option value without 'option_group_id'
6c6e6187 345 $res = $this->callAPISuccess('option_value', 'create', array('id' => $ov['id'], 'is_active' => 0));
89ab5601 346 $val = $this->callAPISuccess('option_value', 'getvalue', array(
6c6e6187 347 'id' => $ov['id'],
5896d037 348 'return' => 'is_active',
89ab5601
PJ
349 ));
350 $this->assertEquals($val, 0, "update with no group id is not proper" . __LINE__);
351 }
352
c490a46a 353 /**
e4f46be0 354 * Update option value with 'id' parameter and the value to update
89ab5601
PJ
355 * and as well as option group id
356 */
357 public function testUpdateOptionValueWithGroupId() {
358 // create a option group
5896d037 359 $og = $this->callAPISuccess('option_group', 'create', array(
92915c55
TO
360 'name' => 'our test Option Group for with group id',
361 'is_active' => 1,
362 ));
89ab5601
PJ
363 // create a option value
364 $ov = $this->callAPISuccess('option_value', 'create',
365 array('option_group_id' => $og['id'], 'label' => 'test option value')
366 );
367 // update option value without 'option_group_id'
5896d037 368 $this->callAPISuccess('option_value', 'create', array(
92915c55
TO
369 'id' => $ov['id'],
370 'option_group_id' => $og['id'],
371 'is_active' => 0,
372 ));
89ab5601 373 $val = $this->callAPISuccess('option_value', 'getvalue', array(
6c6e6187 374 'id' => $ov['id'],
5896d037 375 'return' => 'is_active',
89ab5601
PJ
376 ));
377 $this->assertEquals($val, 0, "update with group id is not proper " . __LINE__);
378 }
96025800 379
e5720c45 380 /**
d0488daf 381 * CRM-19346 Ensure that Option Values cannot share same value in the same option value group
e5720c45
SL
382 */
383 public function testCreateOptionValueWithSameValue() {
384 $og = $this->callAPISuccess('option_group', 'create', array(
385 'name' => 'our test Option Group for with group id',
386 'is_active' => 1,
387 ));
388 // create a option value
389 $ov = $this->callAPISuccess('option_value', 'create',
390 array('option_group_id' => $og['id'], 'label' => 'test option value')
391 );
392 // update option value without 'option_group_id'
d0488daf 393 $this->callAPIFailure('option_value', 'create',
e5720c45
SL
394 array('option_group_id' => $og['id'], 'label' => 'Test 2nd option value', 'value' => $ov['values'][$ov['id']]['value'])
395 );
396 }
397
d0488daf 398 /**
399 * CRM-21737 Ensure that language Option Values CAN share same value.
400 */
401 public function testCreateOptionValueWithSameValueLanguagesException() {
402 $this->callAPISuccess('option_value', 'create',
403 ['option_group_id' => 'languages', 'label' => 'Quasi English', 'name' => 'en_Qu', 'value' => 'en']
404 );
405 $this->callAPISuccess('option_value', 'create',
406 ['option_group_id' => 'languages', 'label' => 'Semi English', 'name' => 'en_Se', 'value' => 'en']
407 );
408
409 }
410
e5720c45
SL
411 public function testCreateOptionValueWithSameValueDiffOptionGroup() {
412 $og = $this->callAPISuccess('option_group', 'create', array(
413 'name' => 'our test Option Group for with group id',
414 'is_active' => 1,
415 ));
416 // create a option value
417 $ov = $this->callAPISuccess('option_value', 'create',
418 array('option_group_id' => $og['id'], 'label' => 'test option value')
419 );
420 $og2 = $this->callAPISuccess('option_group', 'create', array(
421 'name' => 'our test Option Group for with group id 2',
422 'is_active' => 1,
423 ));
424 // update option value without 'option_group_id'
425 $ov2 = $this->callAPISuccess('option_value', 'create',
426 array('option_group_id' => $og2['id'], 'label' => 'Test 2nd option value', 'value' => $ov['values'][$ov['id']]['value'])
427 );
428 }
429
e9479dcf 430}