Merge pull request #3112 from freeform/CRM-14568
[civicrm-core.git] / tests / phpunit / CRM / Group / Page / AjaxTest.php
1 <?php
2 require_once 'CiviTest/CiviUnitTestCase.php';
3 class CRM_Group_Page_AjaxTest extends CiviUnitTestCase {
4 /**
5 * Permissioned group is used both as an active group the contact can see and as a group that allows
6 * logged in user to see contacts
7 * @var integer
8 */
9 protected $_permissionedGroup;
10 /**
11 * AS disabled group the contact has permission to
12 * @var unknown
13 */
14 protected $_permissionedDisabledGroup;
15
16 protected $hookClass;
17
18 protected $_params = array();
19
20 function get_info() {
21 return array(
22 'name' => 'Contact BAOs',
23 'description' => 'Test all Contact_BAO_Contact methods.',
24 'group' => 'CiviCRM BAO Tests',
25 );
26 }
27
28 function setUp() {
29 parent::setUp();
30 $this->_params = array(
31 'sEcho' => '1',
32 'page' => 1,
33 'rp' => 50,
34 'offset' => 0,
35 'rowCount' => 50,
36 'sort' => NULL,
37 'is_unit_test' => TRUE,
38 );
39 $this->hookClass = CRM_Utils_Hook::singleton();
40 $this->createLoggedInUser();
41 $this->_permissionedDisabledGroup = $this->groupCreate(array('title' => 'pick-me-disabled', 'is_active' => 0, 'name' => 'pick-me-disabled'));
42 $this->_permissionedGroup = $this->groupCreate(array('title' => 'pick-me-active', 'is_active' => 1, 'name' => 'pick-me-active'));
43 $this->groupCreate(array('title' => 'not-me-disabled', 'is_active' => 0, 'name' => 'not-me-disabled'));
44 $this->groupCreate(array('title' => 'not-me-active', 'is_active' => 1, 'name' => 'not-me-active'));
45 }
46
47 function tearDown() {
48 CRM_Utils_Hook::singleton()->reset();
49 $this->quickCleanup(array('civicrm_group'));
50 $config = CRM_Core_Config::singleton();
51 unset($config->userPermissionClass->permissions);
52 parent::tearDown();
53 }
54
55 /**
56 * @param $permission
57 */
58 function setPermissionAndRequest($permission) {
59 CRM_Core_Config::singleton()->userPermissionClass->permissions = array($permission);
60 CRM_Contact_BAO_Group::getPermissionClause(TRUE);
61 global $_REQUEST;
62 $_REQUEST = $this->_params;
63 }
64
65 /**
66 * @param $permission
67 * @param $hook
68 */
69 function setHookAndRequest($permission, $hook) {
70 CRM_Core_Config::singleton()->userPermissionClass->permissions = array($permission);
71 $this->hookClass->setHook('civicrm_aclGroup', array($this, $hook));
72 CRM_Contact_BAO_Group::getPermissionClause(TRUE);
73 global $_REQUEST;
74 $_REQUEST = $this->_params;
75 }
76 /**
77 * retrieve groups as 'view all contacts'
78 */
79 function testGroupListViewAllContacts() {
80 $this->setPermissionAndRequest('view all contacts');
81 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
82 $this->assertEquals(2, $total);
83 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
84 $this->assertEquals('not-me-active', $groups[4]['group_name']);
85 }
86
87 /**
88 * retrieve groups as 'view all contacts' permissioned user
89 * Without setting params the default is both enabled & disabled
90 * (if you do set default it is enabled only)
91 */
92 function testGroupListViewAllContactsFoundTitle() {
93 $this->_params['title'] = 'p';
94 $this->setPermissionAndRequest('view all contacts');
95 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
96 $this->assertEquals(2, $total);
97 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
98 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
99 }
100
101 /**
102 * retrieve groups as 'view all contacts'
103 */
104 function testGroupListViewAllContactsNotFoundTitle() {
105 $this->_params['title'] = 'z';
106 $this->setPermissionAndRequest('view all contacts');
107 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
108 $this->assertEquals(0, $total);
109 }
110 /**
111 * retrieve groups as 'edit all contacts'
112 */
113 function testGroupListEditAllContacts() {
114 $this->setPermissionAndRequest('edit all contacts');
115 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
116 $this->assertEquals(2, $total);
117 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
118 $this->assertEquals('not-me-active', $groups[4]['group_name']);
119 }
120
121 /**
122 * retrieve groups as 'view all contacts'
123 */
124 function testGroupListViewAllContactsEnabled() {
125 $this->_params['status'] = 1;
126 $this->setPermissionAndRequest('view all contacts');
127 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
128 $this->assertEquals(2, $total);
129 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
130 $this->assertEquals('not-me-active', $groups[4]['group_name']);
131 }
132
133 /**
134 * retrieve groups as 'view all contacts'
135 */
136 function testGroupListViewAllContactsDisabled() {
137 $this->_params['status'] = 2;
138 $this->setPermissionAndRequest('view all contacts');
139 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
140 $this->assertEquals(2, $total);
141 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
142 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
143 }
144
145 /**
146 * retrieve groups as 'view all contacts'
147 */
148 function testGroupListViewAllContactsDisabledNotFoundTitle() {
149 $this->_params['status'] = 2;
150 $this->_params['title'] = 'n';
151 $this->setPermissionAndRequest('view all contacts');
152 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
153 $this->assertEquals(1, $total);
154 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
155 }
156
157 /**
158 * retrieve groups as 'view all contacts'
159 */
160 function testGroupListViewAllContactsDisabledFoundTitle() {
161 $this->_params['status'] = 2;
162 $this->_params['title'] = 'p';
163 $this->setPermissionAndRequest('view all contacts');
164 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
165 $this->assertEquals(1, $total);
166 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
167 }
168
169 /**
170 * retrieve groups as 'view all contacts'
171 */
172 function testGroupListViewAllContactsAll() {
173 $this->_params['status'] = 3;
174 $this->setPermissionAndRequest('view all contacts');
175 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
176 $this->assertEquals(4, $total);
177 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
178 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
179 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
180 $this->assertEquals('not-me-active', $groups[4]['group_name']);
181 }
182
183
184 /**
185 * retrieve groups as 'view all contacts'
186 */
187 function testGroupListAccessCiviCRM() {
188 $this->setPermissionAndRequest('access CiviCRM');
189 $permissionClause = CRM_Contact_BAO_Group::getPermissionClause(TRUE);
190 $this->assertEquals('1 = 0', $permissionClause);
191 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
192 $this->assertEquals(0, count($groups));
193 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
194 }
195 /**
196 * retrieve groups as 'view all contacts'
197 */
198 function testGroupListAccessCiviCRMEnabled() {
199 $this->_params['status'] = 1;
200 $this->setPermissionAndRequest('access CiviCRM');
201 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
202 $this->assertEquals(0, count($groups));
203 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
204 }
205 /**
206 * retrieve groups as 'view all contacts'
207 */
208 function testGroupListAccessCiviCRMDisabled() {
209 $this->_params['status'] = 2;
210 $this->setPermissionAndRequest('access CiviCRM');
211 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
212 $this->assertEquals(0, count($groups));
213 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
214 }
215
216 /**
217 * retrieve groups as 'view all contacts'
218 */
219 function testGroupListAccessCiviCRMAll() {
220 $this->_params['status'] = 2;
221 $this->setPermissionAndRequest('access CiviCRM');
222 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
223 $this->assertEquals(0, count($groups));
224 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
225 }
226
227 /**
228 * retrieve groups as 'view all contacts'
229 */
230 function testGroupListAccessCiviCRMFound() {
231 $this->_params['title'] = 'p';
232 $this->setPermissionAndRequest('access CiviCRM');
233 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
234 $this->assertEquals(0, count($groups));
235 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
236 }
237
238 /**
239 * retrieve groups as 'view all contacts'
240 */
241 function testGroupListAccessCiviCRMNotFound() {
242 $this->_params['title'] = 'z';
243 $this->setPermissionAndRequest('access CiviCRM');
244 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
245 $this->assertEquals(0, count($groups));
246 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
247 }
248
249 function testTraditionalACL () {
250 $this->setupACL();
251 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
252 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
253 $this->assertEquals(1, $total, 'Total needs to be set correctly');
254 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
255 }
256
257 function testTraditionalACLNotFoundTitle () {
258 $this->_params['title'] = 'n';
259 $this->setupACL();
260 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
261 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
262 $this->assertEquals(0, $total, 'Total needs to be set correctly');
263 }
264
265 function testTraditionalACLFoundTitle () {
266 $this->_params['title'] = 'p';
267 $this->setupACL();
268 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
269 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
270 $this->assertEquals(2, $total, 'Total needs to be set correctly');
271 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
272 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
273 }
274
275 function testTraditionalACLDisabled () {
276 $this->_params['status'] = 2;
277 $this->setupACL();
278 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
279 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
280 $this->assertEquals(1, $total, 'Total needs to be set correctly');
281 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
282 }
283
284 function testTraditionalACLDisabledFoundTitle () {
285 $this->_params['status'] = 2;
286 $this->_params['title'] = 'p';
287 $this->setupACL();
288 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
289 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
290 $this->assertEquals(1, $total, 'Total needs to be set correctly');
291 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
292 }
293
294 function testTraditionalACLDisabledNotFoundTitle () {
295 $this->_params['status'] = 2;
296 $this->_params['title'] = 'n';
297 $this->setupACL();
298 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
299 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
300 $this->assertEquals(0, $total, 'Total needs to be set correctly');
301 }
302
303 function testTraditionalACLEnabled () {
304 $this->_params['status'] = 1;
305 $this->setupACL();
306 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
307 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
308 $this->assertEquals(1, $total, 'Total needs to be set correctly');
309 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
310 }
311
312 function testTraditionalACLAll () {
313 $this->_params['status'] = 3;
314 $this->setupACL();
315 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
316 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
317 $this->assertEquals(2, $total, 'Total needs to be set correctly');
318 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
319 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
320 }
321
322 /**
323 * ACL Group hook
324 */
325 function testGroupListAclGroupHookDisabled() {
326 $this->_params['status'] = 2;
327 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
328 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
329 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
330 $this->assertEquals(1, $total, 'Total needs to be set correctly');
331 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
332 }
333
334 /**
335 * ACL Group hook
336 */
337 function testGroupListAclGroupHookDisabledFound() {
338 $this->_params['status'] = 2;
339 $this->_params['title'] = 'p';
340 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
341 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
342 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
343 $this->assertEquals(1, $total, 'Total needs to be set correctly');
344 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
345 }
346
347 /**
348 * ACL Group hook
349 */
350 function testGroupListAclGroupHookDisabledNotFound() {
351 $this->_params['status'] = 2;
352 $this->_params['title'] = 'n';
353 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
354 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
355 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
356 $this->assertEquals(0, $total, 'Total needs to be set correctly');
357 }
358
359
360 /**
361 * ACL Group hook
362 */
363 function testGroupListAclGroupHook() {
364 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
365 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
366 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
367 $this->assertEquals(1, $total, 'Total needs to be set correctly');
368 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
369 }
370
371 /**
372 * ACL Group hook
373 */
374 function testGroupListAclGroupHookTitleNotFound() {
375 $this->_params['title'] = 'n';
376 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
377 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
378 $this->assertEquals(0, $total, 'Total needs to be set correctly');
379 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
380 }
381
382 /**
383 * ACL Group hook
384 */
385 function testGroupListAclGroupHookTitleFound() {
386 $this->_params['title'] = 'p';
387 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
388 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
389 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
390 $this->assertEquals(2, $total, 'Total needs to be set correctly');
391 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
392 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
393 }
394
395 /**
396 * ACL Group hook
397 */
398 function testGroupListAclGroupHookAll() {
399 $this->_params['status'] = 3;
400 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
401 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
402 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
403 $this->assertEquals(2, $total, 'Total needs to be set correctly');
404 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
405 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
406 }
407
408 /**
409 * ACL Group hook
410 */
411 function testGroupListAclGroupHookEnabled() {
412 $this->_params['status'] = 1;
413 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
414 list($groups, $total) = CRM_Group_Page_AJAX::getGroupList();
415 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
416 $this->assertEquals(1, $total, 'Total needs to be set correctly');
417 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
418 }
419
420 /**
421 * Implements ACLGroup hook
422 * aclGroup function returns a list of permitted groups
423 * @param string $type
424 * @param integer $contactID
425 * @param string $tableName
426 * @param array $allGroups
427 * @param array $currentGroups
428 */
429 function hook_civicrm_aclGroup($type, $contactID, $tableName, &$allGroups, &$currentGroups) {
430 //don't use api - you will get a loop
431 $sql = " SELECT * FROM civicrm_group WHERE name LIKE '%pick%'";
432 $groups = array();
433 $dao = CRM_Core_DAO::executeQuery($sql);
434 while ($dao->fetch()) {
435 $groups[] = $dao->id;
436 }
437
438 if(!empty($allGroups)) {
439 //all groups is empty if we really mean all groups but if a filter like 'is_disabled' is already applied
440 // it is populated, ajax calls from Manage Groups will leave empty but calls from New Mailing pass in a filtered list
441 $currentGroups = array_intersect($groups, array_flip($allGroups));
442 }
443 else {
444 $currentGroups = $groups;
445 }
446 }
447 }