MDL-6074 blocks: Hide user in online users block
[moodle.git] / blocks / online_users / tests / online_users_test.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Online users tests
19  *
20  * @package    block_online_users
21  * @category   test
22  * @copyright  2015 University of Nottingham <www.nottingham.ac.uk>
23  * @author     Barry Oosthuizen <barry.oosthuizen@nottingham.ac.uk>
24  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25  */
27 use block_online_users\fetcher;
29 defined('MOODLE_INTERNAL') || die();
31 /**
32  * Online users testcase
33  *
34  * @package    block_online_users
35  * @category   test
36  * @copyright  2015 University of Nottingham <www.nottingham.ac.uk>
37  * @author     Barry Oosthuizen <barry.oosthuizen@nottingham.ac.uk>
38  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class block_online_users_testcase extends advanced_testcase {
42     protected $data;
44     /**
45      * Tests initial setup.
46      *
47      * Prepare the site with some courses, groups, users and
48      * simulate various recent accesses.
49      */
50     protected function setUp() {
52         // Generate (simulated) recently logged-in users.
53         $generator = $this->getDataGenerator()->get_plugin_generator('block_online_users');
54         $this->data = $generator->create_logged_in_users();
56         // Confirm we have modified the site and requires reset.
57         $this->resetAfterTest(true);
58     }
60     /**
61      * Check logged in group 1, 2 & 3 members in course 1 (should be 3, 4 and 0).
62      *
63      * @param array $data Array of user, course and group objects
64      * @param int $now Current Unix timestamp
65      * @param int $timetoshowusers The time window (in seconds) to check for the latest logged in users
66      */
67     public function test_fetcher_course1_group_members() {
68         global $CFG;
70         $groupid = $this->data['group1']->id;
71         $now = time();
72         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
73         $context = context_course::instance($this->data['course1']->id);
74         $courseid = $this->data['course1']->id;
75         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
77         $usercount = $onlineusers->count_users();
78         $users = $onlineusers->get_users();
79         $this->assertEquals(3, $usercount, 'There was a problem counting the number of online users in group 1');
80         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users in group 1');
82         $groupid = $this->data['group2']->id;
83         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
85         $usercount = $onlineusers->count_users();
86         $users = $onlineusers->get_users();
87         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users in group 2');
88         $this->assertEquals(4, $usercount, 'There was a problem counting the number of online users in group 2');
90         $groupid = $this->data['group3']->id;
91         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
93         $usercount = $onlineusers->count_users();
94         $users = $onlineusers->get_users();
95         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users in group 3');
96         $this->assertEquals(0, $usercount, 'There was a problem counting the number of online users in group 3');
97     }
99     /**
100      * Check logged in users in courses 1 & 2 (should be 9 and 0).
101      *
102      * @param array $data Array of user, course and group objects
103      * @param int $now Current Unix timestamp
104      * @param int $timetoshowusers The time window (in seconds) to check for the latest logged in users
105      */
106     public function test_fetcher_courses() {
108         global $CFG;
110         $currentgroup = null;
111         $now = time();
112         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
113         $context = context_course::instance($this->data['course1']->id);
114         $courseid = $this->data['course1']->id;
115         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, false, $courseid);
117         $usercount = $onlineusers->count_users();
118         $users = $onlineusers->get_users();
119         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users in course 1');
120         $this->assertEquals(9, $usercount, 'There was a problem counting the number of online users in course 1');
122         $courseid = $this->data['course2']->id;
123         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, false, $courseid);
125         $usercount = $onlineusers->count_users();
126         $users = $onlineusers->get_users();
127         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users in course 2');
128         $this->assertEquals(0, $usercount, 'There was a problem counting the number of online users in course 2');
129     }
131     /**
132      * Check logged in at the site level (should be 12).
133      *
134      * @param int $now Current Unix timestamp
135      * @param int $timetoshowusers The time window (in seconds) to check for the latest logged in users
136      */
137     public function test_fetcher_sitelevel() {
138         global $CFG;
140         $currentgroup = null;
141         $now = time();
142         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
143         $context = context_system::instance();
144         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, true);
146         $usercount = $onlineusers->count_users();
147         $users = $onlineusers->get_users();
148         $this->assertEquals($usercount, count($users), 'There was a problem counting the number of online users at site level');
149         $this->assertEquals(12, $usercount, 'There was a problem counting the number of online users at site level');
150     }
152     /**
153      * Check user visibility setting for course group members.
154      */
155     public function test_user_visibility_course1_group1_members() {
156         global $CFG;
158         $groupid = $this->data['group1']->id;
159         $now = time();
160         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
161         $context = context_course::instance($this->data['course1']->id);
162         $courseid = $this->data['course1']->id;
163         $user1 = $this->data['user1'];
164         $user2 = $this->data['user2'];
165         // Set user2 as logged user.
166         $this->setUser($user2);
167         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
168         $users = $onlineusers->get_users();
169         $usercount = $onlineusers->count_users();
170         // User1 should be displayed in the online users block.
171         $this->assertEquals(3, $usercount);
172         $this->assertTrue(array_key_exists($user1->id, $users));
173         // Set user1 as logged user.
174         $this->setUser($user1);
175         // Set visibility to 'hide' for user1.
176         set_user_preference('block_online_users_uservisibility', 0);
177         // Test if the fetcher gets all the users including user1.
178         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
179         $users = $onlineusers->get_users();
180         $usercount = $onlineusers->count_users();
181         // User1 should be displayed in the online users block.
182         $this->assertEquals(3, $usercount);
183         $this->assertTrue(array_key_exists($user1->id, $users));
184         // Set user2 as logged user.
185         $this->setUser($user2);
186         // Test if the fetcher gets all the users excluding user1.
187         $onlineusers = new fetcher($groupid, $now, $timetoshowusers, $context, false, $courseid);
188         $users = $onlineusers->get_users();
189         $usercount = $onlineusers->count_users();
190         // User1 should not be displayed in the online users block.
191         $this->assertEquals(2, $usercount);
192         $this->assertFalse(array_key_exists($user1->id, $users));
193     }
195     /**
196      * Check user visibility setting at course level.
197      */
198     public function test_user_visibility_courses() {
199         global $CFG;
201         $currentgroup = null;
202         $now = time();
203         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
204         $context = context_course::instance($this->data['course1']->id);
205         $courseid = $this->data['course1']->id;
206         $user1 = $this->data['user1'];
207         $user2 = $this->data['user2'];
208         // Set user2 as logged user.
209         $this->setUser($user2);
210         // Test if the fetcher gets all the users including user1.
211         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, false, $courseid);
212         $users = $onlineusers->get_users();
213         $usercount = $onlineusers->count_users();
214         // User1 should be displayed in the online users block.
215         $this->assertEquals(9, $usercount);
216         $this->assertTrue(array_key_exists($user1->id, $users));
217         // Set user1 as logged user.
218         $this->setUser($user1);
219         // Set visibility to 'hide' for user1.
220         set_user_preference('block_online_users_uservisibility', 0);
221         // Test if the fetcher gets all the users including user1.
222         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, false, $courseid);
223         $users = $onlineusers->get_users();
224         $usercount = $onlineusers->count_users();
225         // User1 should be displayed in the online users block.
226         $this->assertEquals(9, $usercount);
227         $this->assertTrue(array_key_exists($user1->id, $users));
228         // Set user2 as logged user.
229         $this->setUser($user2);
230         // Test if the fetcher gets all the users excluding user1.
231         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, false, $courseid);
232         $users = $onlineusers->get_users();
233         $usercount = $onlineusers->count_users();
234         // User1 should not be displayed in the online users block.
235         $this->assertEquals(8, $usercount);
236         $this->assertFalse(array_key_exists($user1->id, $users));
237     }
239     /**
240      * Check user visibility setting at site level.
241      */
242     public function test_user_visibility_sitelevel() {
243         global $CFG;
245         $currentgroup = null;
246         $now = time();
247         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
248         $context = context_system::instance();
249         $user1 = $this->data['user1'];
250         $user2 = $this->data['user2'];
251         // Set user2 as logged user.
252         $this->setUser($user2);
253         // Test if the fetcher gets all the users including user1.
254         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, true);
255         $users = $onlineusers->get_users();
256         $usercount = $onlineusers->count_users();
257         // User1 should be displayed in the online users block.
258         $this->assertEquals(12, $usercount);
259         $this->assertTrue(array_key_exists($user1->id, $users));
260         // Set user1 as logged user.
261         $this->setUser($user1);
262         // Set visibility to 'hide' for user1.
263         set_user_preference('block_online_users_uservisibility', 0);
264         // Test if the fetcher gets all the users including user1.
265         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, true);
266         $users = $onlineusers->get_users();
267         $usercount = $onlineusers->count_users();
268         // User1 should be displayed in the online users block.
269         $this->assertEquals(12, $usercount);
270         $this->assertTrue(array_key_exists($user1->id, $users));
271         // Set user2 as logged user.
272         $this->setUser($user2);
273         // Test if the fetcher gets all the users excluding user1.
274         $onlineusers = new fetcher($currentgroup, $now, $timetoshowusers, $context, true);
275         $users = $onlineusers->get_users();
276         $usercount = $onlineusers->count_users();
277         // User1 should not be displayed in the online users block.
278         $this->assertEquals(11, $usercount);
279         $this->assertFalse(array_key_exists($user1->id, $users));
280     }