Merge branch 'MDL-85571-405' of https://github.com/HuongNV13/moodle into MOODLE_405_STABLE

This commit is contained in:
Michael Hawkins
2025-06-05 12:35:12 +08:00
2 changed files with 122 additions and 0 deletions
@@ -490,6 +490,12 @@ class notification_helper {
continue;
}
// Check if the module is visible to the user.
$cm = $assignmentobj->get_course_module();
if (!\core_availability\info_module::is_user_visible($cm, $userid)) {
continue;
}
// Check if the due date is still within range.
$assignmentobj->update_effective_access($userid);
$duedate = $assignmentobj->get_instance($userid)->duedate;
@@ -16,6 +16,9 @@
namespace mod_assign;
use core\task\task_trait;
use mod_assign\task\queue_assignment_due_digest_notification_tasks_for_users;
/**
* Test class for the assignment notification_helper.
*
@@ -26,6 +29,9 @@ namespace mod_assign;
* @covers \mod_assign\notification_helper
*/
final class notification_helper_test extends \advanced_testcase {
use task_trait;
/**
* Run all the tasks related to the 'due soon' notifications.
*/
@@ -782,4 +788,114 @@ final class notification_helper_test extends \advanced_testcase {
// Clear sink.
$sink->clear();
}
/**
* Test sending the assignment due digest notification to users in groups with restricted access.
*/
public function test_send_due_digest_notification_to_users_in_groups(): void {
global $DB;
$this->resetAfterTest();
$generator = $this->getDataGenerator();
$clock = $this->mock_clock_with_incrementing();
$sink = $this->redirectMessages();
/** @var \mod_assign_generator $assignmentgenerator */
$assignmentgenerator = $generator->get_plugin_generator('mod_assign');
// Create a course, users and enrol users.
$course = $generator->create_course();
$user1 = $generator->create_user();
$user2 = $generator->create_user();
$user3 = $generator->create_user();
$generator->enrol_user($user1->id, $course->id, 'student');
$generator->enrol_user($user2->id, $course->id, 'student');
$generator->enrol_user($user3->id, $course->id, 'student');
// Create groups and add users to groups.
$group1 = $generator->create_group(['courseid' => $course->id]);
$group2 = $generator->create_group(['courseid' => $course->id]);
$generator->create_group_member(['groupid' => $group1->id, 'userid' => $user1->id]);
$generator->create_group_member(['groupid' => $group2->id, 'userid' => $user2->id]);
// Create assignments.
$assignment1 = $assignmentgenerator->create_instance([
'course' => $course->id,
'duedate' => $clock->time() + WEEKSECS,
'submissiondrafts' => 0,
'assignsubmission_onlinetext_enabled' => 1,
]);
$assignment2 = $assignmentgenerator->create_instance([
'course' => $course->id,
'duedate' => $clock->time() + WEEKSECS,
'submissiondrafts' => 0,
'assignsubmission_onlinetext_enabled' => 1,
]);
$assignment3 = $assignmentgenerator->create_instance([
'course' => $course->id,
'duedate' => $clock->time() + WEEKSECS,
'submissiondrafts' => 0,
'assignsubmission_onlinetext_enabled' => 1,
]);
// Set restricted access for assignment1 and assignment2 to groups.
$availability = [
'op' => '&',
'showc' => [true],
'c' => [
[
'type' => 'group',
'id' => (int) $group1->id,
],
],
];
$cm = get_coursemodule_from_instance('assign', $assignment1->id, $course->id);
$DB->set_field('course_modules', 'availability', json_encode($availability), ['id' => $cm->id]);
$availability = [
'op' => '&',
'showc' => [true],
'c' => [
[
'type' => 'group',
'id' => (int) $group2->id,
],
],
];
$cm = get_coursemodule_from_instance('assign', $assignment2->id, $course->id);
$DB->set_field('course_modules', 'availability', json_encode($availability), ['id' => $cm->id]);
// Rebuild course cache to apply changes.
rebuild_course_cache($course->id, true);
// Run the tasks. We want to run all the adhoc tasks at the same time. So we will use the normal task runner.
$this->execute_task('\mod_assign\task\queue_all_assignment_due_digest_notification_tasks');
// Execute the remaining ad-hoc backup task.
$this->start_output_buffering();
$this->runAdhocTasks('\mod_assign\task\send_assignment_due_digest_notification_to_user');
$this->stop_output_buffering();
$messages = $sink->get_messages_by_component('mod_assign');
// Process the messages.
$processedmessages = [];
foreach ($messages as $message) {
$processedmessages[$message->useridto] = $message;
}
// Verify the messages.
$this->assertCount(3, $processedmessages);
// User1 should receive a message for assignment1 and assignment3.
$this->assertArrayHasKey($user1->id, $processedmessages);
$this->assertStringContainsString($assignment1->name, $processedmessages[$user1->id]->fullmessagehtml);
$this->assertStringContainsString($assignment3->name, $processedmessages[$user1->id]->fullmessagehtml);
$this->assertStringNotContainsString($assignment2->name, $processedmessages[$user1->id]->fullmessagehtml);
// User2 should receive a message for assignment2 and assignment3.
$this->assertArrayHasKey($user2->id, $processedmessages);
$this->assertStringContainsString($assignment2->name, $processedmessages[$user2->id]->fullmessagehtml);
$this->assertStringContainsString($assignment3->name, $processedmessages[$user2->id]->fullmessagehtml);
$this->assertStringNotContainsString($assignment1->name, $processedmessages[$user2->id]->fullmessagehtml);
// User3 should receive a message for assignment3 only.
$this->assertArrayHasKey($user3->id, $processedmessages);
$this->assertStringContainsString($assignment3->name, $processedmessages[$user3->id]->fullmessagehtml);
$this->assertStringNotContainsString($assignment1->name, $processedmessages[$user3->id]->fullmessagehtml);
$this->assertStringNotContainsString($assignment2->name, $processedmessages[$user3->id]->fullmessagehtml);
}
}