From d2c91281db25f929f9df9bbfd8f376d12738b066 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 23 May 2019 13:52:32 +0800 Subject: [PATCH] MDL-65695 forum: Bump digest time to next day if in past --- mod/forum/classes/task/cron_task.php | 5 ++ mod/forum/tests/maildigest_test.php | 81 ++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/mod/forum/classes/task/cron_task.php b/mod/forum/classes/task/cron_task.php index ca3b41e3a8e..e3627c551c4 100644 --- a/mod/forum/classes/task/cron_task.php +++ b/mod/forum/classes/task/cron_task.php @@ -338,6 +338,11 @@ class cron_task extends \core\task\scheduled_task { $DB->insert_records('forum_queue', $digestpostdata); $digesttime = usergetmidnight($timenow, $sitetimezone) + ($CFG->digestmailtime * 3600); + if ($digesttime < $timenow) { + // Digest time is in the past. Get a new time for tomorrow. + $digesttime = usergetmidnight($timenow + DAYSECS, $sitetimezone) + ($CFG->digestmailtime * 3600); + } + $task = new \mod_forum\task\send_user_digests(); $task->set_userid($user->id); $task->set_component('mod_forum'); diff --git a/mod/forum/tests/maildigest_test.php b/mod/forum/tests/maildigest_test.php index 86a3613d46f..76759b6020a 100644 --- a/mod/forum/tests/maildigest_test.php +++ b/mod/forum/tests/maildigest_test.php @@ -518,4 +518,85 @@ class mod_forum_maildigest_testcase extends advanced_testcase { $this->send_digests_and_assert($user, $fulldigests, $shortdigests); } + + /** + * The digest being in the past is queued til the next day. + */ + public function test_cron_digest_previous_day() { + global $DB, $CFG; + + $this->resetAfterTest(true); + + // Set up a basic user enrolled in a course. + $userhelper = $this->helper_setup_user_in_course(); + $user = $userhelper->user; + $course1 = $userhelper->courses->course1; + $forum1 = $userhelper->forums->forum1; + $forum2 = $userhelper->forums->forum2; + $fulldigests = []; + $shortdigests = []; + + // Add 1 discussions to forum 1. + list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]); + $fulldigests[] = $post; + + // Set the tested user's default maildigest setting. + $DB->set_field('user', 'maildigest', 1, array('id' => $user->id)); + + // Set the digest time to midnight. + $CFG->digestmailtime = 0; + // One digest e-mail should be sent, and no individual notifications. + $expect = [ + (object) [ + 'userid' => $user->id, + 'digests' => 1, + ], + ]; + $this->queue_tasks_and_assert($expect); + + $tasks = $DB->get_records('task_adhoc'); + $task = reset($tasks); + $this->assertGreaterThanOrEqual(time(), $task->nextruntime); + } + + /** + * The digest being in the past is queued til the next day. + */ + public function test_cron_digest_same_day() { + global $DB, $CFG; + + $this->resetAfterTest(true); + + // Set up a basic user enrolled in a course. + $userhelper = $this->helper_setup_user_in_course(); + $user = $userhelper->user; + $course1 = $userhelper->courses->course1; + $forum1 = $userhelper->forums->forum1; + $forum2 = $userhelper->forums->forum2; + $fulldigests = []; + $shortdigests = []; + + // Add 1 discussions to forum 1. + list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]); + $fulldigests[] = $post; + + // Set the tested user's default maildigest setting. + $DB->set_field('user', 'maildigest', 1, array('id' => $user->id)); + + // Set the digest time to the future (magic, shouldn't work). + $CFG->digestmailtime = 25; + // One digest e-mail should be sent, and no individual notifications. + $expect = [ + (object) [ + 'userid' => $user->id, + 'digests' => 1, + ], + ]; + $this->queue_tasks_and_assert($expect); + + $tasks = $DB->get_records('task_adhoc'); + $task = reset($tasks); + $digesttime = usergetmidnight(time(), \core_date::get_server_timezone()) + ($CFG->digestmailtime * 3600); + $this->assertLessThanOrEqual($digesttime, $task->nextruntime); + } }