MDL-60028 enrol: fix counting of enrolled users in a given context.
authorPaul Holden <pholden@greenhead.ac.uk>
Fri, 7 Sep 2018 13:18:45 +0000 (14:18 +0100)
committerPaul Holden <pholden@greenhead.ac.uk>
Fri, 21 Sep 2018 09:14:55 +0000 (10:14 +0100)
Previously users enrolled in a course via multiple enrolment methods
would be counted multiple times.

enrol/tests/enrollib_test.php
lib/enrollib.php

index 1678462..0cabb96 100644 (file)
@@ -751,4 +751,45 @@ class core_enrollib_testcase extends advanced_testcase {
         $this->assertCount(2, enrol_get_course_users($course1->id, false));
         $this->assertCount(1, enrol_get_course_users($course1->id, true));
     }
+
+    /**
+     * Test count of enrolled users
+     *
+     * @return void
+     */
+    public function test_count_enrolled_users() {
+        global $DB;
+
+        $this->resetAfterTest(true);
+
+        $course = $this->getDataGenerator()->create_course();
+        $context = \context_course::instance($course->id);
+
+        $user1 = $this->getDataGenerator()->create_user();
+        $user2 = $this->getDataGenerator()->create_user();
+
+        $studentrole = $DB->get_record('role', ['shortname' => 'student']);
+
+        // Add each user to the manual enrolment instance.
+        $manual = enrol_get_plugin('manual');
+
+        $manualinstance = $DB->get_record('enrol', ['courseid' => $course->id, 'enrol' => 'manual'], '*', MUST_EXIST);
+
+        $manual->enrol_user($manualinstance, $user1->id, $studentrole->id);
+        $manual->enrol_user($manualinstance, $user2->id, $studentrole->id);
+
+        $this->assertEquals(2, count_enrolled_users($context));
+
+        // Create a self enrolment instance, enrol first user only.
+        $self = enrol_get_plugin('self');
+
+        $selfid = $self->add_instance($course,
+            ['status' => ENROL_INSTANCE_ENABLED, 'name' => 'Self', 'customint6' => 1, 'roleid' => $studentrole->id]);
+        $selfinstance = $DB->get_record('enrol', ['id' => $selfid], '*', MUST_EXIST);
+
+        $self->enrol_user($selfinstance, $user1->id, $studentrole->id);
+
+        // There are still only two distinct users.
+        $this->assertEquals(2, count_enrolled_users($context));
+    }
 }
index 2df4d50..e6830e4 100644 (file)
@@ -1505,7 +1505,7 @@ function count_enrolled_users(context $context, $withcapability = '', $groupid =
     $capjoin = get_enrolled_with_capabilities_join(
             $context, '', $withcapability, $groupid, $onlyactive);
 
-    $sql = "SELECT count(u.id)
+    $sql = "SELECT COUNT(DISTINCT u.id)
               FROM {user} u
             $capjoin->joins
              WHERE $capjoin->wheres AND u.deleted = 0";