Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 39 and 401]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  namespace contenttype_h5p;
  18  
  19  /**
  20   * Test for H5P content bank plugin.
  21   *
  22   * @package    contenttype_h5p
  23   * @category   test
  24   * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
  25   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  26   * @coversDefaultClass \contenttype_h5p\content
  27   */
  28  class content_h5p_test extends \advanced_testcase {
  29  
  30      /**
  31       * Tests for uploaded file.
  32       *
  33       * @covers ::get_file
  34       */
  35      public function test_upload_file() {
  36          $this->resetAfterTest();
  37  
  38          // Create content.
  39          $record = new \stdClass();
  40          $record->name = 'Test content';
  41          $record->configdata = '';
  42          $contenttype = new \contenttype_h5p\contenttype(\context_system::instance());
  43          $content = $contenttype->create_content($record);
  44  
  45          // Create a dummy file.
  46          $filename = 'content.h5p';
  47          $dummy = [
  48              'contextid' => \context_system::instance()->id,
  49              'component' => 'contentbank',
  50              'filearea' => 'public',
  51              'itemid' => $content->get_id(),
  52              'filepath' => '/',
  53              'filename' => $filename
  54          ];
  55          $fs = get_file_storage();
  56          $fs->create_file_from_string($dummy, 'dummy content');
  57  
  58          $file = $content->get_file();
  59          $this->assertInstanceOf(\stored_file::class, $file);
  60          $this->assertEquals($filename, $file->get_filename());
  61      }
  62  
  63      /**
  64       * Tests for is view allowed content.
  65       *
  66       * @covers ::is_view_allowed
  67       * @dataProvider is_view_allowed_provider
  68       *
  69       * @param string $role User role to use for create and view contents.
  70       * @param array $disabledlibraries Library names to disable.
  71       * @param array $expected Array with the expected values for the contents in the following order:
  72       *     ['H5P.Blanks deployed', 'H5P.Accordion deployed', 'H5P.Accordion undeployed', 'Invalid content'].
  73       */
  74      public function test_is_view_allowed(string $role, array $disabledlibraries, array $expected): void {
  75          global $CFG, $USER, $DB;
  76  
  77          $this->resetAfterTest();
  78  
  79          // Create a course.
  80          $course = $this->getDataGenerator()->create_course();
  81          $coursecontext = \context_course::instance($course->id);
  82  
  83          // Set user.
  84          if ($role == 'admin') {
  85              $this->setAdminUser();
  86          } else {
  87              // Enrol user to the course.
  88              $user = $this->getDataGenerator()->create_and_enrol($course, $role);
  89              $this->setUser($user);
  90          }
  91  
  92          // Add contents to the content bank.
  93          $generator = $this->getDataGenerator()->get_plugin_generator('core_contentbank');
  94          $filepath = $CFG->dirroot . '/h5p/tests/fixtures/filltheblanks.h5p';
  95          $contents = $generator->generate_contentbank_data('contenttype_h5p', 1, $USER->id, $coursecontext, true, $filepath);
  96          $filltheblanks = array_shift($contents);
  97          $filepath = $CFG->dirroot . '/h5p/tests/fixtures/ipsums.h5p';
  98          $contents = $generator->generate_contentbank_data('contenttype_h5p', 2, $USER->id, $coursecontext, true, $filepath);
  99          $accordion1 = array_shift($contents);
 100          $accordion2 = array_shift($contents);
 101          $filepath = $CFG->dirroot . '/h5p/tests/fixtures/invalid.zip';
 102          $contents = $generator->generate_contentbank_data('contenttype_h5p', 1, $USER->id, $coursecontext, true, $filepath);
 103          $invalid = array_shift($contents);
 104  
 105          // Load some of these H5P files though the player to create the H5P DB entries.
 106          $h5pplayer = new \core_h5p\player($filltheblanks->get_file_url(), new \stdClass(), true);
 107          $h5pplayer = new \core_h5p\player($accordion1->get_file_url(), new \stdClass(), true);
 108  
 109          // Check the expected H5P content has been created.
 110          $this->assertEquals(2, $DB->count_records('h5p'));
 111          $this->assertEquals(4, $DB->count_records('contentbank_content'));
 112  
 113          // Disable libraries.
 114          foreach ($disabledlibraries as $libraryname) {
 115              $libraryid = $DB->get_field('h5p_libraries', 'id', ['machinename' => $libraryname]);
 116              \core_h5p\api::set_library_enabled((int) $libraryid, false);
 117          }
 118  
 119          $this->assertEquals($expected[0], $filltheblanks->is_view_allowed());
 120          $this->assertEquals($expected[1], $accordion1->is_view_allowed());
 121          $this->assertEquals($expected[2], $accordion2->is_view_allowed());
 122          $this->assertEquals($expected[3], $invalid->is_view_allowed());
 123  
 124          // Check that after enabling libraries again, all the content return true (but the invalid package).
 125          foreach ($disabledlibraries as $libraryname) {
 126              $libraryid = $DB->get_field('h5p_libraries', 'id', ['machinename' => $libraryname]);
 127              \core_h5p\api::set_library_enabled((int) $libraryid, true);
 128          }
 129  
 130          $this->assertEquals(true, $filltheblanks->is_view_allowed());
 131          $this->assertEquals(true, $accordion1->is_view_allowed());
 132          $this->assertEquals(true, $accordion2->is_view_allowed()); // It will be deployed, so now it will always return true.
 133          $this->assertEquals($expected[3], $invalid->is_view_allowed());
 134      }
 135  
 136      /**
 137       * Data provider for test_is_view_allowed.
 138       *
 139       * @return array
 140       */
 141      public function is_view_allowed_provider(): array {
 142          return [
 143              'Editing teacher with all libraries enabled' => [
 144                  'role' => 'editingteacher',
 145                  'disabledlibraries' => [],
 146                  'expected' => [true, true, true, false],
 147              ],
 148              'Manager with all libraries enabled' => [
 149                  'role' => 'manager',
 150                  'disabledlibraries' => [],
 151                  'expected' => [true, true, true, true],
 152              ],
 153              'Admin with all libraries enabled' => [
 154                  'role' => 'admin',
 155                  'disabledlibraries' => [],
 156                  'expected' => [true, true, true, true],
 157              ],
 158              'Editing teacher with H5P.Accordion disabled' => [
 159                  'role' => 'editingteacher',
 160                  'disabledlibraries' => ['H5P.Accordion'],
 161                  'expected' => [true, false, false, false],
 162              ],
 163              'Manager with H5P.Accordion disabled' => [
 164                  'role' => 'manager',
 165                  'disabledlibraries' => ['H5P.Accordion'],
 166                  'expected' => [true, false, true, true],
 167              ],
 168              'Admin with H5P.Accordion disabled' => [
 169                  'role' => 'admin',
 170                  'disabledlibraries' => ['H5P.Accordion'],
 171                  'expected' => [true, false, true, true],
 172              ],
 173              'Editing teacher with all libraries disabled' => [
 174                  'role' => 'editingteacher',
 175                  'disabledlibraries' => ['H5P.Accordion', 'H5P.Blanks'],
 176                  'expected' => [false, false, false, false],
 177              ],
 178              'Manager with all libraries disabled' => [
 179                  'role' => 'manager',
 180                  'disabledlibraries' => ['H5P.Accordion', 'H5P.Blanks'],
 181                  'expected' => [false, false, true, true],
 182              ],
 183              'Admin with all libraries disabled' => [
 184                  'role' => 'admin',
 185                  'disabledlibraries' => ['H5P.Accordion', 'H5P.Blanks'],
 186                  'expected' => [false, false, true, true],
 187              ],
 188          ];
 189      }
 190  }