Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?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/>.

/**
 * Basic downloadcenter PHP Unit tests.
 *
 * @author     Simeon Naydenov (moniNaydenov@gmail.com)
 * @package    local_downloadcenter
 * @category   phpunit
 * @copyright  2020 Academic Moodle Cooperation {@link http://www.academic-moodle-cooperation.org}
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
defined('MOODLE_INTERNAL') || die();

/*
 * TODO tests:
 *   - add resources, files and check if the students
 *
 */
class local_downloadcenter_files_visible_testcase extends advanced_testcase {

    public function test_empty() {
        global $DB, $CFG;
        require_once(__DIR__ . '/../locallib.php');

        $this->resetAfterTest(true);

        $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));

        $student1 = $this->getDataGenerator()->create_user();
        $teacher1 = $this->getDataGenerator()->create_user();

        $this->setAdminUser();

        $course1 = $this->getDataGenerator()->create_course();

        $this->getDataGenerator()->enrol_user($student1->id, $course1->id, $studentrole->id);
        $this->getDataGenerator()->enrol_user($teacher1->id, $course1->id, $teacherrole->id);

        $this->setUser($student1);

        $downloadcenter = new local_downloadcenter_factory($course1, null);
        $userresources = $downloadcenter->get_resources_for_user();

        foreach ($userresources as $resources) {
            $this->assertEmpty($resources->res);
        }

        $this->setUser($teacher1);

        $downloadcenter = new local_downloadcenter_factory($course1, null);
        $userresources = $downloadcenter->get_resources_for_user();

        foreach ($userresources as $resources) {
            $this->assertEmpty($resources->res);
        }
    }

    public function test_student_visibility() {
        global $DB, $CFG;
        require_once(__DIR__ . '/../locallib.php');

        $this->resetAfterTest(true);

        $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
        $studentrole = $DB->get_record('role', array('shortname' => 'student'));

        $student1 = $this->getDataGenerator()->create_user();
        $teacher1 = $this->getDataGenerator()->create_user();

        $this->setAdminUser();

        $course1 = $this->getDataGenerator()->create_course();

        $this->setUser($student1);

        $this->getDataGenerator()->enrol_user($student1->id, $course1->id, $studentrole->id);
        $this->getDataGenerator()->enrol_user($teacher1->id, $course1->id, $teacherrole->id);

        $resources = $this->helper_add_resources_to_course($course1, $teacher1);

        // Test for student  - must not see not visible resources.
        $downloadcenter = new local_downloadcenter_factory($course1, $student1);
        $userresources = $downloadcenter->get_resources_for_user();

        $this->assertCount($resources->visiblefilecount, $userresources[$resources->filesection]->res);
        $this->assertCount($resources->visiblefoldercount, $userresources[$resources->foldersection]->res);
        $this->assertCount($resources->visiblepagecount, $userresources[$resources->pagesection]->res);
        $this->assertCount($resources->visiblebookcount, $userresources[$resources->booksection]->res);

    }

    public function test_teacher_visibility() {
        global $DB, $CFG;
        require_once(__DIR__ . '/../locallib.php');

        $this->resetAfterTest(true);

        $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));

        $this->setAdminUser();

        $teacher1 = $this->getDataGenerator()->create_user();
        $course1 = $this->getDataGenerator()->create_course();

        $this->getDataGenerator()->enrol_user($teacher1->id, $course1->id, $teacherrole->id);

        $resources = $this->helper_add_resources_to_course($course1, $teacher1);

        // Test for teacher - must see all resources.

        $this->setUser($teacher1);

        $downloadcenter = new local_downloadcenter_factory($course1, $teacher1);
        $userresources = $downloadcenter->get_resources_for_user();

        $this->assertCount($resources->filecount, $userresources[$resources->filesection]->res);
        $this->assertCount($resources->foldercount, $userresources[$resources->foldersection]->res);
        $this->assertCount($resources->pagecount, $userresources[$resources->pagesection]->res);
        $this->assertCount($resources->bookcount, $userresources[$resources->booksection]->res);
    }

    private function helper_add_file_to_context($filename, $filecontent , $context) {
        // Pick a random context id for specified user.
        $fileid = file_get_unused_draft_itemid();

        // Add actual file there.
        $filerecord = array('component' => 'user', 'filearea' => 'draft',
                            'contextid' => $context->id, 'itemid' => $fileid,
                            'filename' => $filename, 'filepath' => '/', );
        $fs = get_file_storage();
        $fs->create_file_from_string($filerecord, $filecontent);

        return $fileid;
    }

    private function helper_add_resources_to_course($course, $teacher) {

        $filesection = 0;
        $foldersection = 1;
        $pagesection = 2;
        $booksection = 3;
        $publicationsection = 5;

        $generator = $this->getDataGenerator()->get_plugin_generator('mod_resource');

        $record = new stdClass;
        $record->course = $course->id;
        $usercontext = context_user::instance($teacher->id);

        // Add 10 files with random visibility.
        $filecount = 10;
        $visiblefilecount = 0;
        $record->section = $filesection;
        for ($i = 0; $i < $filecount; $i++) {
            $record->visible = rand(0, 1000) > 500;
            $visiblefilecount += intval($record->visible);
            $record->files = $this->helper_add_file_to_context('resource' . ($i + 1) . '.jpg', 'some random content', $usercontext);
            $generator->create_instance($record);
        }

        // Add 10 folders with random visibility.
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_folder');

        $record->section = $foldersection;
        $foldercount = 10;
        $visiblefoldercount = 0;
        for ($i = 0; $i < $foldercount; $i++) {

            $record->visible = rand(0, 1000) > 500;
            $visiblefoldercount += intval($record->visible);
            $record->files = $this->helper_add_file_to_context('resource' . ($i + 1) . '.jpg', 'some random content', $usercontext);
            $generator->create_instance($record);
        }

        // Add 10 pages with random visibility.
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_page');

        unset($record->files);
        $record->section = $pagesection;
        $pagecount  = 10;
        $visiblepagecount = 0;
        for ($i = 0; $i < $pagecount; $i++) {
            $record->visible = rand(0, 1000) > 500;
            $visiblepagecount += intval($record->visible);
            $record->content = 'Some random content';
            $record->contentformat = FORMAT_HTML;

            $generator->create_instance($record);
        }

        // Add 10 books with random visibility.
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_book');

        unset($record->content);
        unset($record->contentformat);

        $record->section = $booksection;
        $bookcount  = 10;
        $visiblebookcount = 0;
        for ($i = 0; $i < $bookcount; $i++) {
            $record->visible = rand(0, 1000) > 500;
            $visiblebookcount += intval($record->visible);
            $record->content = 'Some random content';
            $record->contentformat = FORMAT_HTML;

            $book = $generator->create_instance($record);
            // Add 5 chapters to each book.
            for ($j = 0; $j < 5; $j++) {
                $generator->create_chapter(['bookid' => $book->id]);
            }

        }

        $result = new stdClass;
        $result->filecount = $filecount;
        $result->visiblefilecount = $visiblefilecount;
        $result->filesection = $filesection;

        $result->foldercount = $foldercount;
        $result->visiblefoldercount = $visiblefoldercount;
        $result->foldersection = $foldersection;

        $result->pagecount = $pagecount;
        $result->visiblepagecount = $visiblepagecount;
        $result->pagesection = $pagesection;

        $result->bookcount = $bookcount;
        $result->visiblebookcount = $visiblebookcount;
        $result->booksection = $booksection;

        return $result;
    }


}