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