diff --git a/course/classes/task/content_notification_task.php b/course/classes/task/content_notification_task.php index 5594e97281f..a8302030c10 100644 --- a/course/classes/task/content_notification_task.php +++ b/course/classes/task/content_notification_task.php @@ -70,10 +70,9 @@ class content_notification_task extends adhoc_task { \core\cron::setup_user($user, $course); + // Ensure that the activity is available/visible to the user. $cm = get_fast_modinfo($course)->cms[$cm->id]; - - if (!$cm->uservisible && !$cm->is_visible_on_course_page()) { - // User can't access or see the activity in the course page. + if (!\core_availability\info_module::is_user_visible($cm, $user->id, false)) { $this->log("Ignoring user {$user->id} (no permissions to see the module)", 1); continue; } diff --git a/course/tests/task/content_notification_task_test.php b/course/tests/task/content_notification_task_test.php index 96dcd4b82a8..9c88025fd11 100644 --- a/course/tests/task/content_notification_task_test.php +++ b/course/tests/task/content_notification_task_test.php @@ -16,7 +16,9 @@ namespace core_course\task; +use availability_date\condition; use context_user; +use core_availability\tree; /** * Contains tests for course related notifications. @@ -61,10 +63,12 @@ class content_notification_task_test extends \advanced_testcase { $url = self::getDataGenerator()->create_module('url', ['course' => $course]); // Test update. + $moduleavailability = tree::get_root_json([condition::get_json(condition::DIRECTION_FROM, time() + HOURSECS)]); $moduleinfo = $DB->get_record('course_modules', array('id' => $url->cmid)); $moduleinfo->modulename = 'url'; $moduleinfo->coursemodule = $url->cmid; $moduleinfo->display = 1; + $moduleinfo->availability = json_encode($moduleavailability); $moduleinfo->externalurl = ''; $moduleinfo->update = 1; $draftid = 0; @@ -91,6 +95,23 @@ class content_notification_task_test extends \advanced_testcase { $messages = $sink->get_messages(); $sink->close(); + // The module isn't available for one hour, there should be no notifications. + $this->assertCount(0, $messages); + + // Remove availability condition. + $this->setAdminUser(); + $moduleinfo->availability = null; + update_module(clone $moduleinfo); + + // Redirect messages to sink and stop buffer output from CLI task. + $sink = $this->redirectMessages(); + ob_start(); + $this->runAdhocTasks('\core_course\task\content_notification_task'); + $output = ob_get_contents(); + ob_end_clean(); + $messages = $sink->get_messages(); + $sink->close(); + // We have 3 students, one with a non-active enrolment that should not receive a notification. $this->assertCount(2, $messages); foreach ($messages as $message) {