2 require_once 'CiviTest/CiviUnitTestCase.php';
3 class CRM_Group_Page_AjaxTest
extends CiviUnitTestCase
{
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
9 protected $_permissionedGroup;
11 * AS disabled group the contact has permission to
14 protected $_permissionedDisabledGroup;
18 protected $_params = array();
22 'name' => 'Contact BAOs',
23 'description' => 'Test all Contact_BAO_Contact methods.',
24 'group' => 'CiviCRM BAO Tests',
30 $this->_params
= array(
37 'is_unit_test' => TRUE,
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'));
48 CRM_Utils_Hook
::singleton()->reset();
49 $this->quickCleanup(array('civicrm_group'));
50 $config = CRM_Core_Config
::singleton();
51 unset($config->userPermissionClass
->permissions
);
58 function setPermissionAndRequest($permission) {
59 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array($permission);
60 CRM_Contact_BAO_Group
::getPermissionClause(TRUE);
62 $_REQUEST = $this->_params
;
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);
74 $_REQUEST = $this->_params
;
77 * retrieve groups as 'view all contacts'
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']);
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)
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']);
102 * retrieve groups as 'view all contacts'
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);
111 * retrieve groups as 'edit all contacts'
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']);
122 * retrieve groups as 'view all contacts'
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']);
134 * retrieve groups as 'view all contacts'
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']);
146 * retrieve groups as 'view all contacts'
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']);
158 * retrieve groups as 'view all contacts'
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']);
170 * retrieve groups as 'view all contacts'
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']);
185 * retrieve groups as 'view all contacts'
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');
196 * retrieve groups as 'view all contacts'
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');
206 * retrieve groups as 'view all contacts'
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');
217 * retrieve groups as 'view all contacts'
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');
228 * retrieve groups as 'view all contacts'
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');
239 * retrieve groups as 'view all contacts'
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');
249 function testTraditionalACL () {
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']);
257 function testTraditionalACLNotFoundTitle () {
258 $this->_params
['title'] = 'n';
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');
265 function testTraditionalACLFoundTitle () {
266 $this->_params
['title'] = 'p';
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']);
275 function testTraditionalACLDisabled () {
276 $this->_params
['status'] = 2;
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']);
284 function testTraditionalACLDisabledFoundTitle () {
285 $this->_params
['status'] = 2;
286 $this->_params
['title'] = 'p';
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']);
294 function testTraditionalACLDisabledNotFoundTitle () {
295 $this->_params
['status'] = 2;
296 $this->_params
['title'] = 'n';
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');
303 function testTraditionalACLEnabled () {
304 $this->_params
['status'] = 1;
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']);
312 function testTraditionalACLAll () {
313 $this->_params
['status'] = 3;
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']);
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']);
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']);
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');
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']);
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');
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']);
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']);
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']);
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
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%'";
433 $dao = CRM_Core_DAO
::executeQuery($sql);
434 while ($dao->fetch()) {
435 $groups[] = $dao->id
;
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));
444 $currentGroups = $groups;