2 require_once 'CiviTest/CiviUnitTestCase.php';
5 * Class CRM_Group_Page_AjaxTest
7 class CRM_Group_Page_AjaxTest
extends CiviUnitTestCase
{
9 * Permissioned group is used both as an active group the contact can see and as a group that allows
10 * logged in user to see contacts
13 protected $_permissionedGroup;
15 * AS disabled group the contact has permission to
18 protected $_permissionedDisabledGroup;
22 protected $_params = array();
24 public function setUp() {
26 $this->_params
= array(
33 'is_unit_test' => TRUE,
35 $this->hookClass
= CRM_Utils_Hook
::singleton();
36 $this->createLoggedInUser();
37 $this->_permissionedDisabledGroup
= $this->groupCreate(array('title' => 'pick-me-disabled', 'is_active' => 0, 'name' => 'pick-me-disabled'));
38 $this->_permissionedGroup
= $this->groupCreate(array('title' => 'pick-me-active', 'is_active' => 1, 'name' => 'pick-me-active'));
39 $this->groupCreate(array('title' => 'not-me-disabled', 'is_active' => 0, 'name' => 'not-me-disabled'));
40 $this->groupCreate(array('title' => 'not-me-active', 'is_active' => 1, 'name' => 'not-me-active'));
43 public function tearDown() {
44 CRM_Utils_Hook
::singleton()->reset();
45 $this->quickCleanup(array('civicrm_group'));
46 $config = CRM_Core_Config
::singleton();
47 unset($config->userPermissionClass
->permissions
);
54 public function setPermissionAndRequest($permission) {
55 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array($permission);
56 CRM_Contact_BAO_Group
::getPermissionClause(TRUE);
58 $_REQUEST = $this->_params
;
65 public function setHookAndRequest($permission, $hook) {
66 CRM_Core_Config
::singleton()->userPermissionClass
->permissions
= array($permission);
67 $this->hookClass
->setHook('civicrm_aclGroup', array($this, $hook));
68 CRM_Contact_BAO_Group
::getPermissionClause(TRUE);
70 $_REQUEST = $this->_params
;
73 * Retrieve groups as 'view all contacts'
75 public function testGroupListViewAllContacts() {
76 $this->setPermissionAndRequest('view all contacts');
77 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
78 $this->assertEquals(2, $total);
79 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
80 $this->assertEquals('not-me-active', $groups[4]['group_name']);
84 * Retrieve groups as 'view all contacts' permissioned user
85 * Without setting params the default is both enabled & disabled
86 * (if you do set default it is enabled only)
88 public function testGroupListViewAllContactsFoundTitle() {
89 $this->_params
['title'] = 'p';
90 $this->setPermissionAndRequest('view all contacts');
91 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
92 $this->assertEquals(2, $total);
93 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
94 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
98 * Retrieve groups as 'view all contacts'
100 public function testGroupListViewAllContactsNotFoundTitle() {
101 $this->_params
['title'] = 'z';
102 $this->setPermissionAndRequest('view all contacts');
103 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
104 $this->assertEquals(0, $total);
107 * Retrieve groups as 'edit all contacts'
109 public function testGroupListEditAllContacts() {
110 $this->setPermissionAndRequest('edit all contacts');
111 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
112 $this->assertEquals(2, $total);
113 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
114 $this->assertEquals('not-me-active', $groups[4]['group_name']);
118 * Retrieve groups as 'view all contacts'
120 public function testGroupListViewAllContactsEnabled() {
121 $this->_params
['status'] = 1;
122 $this->setPermissionAndRequest('view all contacts');
123 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
124 $this->assertEquals(2, $total);
125 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
126 $this->assertEquals('not-me-active', $groups[4]['group_name']);
130 * Retrieve groups as 'view all contacts'
132 public function testGroupListViewAllContactsDisabled() {
133 $this->_params
['status'] = 2;
134 $this->setPermissionAndRequest('view all contacts');
135 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
136 $this->assertEquals(2, $total);
137 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
138 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
142 * Retrieve groups as 'view all contacts'
144 public function testGroupListViewAllContactsDisabledNotFoundTitle() {
145 $this->_params
['status'] = 2;
146 $this->_params
['title'] = 'n';
147 $this->setPermissionAndRequest('view all contacts');
148 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
149 $this->assertEquals(1, $total);
150 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
154 * Retrieve groups as 'view all contacts'
156 public function testGroupListViewAllContactsDisabledFoundTitle() {
157 $this->_params
['status'] = 2;
158 $this->_params
['title'] = 'p';
159 $this->setPermissionAndRequest('view all contacts');
160 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
161 $this->assertEquals(1, $total);
162 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
166 * Retrieve groups as 'view all contacts'
168 public function testGroupListViewAllContactsAll() {
169 $this->_params
['status'] = 3;
170 $this->setPermissionAndRequest('view all contacts');
171 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
172 $this->assertEquals(4, $total);
173 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
174 $this->assertEquals('not-me-disabled', $groups[3]['group_name']);
175 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
176 $this->assertEquals('not-me-active', $groups[4]['group_name']);
181 * Retrieve groups as 'view all contacts'
183 public function testGroupListAccessCiviCRM() {
184 $this->setPermissionAndRequest('access CiviCRM');
185 $permissionClause = CRM_Contact_BAO_Group
::getPermissionClause(TRUE);
186 $this->assertEquals('1 = 0', $permissionClause);
187 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
188 $this->assertEquals(0, count($groups));
189 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
192 * Retrieve groups as 'view all contacts'
194 public function testGroupListAccessCiviCRMEnabled() {
195 $this->_params
['status'] = 1;
196 $this->setPermissionAndRequest('access CiviCRM');
197 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
198 $this->assertEquals(0, count($groups));
199 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
202 * Retrieve groups as 'view all contacts'
204 public function testGroupListAccessCiviCRMDisabled() {
205 $this->_params
['status'] = 2;
206 $this->setPermissionAndRequest('access CiviCRM');
207 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
208 $this->assertEquals(0, count($groups));
209 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
213 * Retrieve groups as 'view all contacts'
215 public function testGroupListAccessCiviCRMAll() {
216 $this->_params
['status'] = 2;
217 $this->setPermissionAndRequest('access CiviCRM');
218 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
219 $this->assertEquals(0, count($groups));
220 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
224 * Retrieve groups as 'view all contacts'
226 public function testGroupListAccessCiviCRMFound() {
227 $this->_params
['title'] = 'p';
228 $this->setPermissionAndRequest('access CiviCRM');
229 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
230 $this->assertEquals(0, count($groups));
231 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
235 * Retrieve groups as 'view all contacts'
237 public function testGroupListAccessCiviCRMNotFound() {
238 $this->_params
['title'] = 'z';
239 $this->setPermissionAndRequest('access CiviCRM');
240 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
241 $this->assertEquals(0, count($groups));
242 $this->assertEquals(0, $total, 'Total returned should be accurate based on permissions');
245 public function testTraditionalACL () {
247 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
248 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
249 $this->assertEquals(1, $total, 'Total needs to be set correctly');
250 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
253 public function testTraditionalACLNotFoundTitle () {
254 $this->_params
['title'] = 'n';
256 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
257 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
258 $this->assertEquals(0, $total, 'Total needs to be set correctly');
261 public function testTraditionalACLFoundTitle () {
262 $this->_params
['title'] = 'p';
264 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
265 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
266 $this->assertEquals(2, $total, 'Total needs to be set correctly');
267 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
268 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
271 public function testTraditionalACLDisabled () {
272 $this->_params
['status'] = 2;
274 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
275 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
276 $this->assertEquals(1, $total, 'Total needs to be set correctly');
277 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
280 public function testTraditionalACLDisabledFoundTitle () {
281 $this->_params
['status'] = 2;
282 $this->_params
['title'] = 'p';
284 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
285 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
286 $this->assertEquals(1, $total, 'Total needs to be set correctly');
287 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
290 public function testTraditionalACLDisabledNotFoundTitle () {
291 $this->_params
['status'] = 2;
292 $this->_params
['title'] = 'n';
294 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
295 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
296 $this->assertEquals(0, $total, 'Total needs to be set correctly');
299 public function testTraditionalACLEnabled () {
300 $this->_params
['status'] = 1;
302 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
303 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
304 $this->assertEquals(1, $total, 'Total needs to be set correctly');
305 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
308 public function testTraditionalACLAll () {
309 $this->_params
['status'] = 3;
311 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
312 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
313 $this->assertEquals(2, $total, 'Total needs to be set correctly');
314 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
315 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
321 public function testGroupListAclGroupHookDisabled() {
322 $this->_params
['status'] = 2;
323 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
324 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
325 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
326 $this->assertEquals(1, $total, 'Total needs to be set correctly');
327 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
333 public function testGroupListAclGroupHookDisabledFound() {
334 $this->_params
['status'] = 2;
335 $this->_params
['title'] = 'p';
336 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
337 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
338 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
339 $this->assertEquals(1, $total, 'Total needs to be set correctly');
340 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
346 public function testGroupListAclGroupHookDisabledNotFound() {
347 $this->_params
['status'] = 2;
348 $this->_params
['title'] = 'n';
349 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
350 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
351 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
352 $this->assertEquals(0, $total, 'Total needs to be set correctly');
359 public function testGroupListAclGroupHook() {
360 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
361 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
362 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
363 $this->assertEquals(1, $total, 'Total needs to be set correctly');
364 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
370 public function testGroupListAclGroupHookTitleNotFound() {
371 $this->_params
['title'] = 'n';
372 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
373 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
374 $this->assertEquals(0, $total, 'Total needs to be set correctly');
375 $this->assertEquals(0, count($groups), 'Returned groups should exclude disabled by default');
381 public function testGroupListAclGroupHookTitleFound() {
382 $this->_params
['title'] = 'p';
383 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
384 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
385 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
386 $this->assertEquals(2, $total, 'Total needs to be set correctly');
387 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
388 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
394 public function testGroupListAclGroupHookAll() {
395 $this->_params
['status'] = 3;
396 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
397 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
398 $this->assertEquals(2, count($groups), 'Returned groups should exclude disabled by default');
399 $this->assertEquals(2, $total, 'Total needs to be set correctly');
400 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
401 $this->assertEquals('pick-me-disabled', $groups[1]['group_name']);
407 public function testGroupListAclGroupHookEnabled() {
408 $this->_params
['status'] = 1;
409 $this->setHookAndRequest('access CiviCRM', 'hook_civicrm_aclGroup');
410 list($groups, $total) = CRM_Group_Page_AJAX
::getGroupList();
411 $this->assertEquals(1, count($groups), 'Returned groups should exclude disabled by default');
412 $this->assertEquals(1, $total, 'Total needs to be set correctly');
413 $this->assertEquals('pick-me-active', $groups[2]['group_name']);
417 * Implements ACLGroup hook
418 * aclGroup function returns a list of permitted groups
419 * @param string $type
420 * @param int $contactID
421 * @param string $tableName
422 * @param array $allGroups
423 * @param array $currentGroups
425 public function hook_civicrm_aclGroup($type, $contactID, $tableName, &$allGroups, &$currentGroups) {
426 //don't use api - you will get a loop
427 $sql = " SELECT * FROM civicrm_group WHERE name LIKE '%pick%'";
429 $dao = CRM_Core_DAO
::executeQuery($sql);
430 while ($dao->fetch()) {
431 $groups[] = $dao->id
;
434 if (!empty($allGroups)) {
435 //all groups is empty if we really mean all groups but if a filter like 'is_disabled' is already applied
436 // it is populated, ajax calls from Manage Groups will leave empty but calls from New Mailing pass in a filtered list
437 $currentGroups = array_intersect($groups, array_flip($allGroups));
440 $currentGroups = $groups;