This commit is contained in:
Paul Holden
2026-03-19 12:54:14 +08:00
committed by Mihail Geshoski
4 changed files with 97 additions and 40 deletions
@@ -217,6 +217,7 @@ class phpunit_util extends \core\test\testing_util {
\core_filetypes::reset_caches();
\core_search\manager::clear_static();
\core\user::reset_caches();
\core\task\manager::reset_state();
\core\output\icon_system::reset_caches();
if (class_exists(\core_media_manager::class, false)) {
\core_media_manager::reset_caches();
@@ -16,6 +16,7 @@
namespace assignfeedback_editpdf;
use assignfeedback_editpdf\task\convert_submission;
use mod_assign_test_generator;
defined('MOODLE_INTERNAL') || die();
@@ -360,7 +361,7 @@ final class feedback_test extends \advanced_testcase {
$this->add_file_submission($student, $assign);
// Run the conversion task.
$task = \core\task\manager::get_next_adhoc_task(time());
$task = \core\task\manager::get_next_adhoc_task(time(), true, convert_submission::class);
ob_start();
$task->execute();
\core\task\manager::adhoc_task_complete($task);
@@ -369,14 +370,14 @@ final class feedback_test extends \advanced_testcase {
// Confirm, that submission has been converted and the task queue is now empty.
$this->assertStringContainsString('Converting submission for user id ' . $student->id, $output);
$this->assertStringContainsString('The document has been successfully converted', $output);
$this->assertNull(\core\task\manager::get_next_adhoc_task(time()));
$this->assertNull(\core\task\manager::get_next_adhoc_task(time(), true, convert_submission::class));
// Trigger a re-queue by 'updating' a submission.
$submission = $assign->get_user_submission($student->id, true);
$plugin = $assign->get_submission_plugin_by_type('file');
$plugin->save($submission, (new \stdClass));
$task = \core\task\manager::get_next_adhoc_task(time());
$task = \core\task\manager::get_next_adhoc_task(time(), true, convert_submission::class);
// Verify that queued a conversion task.
$this->assertNotNull($task);
@@ -388,7 +389,7 @@ final class feedback_test extends \advanced_testcase {
// Confirm, that submission has been converted and the task queue is now empty.
$this->assertStringContainsString('Converting submission for user id ' . $student->id, $output);
$this->assertStringContainsString('The document has been successfully converted', $output);
$this->assertNull(\core\task\manager::get_next_adhoc_task(time()));
$this->assertNull(\core\task\manager::get_next_adhoc_task(time(), true, convert_submission::class));
}
/**
@@ -17,7 +17,11 @@
namespace mod_assign;
use core\task\task_trait;
use mod_assign\task\queue_assignment_due_digest_notification_tasks_for_users;
use mod_assign\task\queue_assignment_due_soon_notification_tasks_for_users;
use mod_assign\task\queue_assignment_overdue_notification_tasks_for_users;
use mod_assign\task\send_assignment_due_digest_notification_to_user;
use mod_assign\task\send_assignment_due_soon_notification_to_user;
use mod_assign\task\send_assignment_overdue_notification_to_user;
/**
* Test class for the assignment notification_helper.
@@ -40,18 +44,26 @@ final class notification_helper_test extends \advanced_testcase {
$task->execute();
$clock = \core\di::get(\core\clock::class);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
queue_assignment_due_soon_notification_tasks_for_users::class
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_assign\task\queue_assignment_due_soon_notification_tasks_for_users::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_due_soon_notification_to_user::class
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_assign\task\send_assignment_due_soon_notification_to_user::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
}
@@ -356,27 +368,40 @@ final class notification_helper_test extends \advanced_testcase {
$task->execute();
$clock->bump(5);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$this->assertInstanceOf(\mod_assign\task\queue_assignment_due_soon_notification_tasks_for_users::class, $adhoctask);
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
queue_assignment_due_soon_notification_tasks_for_users::class,
);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
// Delete the assignment.
$DB->delete_records('assign', ['id' => $assignment->id]);
// Try to run the ad-hoc task to send the notifications.
$clock->bump(5);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$this->assertInstanceOf(\mod_assign\task\send_assignment_due_soon_notification_to_user::class, $adhoctask);
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_due_soon_notification_to_user::class,
);
ob_start();
$adhoctask->execute();
$output = ob_get_clean();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
// The ad-hoc task should be deleted.
$this->assertNull(\core\task\manager::get_next_adhoc_task($clock->time()));
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_due_soon_notification_to_user::class,
);
$this->assertNull($adhoctask);
$this->assertStringContainsString(
needle: "No notification send as the assignment $assignment->id can no longer be found in the database.",
haystack: $output
@@ -391,18 +416,26 @@ final class notification_helper_test extends \advanced_testcase {
$task->execute();
$clock = \core\di::get(\core\clock::class);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
queue_assignment_overdue_notification_tasks_for_users::class,
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_assign\task\queue_assignment_overdue_notification_tasks_for_users::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_overdue_notification_to_user::class,
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_assign\task\send_assignment_overdue_notification_to_user::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
}
@@ -741,27 +774,40 @@ final class notification_helper_test extends \advanced_testcase {
$task->execute();
$clock->bump(5);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$this->assertInstanceOf(\mod_assign\task\queue_assignment_overdue_notification_tasks_for_users::class, $adhoctask);
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
queue_assignment_overdue_notification_tasks_for_users::class,
);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
// Delete the assignment.
$DB->delete_records('assign', ['id' => $assignment->id]);
// Try to run the ad-hoc task to send the notifications.
$clock->bump(5);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$this->assertInstanceOf(\mod_assign\task\send_assignment_overdue_notification_to_user::class, $adhoctask);
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_overdue_notification_to_user::class,
);
ob_start();
$adhoctask->execute();
$output = ob_get_clean();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
// The ad-hoc task should be deleted.
$this->assertNull(\core\task\manager::get_next_adhoc_task($clock->time()));
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_overdue_notification_to_user::class,
);
$this->assertNull($adhoctask);
$this->assertStringContainsString(
needle: "No notification send as the assignment $assignment->id can no longer be found in the database.",
haystack: $output
@@ -776,11 +822,15 @@ final class notification_helper_test extends \advanced_testcase {
$task->execute();
$clock = \core\di::get(\core\clock::class);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_assignment_due_digest_notification_to_user::class,
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_assign\task\send_assignment_due_digest_notification_to_user::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
}
@@ -16,6 +16,10 @@
namespace mod_quiz;
use mod_quiz\task\queue_all_quiz_open_notification_tasks;
use mod_quiz\task\queue_quiz_open_notification_tasks_for_users;
use mod_quiz\task\send_quiz_open_soon_notification_to_user;
/**
* Test class for the quiz notification helper.
*
@@ -30,22 +34,30 @@ final class notification_helper_test extends \advanced_testcase {
* Run all the tasks related to the notifications.
*/
protected function run_notification_helper_tasks(): void {
$task = \core\task\manager::get_scheduled_task(\mod_quiz\task\queue_all_quiz_open_notification_tasks::class);
$task = \core\task\manager::get_scheduled_task(queue_all_quiz_open_notification_tasks::class);
$task->execute();
$clock = \core\di::get(\core\clock::class);
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
queue_quiz_open_notification_tasks_for_users::class
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_quiz\task\queue_quiz_open_notification_tasks_for_users::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
$adhoctask = \core\task\manager::get_next_adhoc_task($clock->time());
$adhoctask = \core\task\manager::get_next_adhoc_task(
$clock->time(),
true,
send_quiz_open_soon_notification_to_user::class
);
if ($adhoctask) {
$this->assertInstanceOf(\mod_quiz\task\send_quiz_open_soon_notification_to_user::class, $adhoctask);
$adhoctask->execute();
\core\task\manager::adhoc_task_complete($adhoctask);
\core\task\manager::reset_state();
}
}
@@ -214,23 +226,16 @@ final class notification_helper_test extends \advanced_testcase {
]);
$clock->bump(5);
// Get the users within the date range.
$quizzes = $helper::get_quizzes_within_date_range();
foreach ($quizzes as $q) {
$users = $helper::get_users_within_quiz($q->id);
}
$quizzes->close();
// Run the tasks.
$this->run_notification_helper_tasks();
// Get the notifications that should have been created during the adhoc task.
$this->assertCount(1, $sink->get_messages());
$messages = $sink->get_messages_by_component('mod_quiz');
$this->assertCount(1, $messages);
// Check the subject matches.
$messages = $sink->get_messages_by_component('mod_quiz');
$message = reset($messages);
$stringparams = ['timeopen' => userdate($users[$user1->id]->timeopen), 'quizname' => $quiz->name];
$stringparams = ['timeopen' => userdate($timeopen), 'quizname' => $quiz->name];
$expectedsubject = get_string('quizopendatesoonsubject', 'mod_quiz', $stringparams);
$this->assertEquals($expectedsubject, $message->subject);