3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2016 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
29 * File for the CiviCRM APIv3 job functions
31 * @package CiviCRM_APIv3
34 * @copyright CiviCRM LLC (c) 2004-2016
35 * @version $Id: Job.php 30879 2010-11-22 15:45:55Z shot $
40 * Tests for job api where custom data is involved.
42 * Set up for custom data won't work with useTransaction so these are not
43 * compatible with the other job test class.
47 class api_v3_JobTestCustomDataTest
extends CiviUnitTestCase
{
48 protected $_apiversion = 3;
50 public $_entity = 'Job';
57 public $customFieldID = NULL;
60 * ID of a custom field of integer type.
64 public $customIntFieldID = NULL;
67 * ID of a custom field of integer type.
71 public $customBoolFieldID = NULL;
74 * ID of a custom field of integer type.
78 public $customStringCheckboxID = NULL;
85 public $customGroupID = NULL;
87 public function setUp() {
89 $customGroup = $this->customGroupCreate();
90 $this->customGroupID
= $customGroup['id'];
91 $customField = $this->customFieldCreate(array(
92 'custom_group_id' => $this->customGroupID
,
93 'data_type' => 'Date',
94 'html_type' => 'Select Date',
95 'default_value' => '',
97 $this->customFieldID
= $customField['id'];
98 $customField = $this->customFieldCreate(array(
99 'custom_group_id' => $this->customGroupID
,
100 'data_type' => 'Integer',
101 'html_type' => 'Text',
102 'default_value' => '',
103 'label' => 'Int Field',
105 $this->customIntFieldID
= $customField['id'];
106 $customField = $this->customFieldCreate(array(
107 'custom_group_id' => $this->customGroupID
,
108 'data_type' => 'Boolean',
109 'html_type' => 'Radio',
110 'default_value' => '',
111 'label' => 'Radio Field',
113 $this->customBoolFieldID
= $customField['id'];
114 $customField = $this->customFieldCreate(array(
115 'custom_group_id' => $this->customGroupID
,
116 'data_type' => 'String',
117 'html_type' => 'CheckBox',
118 'default_value' => NULL,
119 'label' => 'checkbox Field',
120 'option_values' => array('black' => 'black', 'white' => 'white'),
122 $this->customStringCheckboxID
= $customField['id'];
126 * Cleanup after tests.
128 public function tearDown() {
129 $this->quickCleanup(array('civicrm_contact'), TRUE);
134 * Test the batch merge does not bork on custom date fields.
136 * @dataProvider getCheckboxData
138 * Test CRM-19074 checkbox field handling.
140 * Given a custom field with 2 checkboxes (black & white) possible values are:
141 * 1) SEPARATOR + black + SEPARATOR
142 * 2) SEPARATOR + white + SEPARATOR
143 * 3) SEPARATOR + black + SEPARATOR + white + SEPARATOR
144 * 3) '' (ie empty string means both set to 0)
145 * 4) NULL (ie not set)
146 * - in safe mode NULL is not a conflict with any option but the other
147 * combos are a conflict.
149 public function testBatchMergeCheckboxCustomFieldHandling($dataSet) {
150 $customFieldLabel = 'custom_' . $this->customStringCheckboxID
;
151 $contact1Params = is_array($dataSet['contacts'][0]) ?
array($customFieldLabel => $dataSet['contacts'][0]) : array();
152 $contact2Params = is_array($dataSet['contacts'][1]) ?
array($customFieldLabel => $dataSet['contacts'][1]) : array();
153 $contactID = $this->individualCreate($contact1Params);
154 $this->individualCreate($contact2Params);
155 $result = $this->callAPISuccess('Job', 'process_batch_merge', array('mode' => $dataSet['mode']));
156 $this->assertEquals($dataSet['merged'], count($result['values']['merged']));
157 $this->assertEquals($dataSet['skipped'], count($result['values']['skipped']));
158 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
159 $this->assertEquals($dataSet['expected'], $contact[$customFieldLabel]);
163 * Get the various data combinations for a checkbox field.
167 public function getCheckboxData() {
170 'null_merges_with_set' => array(
178 'expected' => array('black'),
182 'null_merges_with_set_reverse' => array(
190 'expected' => array('black'),
195 'empty_conflicts_with_set' => array(
203 'expected' => array('white'),
207 'empty_conflicts_with_set' => array(
208 'mode' => 'aggressive',
215 'expected' => array('white'),
222 * Test the batch merge does not bork on custom date fields.
224 * Test CRM-18674 date custom field handling.
226 public function testBatchMergeDateCustomFieldHandling() {
227 $customFieldLabel = 'custom_' . $this->customFieldID
;
228 $contactID = $this->individualCreate();
229 $this->individualCreate(array($customFieldLabel => '2012-12-03'));
230 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
231 $this->assertEquals(1, count($result['values']['merged']));
232 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
233 $this->assertEquals('2012-12-03 00:00:00', $contact[$customFieldLabel]);
237 * Test the batch merge does not bork on custom date fields.
239 * Test CRM-18674 date custom field handling.
241 public function testBatchMergeDateCustomFieldHandlingIsView() {
242 $this->customFieldCreate(array(
243 'id' => $this->customFieldID
,
246 $customFieldLabel = 'custom_' . $this->customFieldID
;
247 $contactID = $this->individualCreate();
248 $this->individualCreate(array($customFieldLabel => '2012-11-03'));
249 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
250 $this->assertEquals(1, count($result['values']['merged']));
251 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
252 $this->assertEquals('2012-11-03', $contact[$customFieldLabel]);
256 * Check we get a conflict on the custom field.
258 public function testBatchMergeDateCustomFieldConflict() {
259 $customFieldLabel = 'custom_' . $this->customFieldID
;
260 $contactID = $this->individualCreate(array($customFieldLabel => '2012-11-03'));
261 $this->individualCreate(array($customFieldLabel => '2013-11-03'));
262 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
263 $this->assertEquals(0, count($result['values']['merged']));
264 $this->assertEquals(1, count($result['values']['skipped']));
265 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
266 $this->assertEquals('2012-11-03 00:00:00', $contact[$customFieldLabel]);
270 * Check we get a conflict on the custom field.
272 public function testBatchMergeDateCustomFieldNoConflict() {
273 $customFieldLabel = 'custom_' . $this->customFieldID
;
274 $contactID = $this->individualCreate(array($customFieldLabel => '2012-11-03'));
275 $this->individualCreate(array($customFieldLabel => '2012-11-03'));
276 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
277 $this->assertEquals(1, count($result['values']['merged']));
278 $this->assertEquals(0, count($result['values']['skipped']));
279 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
280 $this->assertEquals('2012-11-03 00:00:00', $contact[$customFieldLabel]);
284 * Check we get a no conflict on the custom field & integer merges.
286 public function testBatchMergeIntCustomFieldNoConflict() {
287 $customFieldLabel = 'custom_' . $this->customIntFieldID
;
288 $contactID = $this->individualCreate(array());
289 $this->individualCreate(array($customFieldLabel => 20));
290 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
291 $this->assertEquals(1, count($result['values']['merged']));
292 $this->assertEquals(0, count($result['values']['skipped']));
293 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
294 $this->assertEquals(20, $contact[$customFieldLabel]);
298 * Check we get a conflict on the integer custom field.
300 public function testBatchMergeIntCustomFieldConflict() {
301 $customFieldLabel = 'custom_' . $this->customIntFieldID
;
302 $contactID = $this->individualCreate(array($customFieldLabel => 20));
303 $this->individualCreate(array($customFieldLabel => 1));
304 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
305 $this->assertEquals(0, count($result['values']['merged']));
306 $this->assertEquals(1, count($result['values']['skipped']));
307 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
308 $this->assertEquals(20, $contact[$customFieldLabel]);
312 * Check we get a conflict on the integer custom field when the conflicted field is 0.
314 public function testBatchMergeIntCustomFieldConflictZero() {
315 $customFieldLabel = 'custom_' . $this->customIntFieldID
;
316 $contactID = $this->individualCreate(array($customFieldLabel => 0));
317 $this->individualCreate(array($customFieldLabel => 20));
318 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
319 $this->assertEquals(0, count($result['values']['merged']));
320 $this->assertEquals(1, count($result['values']['skipped']));
321 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
322 $this->assertEquals(0, $contact[$customFieldLabel]);
326 * Using the api with check perms set to off, make sure custom data is merged.
328 * Test CRM-18674 date custom field handling.
330 public function testBatchMergeDateCustomFieldConflictAndNoCheckPerms() {
331 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array('access CiviCRM', 'edit my contact');
332 CRM_Core_DAO
::executeQuery("DELETE FROM civicrm_cache");
333 CRM_Utils_System
::flushCache();
334 $customFieldLabel = 'custom_' . $this->customFieldID
;
335 $contactID = $this->individualCreate(array($customFieldLabel => '2012-11-03'));
336 $this->individualCreate(array($customFieldLabel => '2013-11-03'));
337 $result = $this->callAPISuccess('Job', 'process_batch_merge', array('check_permissions' => 0));
338 $this->assertEquals(0, count($result['values']['merged']));
339 $this->assertEquals(1, count($result['values']['skipped']));
340 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
341 $this->assertEquals('2012-11-03 00:00:00', $contact[$customFieldLabel]);
345 * Using the api with check perms set to off, make sure custom data is merged.
347 * Test CRM-18674 date custom field handling.
349 public function testBatchMergeDateCustomFieldNoConflictAndNoCheckPerms() {
350 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array('access CiviCRM', 'edit my contact');
351 CRM_Core_DAO
::executeQuery("DELETE FROM civicrm_cache");
352 CRM_Utils_System
::flushCache();
353 $customFieldLabel = 'custom_' . $this->customFieldID
;
354 $contactID = $this->individualCreate();
355 $this->individualCreate(array($customFieldLabel => '2013-11-03'));
356 $result = $this->callAPISuccess('Job', 'process_batch_merge', array('check_permissions' => 0));
357 $this->assertEquals(1, count($result['values']['merged']));
358 $this->assertEquals(0, count($result['values']['skipped']));
359 $contact = $this->callAPISuccess('Contact', 'getsingle', array('id' => $contactID, 'return' => $customFieldLabel));
360 $this->assertEquals('2013-11-03 00:00:00', $contact[$customFieldLabel]);
364 * Using the api with check perms set to off, make sure custom data is merged.
366 * Test CRM-19113 custom data lost when permissions in play.
368 public function testBatchMergeIntCustomFieldNoConflictAndNoCheckPerms() {
369 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array('access CiviCRM', 'edit my contact');
370 CRM_Core_DAO
::executeQuery("DELETE FROM civicrm_cache");
371 CRM_Utils_System
::flushCache();
372 $customFieldLabel = 'custom_' . $this->customIntFieldID
;
373 $contactID = $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 1));
374 $this->individualCreate(array($customFieldLabel => 1, 'custom_' . $this->customBoolFieldID
=> 1));
375 $result = $this->callAPISuccess('Job', 'process_batch_merge', array('check_permissions' => 0));
376 $this->assertEquals(1, count($result['values']['merged']));
377 $this->assertEquals(0, count($result['values']['skipped']));
378 $contact = $this->callAPISuccess('Contact', 'getsingle', array(
380 'return' => array($customFieldLabel, 'custom_' . $this->customBoolFieldID
),
382 $this->assertEquals(1, $contact[$customFieldLabel]);
383 $this->assertEquals(1, $contact['custom_' . $this->customBoolFieldID
]);
387 * Check we get a conflict on the customs field when the data conflicts for booleans.
389 public function testBatchMergeCustomFieldConflicts() {
390 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 0));
391 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 1));
392 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
393 $this->assertEquals(0, count($result['values']['merged']));
394 $this->assertEquals(1, count($result['values']['skipped']));
398 * Check we get a conflict on the customs field when the data conflicts for booleans (reverse).
400 public function testBatchMergeCustomFieldConflictsReverse() {
401 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 1));
402 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 0));
403 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
404 $this->assertEquals(0, count($result['values']['merged']));
405 $this->assertEquals(1, count($result['values']['skipped']));
409 * Check we get a conflict on the customs field when the data conflicts for booleans (reverse).
411 public function testBatchMergeCustomFieldConflictsOneBlank() {
412 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 1));
413 $this->individualCreate();
414 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
415 $this->assertEquals(1, count($result['values']['merged']));
416 $this->assertEquals(0, count($result['values']['skipped']));
420 * Check we get a conflict on the customs field when the data conflicts for booleans (reverse).
422 public function testBatchMergeCustomFieldConflictsOneBlankReverse() {
423 $this->individualCreate();
424 $this->individualCreate(array('custom_' . $this->customBoolFieldID
=> 1));
425 $result = $this->callAPISuccess('Job', 'process_batch_merge', array());
426 $this->assertEquals(1, count($result['values']['merged']));
427 $this->assertEquals(0, count($result['values']['skipped']));