Your IP : 216.73.216.95


Current Path : /var/www/ljmtc/cbt/mod/grouptool/tests/
Upload File :
Current File : /var/www/ljmtc/cbt/mod/grouptool/tests/privacy_test.php

<?php
// This file is part of mod_grouptool for Moodle - http://moodle.org/
//
// It 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.
//
// It 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/>.

/**
 * Unit Tests for mod/grouptool's privacy providers!
 *
 * @package    mod_grouptool
 * @copyright  2019 Academic Moodle Cooperation https://www.academic-moodle-cooperation.org/
 * @author Philipp Hager <philipp.hager@tuwien.ac.at> strongly based on mod_assign's privacy unit tests!
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */

namespace mod_grouptool\local\tests;

use \mod_grouptool\privacy\provider;

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

global $CFG;
require_once($CFG->dirroot . '/mod/grouptool/locallib.php');

/**
 * Unit Tests for mod/grouptool's privacy providers! TODO: finish these unit tests here!
 * @group mod_grouptool
 *
 * @copyright  2019 Academic Moodle Cooperation https://www.academic-moodle-cooperation.org/
 * @author Philipp Hager <philipp.hager@tuwien.ac.at> strongly based on mod_assign's privacy unit tests!
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class mod_grouptool_privacy_testcase extends base {
    /*
     * The base test class already contains a setUp-method setting up a course including users and groups.
     */

    /**
     * Test that getting the contexts for a user works.
     *
     * @throws \coding_exception
     * @throws \dml_exception
     * @throws \mod_grouptool\local\exception\exceedgroupqueuelimit
     * @throws \mod_grouptool\local\exception\exceedgroupsize
     * @throws \mod_grouptool\local\exception\exceeduserqueuelimit
     * @throws \mod_grouptool\local\exception\exceeduserreglimit
     * @throws \mod_grouptool\local\exception\registration
     * @throws \mod_grouptool\local\exception\regpresent
     * @throws \moodle_exception
     * @throws \required_capability_exception
     */
    public function test_get_contexts_for_userid() {
        $this->resetAfterTest();

        $course1 = $this->course;
        $course2 = self::getDataGenerator()->create_course();

        $user1 = $this->students[0];
        self::getDataGenerator()->enrol_user($user1->id, $course1->id, 'student');
        // Need a second user to create queue entries.
        $user2 = $this->students[1];;
        self::getDataGenerator()->enrol_user($user2->id, $course1->id, 'student');
        self::getDataGenerator()->enrol_user($user2->id, $course2->id, 'student');

        // Create multiple grouptool instances.
        // Grouptool without queues.
        $gt1 = $this->create_instance([
                'course' => $course1,
                'use_queue' => 0,
                'use_size' => 0,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);
        // Grouptool with queues.
        $gt2 = $this->create_instance([
                'course' => $course1,
                'use_queue' => 1,
                'use_size' => 1,
                'grpsize' => 1,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);
        // Grouptool instance two in a different course that the user is not enrolled in.
        $gt3 = $this->create_instance([
                'course' => $course2,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);

        // The user will be in these contexts.
        $usercontextids = [
            $gt1->get_context()->id,
            $gt2->get_context()->id
        ];

        // Get all active groups indexed by active group ID!
        list(, $agrpids, ) = $this->get_agrps_and_prepare_message($gt1);
        list(, $agrpids2, ) = $this->get_agrps_and_prepare_message($gt2);
        list(, $agrpids3, ) = $this->get_agrps_and_prepare_message($gt3);

        self::setUser($user1);
        $gt1->testable_register_in_agrp($agrpids[0]);
        $gt2->testable_register_in_agrp($agrpids2[0]);
        $gt3->testable_register_in_agrp($agrpids3[0]);

        self::setUser($user2);
        $gt1->testable_register_in_agrp($agrpids[0]);
        $gt2->testable_register_in_agrp($agrpids2[0]);

        $contextlist = provider::get_contexts_for_userid($user2->id);
        self::assertEquals(count($usercontextids), count($contextlist->get_contextids()));
        // There should be no difference between the contexts.
        self::assertEmpty(array_diff($usercontextids, $contextlist->get_contextids()));
    }

    /**
     * Test returning a list of user IDs related to a context.
     *
     * @throws \coding_exception
     * @throws \dml_exception
     * @throws \mod_grouptool\local\exception\exceedgroupqueuelimit
     * @throws \mod_grouptool\local\exception\exceedgroupsize
     * @throws \mod_grouptool\local\exception\exceeduserqueuelimit
     * @throws \mod_grouptool\local\exception\exceeduserreglimit
     * @throws \mod_grouptool\local\exception\notenoughregs
     * @throws \mod_grouptool\local\exception\registration
     * @throws \mod_grouptool\local\exception\regpresent
     * @throws \moodle_exception
     * @throws \required_capability_exception
     */
    public function test_get_users_in_context() {
        $this->resetAfterTest();

        $course = $this->course;

        // Registered in gt1 & gt2!
        $user1 = $this->students[0];
        // Registered in gt1 and queued in gt2!
        $user2 = $this->students[1];
        // Registered in gt1 & queued in gt2!
        $user3 = $this->students[2];
        // User 4 registers user3 in gt1.
        $user4 = $this->editingteachers[0];
        // Only queued in gt2!
        $user5 = $this->students[3];
        // This user has no entries and should not show up.
        $user6 = $this->students[4];

        $gt1 = $gt1 = $this->create_instance([
                'course' => $course,
                'use_queue' => 0,
                'use_size' => 0,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);
        $gt2 = $this->create_instance([
                'course' => $course,
                'use_queue' => 0,
                'use_size' => 0,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);

        $context = $gt1->get_context();
        $context2 = $gt2->get_context();

        // Get all active groups indexed by active group ID!
        list(, $agrpids, $message) = $this->get_agrps_and_prepare_message($gt1);
        list(, $agrpids2, ) = $this->get_agrps_and_prepare_message($gt2);

        self::setUser($user1);
        $gt1->testable_register_in_agrp($agrpids[0]);
        $gt2->testable_register_in_agrp($agrpids2[0]);

        self::setUser($user2);
        $gt1->testable_register_in_agrp($agrpids[0]);
        $gt2->testable_register_in_agrp($agrpids2[0]);

        self::setUser($user3);
        $gt2->testable_register_in_agrp($agrpids2[0]);

        self::setUser($user4);
        $gt1->testable_add_registration($agrpids[0], $user3->id, $message);

        self::setUser($user5);
        $gt2->testable_register_in_agrp($agrpids2[1]);

        $userlist = new \core_privacy\local\request\userlist($context, 'grouptool');
        provider::get_users_in_context($userlist);
        $userids = $userlist->get_userids();
        self::assertTrue(in_array($user1->id, $userids));
        self::assertTrue(in_array($user2->id, $userids));
        self::assertTrue(in_array($user3->id, $userids));
        self::assertTrue(in_array($user4->id, $userids));
        self::assertFalse(in_array($user5->id, $userids));
        self::assertFalse(in_array($user6->id, $userids));

        $userlist2 = new \core_privacy\local\request\userlist($context2, 'grouptool');
        provider::get_users_in_context($userlist2);
        $userids2 = $userlist2->get_userids();
        self::assertTrue(in_array($user1->id, $userids2));
        self::assertTrue(in_array($user2->id, $userids2));
        self::assertTrue(in_array($user3->id, $userids2));
        self::assertFalse(in_array($user4->id, $userids2));
        self::assertTrue(in_array($user5->id, $userids2));
        self::assertFalse(in_array($user6->id, $userids2));
    }

    /**
     * Test that a student with multiple submissions and grades is returned with the correct data.
     */
    public function test_export_user_data_student() {
        // Stop here and mark this test as incomplete.
        self::markTestIncomplete(
                'This test has not been implemented yet.'
        );
    }

    /**
     * Tests the data returned for a teacher.
     */
    public function test_export_user_data_teacher() {
        // Stop here and mark this test as incomplete.
        self::markTestIncomplete(
                'This test has not been implemented yet.'
        );
    }

    /**
     * A test for deleting all user data for a given context.
     */
    public function test_delete_data_for_all_users_in_context() {
        // Stop here and mark this test as incomplete.
        self::markTestIncomplete(
                'This test has not been implemented yet.'
        );
    }

    /**
     * A test for deleting all user data for one user.
     */
    public function test_delete_data_for_user() {
        // Stop here and mark this test as incomplete.
        self::markTestIncomplete(
                'This test has not been implemented yet.'
        );
    }

    /**
     * A test for deleting all user data for a bunch of users.
     *
     * @throws \coding_exception
     * @throws \dml_exception
     * @throws \mod_grouptool\local\exception\exceedgroupqueuelimit
     * @throws \mod_grouptool\local\exception\exceedgroupsize
     * @throws \mod_grouptool\local\exception\exceeduserqueuelimit
     * @throws \mod_grouptool\local\exception\exceeduserreglimit
     * @throws \mod_grouptool\local\exception\notenoughregs
     * @throws \mod_grouptool\local\exception\registration
     * @throws \mod_grouptool\local\exception\regpresent
     * @throws \moodle_exception
     * @throws \required_capability_exception
     */
    public function test_delete_data_for_users() {
        global $DB;

        $course1 = $this->course;
        $course2 = self::getDataGenerator()->create_course();

        $user1 = $this->students[0];
        self::getDataGenerator()->enrol_user($user1->id, $course1->id, 'student');
        // Need a second user to create queue entries.
        $user2 = $this->students[1];
        self::getDataGenerator()->enrol_user($user2->id, $course2->id, 'student');
        $user3 = $this->students[2];
        self::getDataGenerator()->enrol_user($user3->id, $course2->id, 'student');
        $user4 = $this->editingteachers[0];
        self::getDataGenerator()->enrol_user($user3->id, $course2->id, 'editingteacher');

        // Create multiple grouptool instances.
        // Grouptool without queues.
        $gt1 = $this->create_instance([
                'course' => $course1,
                'use_queue' => 0,
                'use_size' => 0,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);
        // Grouptool with queues.
        $gt2 = $this->create_instance([
                'course' => $course1,
                'use_queue' => 1,
                'use_size' => 1,
                'grpsize' => 1,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);
        // Grouptool instance three in a different course that the user is not enrolled in.
        $gt3 = $this->create_instance([
                'course' => $course2,
                'ifmemberadded' => 0,
                'ifmemberremoved' => 0,
                'ifgroupdeleted' => 0
        ]);

        // Get all active groups indexed by active group ID!
        list(, $agrpids, $message) = $this->get_agrps_and_prepare_message($gt1);
        list(, $agrpids2, ) = $this->get_agrps_and_prepare_message($gt2);
        list(, $agrpids3, $message3) = $this->get_agrps_and_prepare_message($gt3);

        self::setUser($user1);
        // All are registrations!
        $gt1->testable_register_in_agrp($agrpids[0]);
        $gt2->testable_register_in_agrp($agrpids2[0]);
        $gt3->testable_register_in_agrp($agrpids3[0]);

        self::setUser($user2);
        // This is a registration!
        $gt1->testable_register_in_agrp($agrpids[0]);
        // This is a queue entry!
        $gt2->testable_register_in_agrp($agrpids2[0]);

        self::setUser($user4);
        // Two registrations!
        $gt1->testable_add_registration($agrpids[0], $user3->id, $message);
        $gt1->testable_add_registration($agrpids[1], $user3->id, $message);
        // This one is a queue entry!
        $gt2->testable_add_queue_entry($agrpids2[0], $user3->id, $message);
        // These are registrations!
        $gt3->testable_add_registration($agrpids3[0], $user3->id, $message3);
        $gt3->testable_add_registration($agrpids3[1], $user3->id, $message3);

        // Check registration data is in place.
        $data = $DB->get_records('grouptool_registered');
        // We should have 3 entries for user 1 and one entry for user 2.
        self::assertCount(8, $data);
        $usercounts = [
            $user1->id => 0,
            $user2->id => 0,
            $user3->id => 0
        ];
        foreach ($data as $datum) {
            $usercounts[$datum->userid]++;
        }
        self::assertEquals(3, $usercounts[$user1->id]);
        self::assertEquals(1, $usercounts[$user2->id]);
        self::assertEquals(4, $usercounts[$user3->id]);

        $data = $DB->get_records('grouptool_queued');
        // We should only have one entry for user 2 and user 3 each.
        self::assertCount(2, $data);
        $usercounts = [
                $user2->id => 0,
                $user3->id => 0
        ];
        foreach ($data as $datum) {
            $usercounts[$datum->userid]++;
        }
        self::assertEquals(1, $usercounts[$user2->id]);
        self::assertEquals(1, $usercounts[$user3->id]);

        // Delete data for user 4 in gt1 and gt2!
        $userlist = new \core_privacy\local\request\approved_userlist($gt1->get_context(), 'grouptool', [$user4->id]);
        provider::delete_data_for_users($userlist);
        $userlist = new \core_privacy\local\request\approved_userlist($gt2->get_context(), 'grouptool', [$user4->id]);
        provider::delete_data_for_users($userlist);

        $data = $DB->get_records('grouptool_registered');
        // No change here!
        self::assertCount(8, $data);

        $data = $DB->get_records('grouptool_queued');
        // No change here!
        self::assertCount(2, $data);

        // Delete data for users 1 and 2 in gt1!
        $userlist = new \core_privacy\local\request\approved_userlist($gt1->get_context(), 'grouptool', [$user1->id, $user2->id]);
        provider::delete_data_for_users($userlist);

        $data = $DB->get_records('grouptool_registered');
        // 2 have to be gone!
        self::assertCount(6, $data);

        $data = $DB->get_records('grouptool_queued');
        // No change here!
        self::assertCount(2, $data);

        $userlist = new \core_privacy\local\request\approved_userlist($gt2->get_context(), 'grouptool', [$user3->id, $user4->id]);
        provider::delete_data_for_users($userlist);

        $data = $DB->get_records('grouptool_registered');
        // No change here!
        self::assertCount(6, $data);

        $data = $DB->get_records('grouptool_queued');
        // Only the entry for user 3 is gone!
        self::assertCount(1, $data);

        $userlist = new \core_privacy\local\request\approved_userlist($gt2->get_context(), 'grouptool', [$user1->id, $user2->id]);
        provider::delete_data_for_users($userlist);

        $data = $DB->get_records('grouptool_registered');
        // No change here!
        self::assertCount(5, $data);

        $data = $DB->get_records('grouptool_queued');
        // Only the entry for user 3 is gone!
        self::assertCount(0, $data);

        $userlist = new \core_privacy\local\request\approved_userlist($gt1->get_context(), 'grouptool',
                [$user1->id, $user2->id, $user3->id]);
        provider::delete_data_for_users($userlist);
        $userlist = new \core_privacy\local\request\approved_userlist($gt2->get_context(), 'grouptool',
                [$user1->id, $user2->id, $user3->id]);
        provider::delete_data_for_users($userlist);
        $userlist = new \core_privacy\local\request\approved_userlist($gt3->get_context(), 'grouptool',
                [$user1->id, $user2->id, $user3->id]);
        provider::delete_data_for_users($userlist);

        // Everything should be gone!
        $data = $DB->get_records('grouptool_registered');
        // No change here!
        self::assertCount(0, $data);

        $data = $DB->get_records('grouptool_queued');
        // Only the entry for user 3 is gone!
        self::assertCount(0, $data);
    }
}