diff --git a/user/tests/userlib_test.php b/user/tests/userlib_test.php index 73e86bbdd73..1edb2bad475 100644 --- a/user/tests/userlib_test.php +++ b/user/tests/userlib_test.php @@ -694,4 +694,183 @@ class core_userliblib_testcase extends advanced_testcase { self::assertSame('50', $got['timezone']); self::assertSame('0', $got['mailformat']); } + + /** + * Test returning the total number of participants. + */ + public function test_user_get_total_participants() { + global $DB; + + $this->resetAfterTest(); + + // Create a course. + $course = self::getDataGenerator()->create_course(); + + // Create a teacher. + $teacher = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + + // Create a bunch of students. + $student1 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $student2 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $student3 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + + // Create a group. + $group = self::getDataGenerator()->create_group(array('courseid' => $course->id)); + + // Enrol the students. + self::getDataGenerator()->enrol_user($student1->id, $course->id); + self::getDataGenerator()->enrol_user($student2->id, $course->id); + self::getDataGenerator()->enrol_user($student3->id, $course->id); + + // Enrol the teacher. + $roleids = $DB->get_records_menu('role', null, '', 'shortname, id'); + self::getDataGenerator()->enrol_user($teacher->id, $course->id, $roleids['editingteacher']); + + // Add the teacher and two of the students to the group. + groups_add_member($group->id, $teacher->id); + groups_add_member($group->id, $student1->id); + groups_add_member($group->id, $student2->id); + + // Set it so the teacher and two of the students have accessed the courses within the last day, + // but only one of the students is in the group. + $accesssince = time() - DAYSECS; + $lastaccess = new stdClass(); + $lastaccess->userid = $teacher->id; + $lastaccess->courseid = $course->id; + $lastaccess->timeaccess = time() - DAYSECS; + $DB->insert_record('user_lastaccess', $lastaccess); + + $lastaccess->userid = $student1->id; + $DB->insert_record('user_lastaccess', $lastaccess); + + $lastaccess->userid = $student3->id; + $DB->insert_record('user_lastaccess', $lastaccess); + + // Now, when we perform the following search we should only return 1 user. A student who belongs to + // the group and has the name 'searchforthis' and has also accessed the course in the last day. + $count = user_get_total_participants($course->id, $group->id, $accesssince + 1, $roleids['student'], 'searchforthis'); + + $this->assertEquals(1, $count); + } + + /** + * Test returning the number of participants on the front page. + */ + public function test_user_get_total_participants_on_front_page() { + $this->resetAfterTest(); + + // Set it so that only 3 users have accessed the site within the last day. + $accesssince = time() - DAYSECS; + + // Create a bunch of users. + $user1 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + $user2 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + $user3 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $user4 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + + // Create a group. + $group = self::getDataGenerator()->create_group(array('courseid' => SITEID)); + + // Add 3 of the users to a group. + groups_add_member($group->id, $user1->id); + groups_add_member($group->id, $user2->id); + groups_add_member($group->id, $user3->id); + + // Now, when we perform the following search we should only return 2 users. Users who belong to + // the group and have the name 'searchforthis' and have also accessed the site in the last day. + $count = user_get_total_participants(SITEID, $group->id, $accesssince + 1, 0, 'searchforthis'); + + $this->assertEquals(2, $count); + } + + /** + * Test returning the participants. + */ + public function test_user_get_participants() { + global $DB; + + $this->resetAfterTest(); + + // Create a course. + $course = self::getDataGenerator()->create_course(); + + // Create a teacher. + $teacher = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + + // Create a bunch of students. + $student1 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $student2 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $student3 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + + // Create a group. + $group = self::getDataGenerator()->create_group(array('courseid' => $course->id)); + + // Enrol the students. + self::getDataGenerator()->enrol_user($student1->id, $course->id); + self::getDataGenerator()->enrol_user($student2->id, $course->id); + self::getDataGenerator()->enrol_user($student3->id, $course->id); + + // Enrol the teacher. + $roleids = $DB->get_records_menu('role', null, '', 'shortname, id'); + self::getDataGenerator()->enrol_user($teacher->id, $course->id, $roleids['editingteacher']); + + // Add the teacher and two of the students to the group. + groups_add_member($group->id, $teacher->id); + groups_add_member($group->id, $student1->id); + groups_add_member($group->id, $student2->id); + + // Set it so the teacher and two of the students have accessed the course within the last day, but only one of + // the students is in the group. + $accesssince = time() - DAYSECS; + $lastaccess = new stdClass(); + $lastaccess->userid = $teacher->id; + $lastaccess->courseid = $course->id; + $lastaccess->timeaccess = time() - DAYSECS; + $DB->insert_record('user_lastaccess', $lastaccess); + + $lastaccess->userid = $student1->id; + $DB->insert_record('user_lastaccess', $lastaccess); + + $lastaccess->userid = $student3->id; + $DB->insert_record('user_lastaccess', $lastaccess); + + // Now, when we perform the following search we should only return 1 user. A student who belongs to + // the group and has the name 'searchforthis' and has also accessed the course in the last day. + $userset = user_get_participants($course->id, $group->id, $accesssince + 1, $roleids['student'], 'searchforthis'); + + $this->assertEquals(1, sizeof($userset)); + $this->assertEquals($student1->id, $userset->current()->id); + } + + /** + * Test returning the participants on the front page. + */ + public function test_user_get_participants_on_front_page() { + $this->resetAfterTest(); + + // Set it so that only 3 users have accessed the site within the last day. + $accesssince = time() - DAYSECS; + + // Create a bunch of users. + $user1 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + $user2 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + $user3 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis']); + $user4 = self::getDataGenerator()->create_user(['firstname' => 'searchforthis', 'lastaccess' => $accesssince]); + + // Create a group. + $group = self::getDataGenerator()->create_group(array('courseid' => SITEID)); + + // Add 3 of the users to a group. + groups_add_member($group->id, $user1->id); + groups_add_member($group->id, $user2->id); + groups_add_member($group->id, $user3->id); + + // Now, when we perform the following search we should only return 2 users. Users who belong to + // the group and have the name 'searchforthis' and have also accessed the site in the last day. + $userset = user_get_participants(SITEID, $group->id, $accesssince + 1, 0, 'searchforthis'); + + $this->assertEquals($user1->id, $userset->current()->id); + $userset->next(); + $this->assertEquals($user2->id, $userset->current()->id); + } }