mirror of
https://github.com/moodle/moodle.git
synced 2025-01-18 22:08:20 +01:00
d3d3b3bdc0
The "enabled" field has been added to the H5P libraries to let admins decide whether a library should be used or not in the site.
400 lines
15 KiB
PHP
400 lines
15 KiB
PHP
<?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/>.
|
|
|
|
/**
|
|
* Testing the H5peditorStorage interface implementation.
|
|
*
|
|
* @package core_h5p
|
|
* @category test
|
|
* @copyright 2020 Victor Deniz <victor@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
namespace core_h5p;
|
|
|
|
use core_h5p\local\library\autoloader;
|
|
|
|
/**
|
|
*
|
|
* Test class covering the H5peditorStorage interface implementation.
|
|
*
|
|
* @package core_h5p
|
|
* @copyright 2020 Victor Deniz <victor@moodle.com>
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*
|
|
* @runTestsInSeparateProcesses
|
|
*/
|
|
class editor_framework_test extends \advanced_testcase {
|
|
|
|
/** @var editor_framework H5P editor_framework instance */
|
|
protected $editorframework;
|
|
|
|
/**
|
|
* Setup to ensure that fixtures are loaded.
|
|
*/
|
|
public static function setupBeforeClass(): void {
|
|
autoloader::register();
|
|
}
|
|
|
|
/**
|
|
* Set up function for tests.
|
|
*/
|
|
protected function setUp(): void {
|
|
parent::setUp();
|
|
|
|
$this->editorframework = new editor_framework();
|
|
}
|
|
|
|
/**
|
|
* Test that the method getLanguage retrieves the translation of a library in the requested language.
|
|
*
|
|
* @dataProvider get_language_provider
|
|
*
|
|
* @param array $datalib Library data to create
|
|
* @param string $lang Language to retrieve the translation
|
|
* @param bool $emptyexpected True when false value is expected; false, otherwise
|
|
* @param string $machinename The machine readable name of the library(content type)
|
|
* @param int $majorversion Major part of version number
|
|
* @param int $minorversion Minor part of version number
|
|
*/
|
|
public function test_get_language(array $datalib, string $lang, ?bool $emptyexpected = false, ?string $machinename = '',
|
|
?int $majorversion = 1, ?int $minorversion = 0): void {
|
|
$this->resetAfterTest(true);
|
|
|
|
// Fetch generator.
|
|
$generator = \testing_util::get_data_generator();
|
|
$h5pgenerator = $generator->get_plugin_generator('core_h5p');
|
|
|
|
$h5pfilestorage = new file_storage();
|
|
$h5ptempath = $h5pfilestorage->getTmpPath();
|
|
|
|
$expectedresult = '';
|
|
if ($datalib) {
|
|
$translations = [];
|
|
if (array_key_exists('translation', $datalib)) {
|
|
$translations = $datalib['translation'];
|
|
}
|
|
// Create DB entry for this library.
|
|
$tmplib = $h5pgenerator->create_library_record($datalib['machinename'], $datalib['title'], $datalib['majorversion'],
|
|
$datalib['minorversion']);
|
|
// Create the files for this libray.
|
|
[$library, $files] = $h5pgenerator->create_library($h5ptempath, $tmplib->id, $datalib['machinename'],
|
|
$datalib['majorversion'], $datalib['minorversion'], $translations);
|
|
$h5pfilestorage->saveLibrary($library);
|
|
|
|
// If machinename, majorversion or minorversion are empty, use the value in datalib.
|
|
if (empty($machinename)) {
|
|
$machinename = $datalib['machinename'];
|
|
}
|
|
if (empty($majorversion)) {
|
|
$majorversion = $datalib['majorversion'];
|
|
}
|
|
if (empty($minorversion)) {
|
|
$minorversion = $datalib['minorversion'];
|
|
}
|
|
if (!$emptyexpected && array_key_exists($lang, $translations)) {
|
|
$expectedresult = $translations[$lang];
|
|
}
|
|
}
|
|
|
|
// Get Language.
|
|
$json = $this->editorframework->getLanguage($machinename, $majorversion, $minorversion, $lang);
|
|
|
|
if ($emptyexpected) {
|
|
$this->assertFalse($json);
|
|
} else {
|
|
$this->assertEquals($expectedresult, $json);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Data provider for test_get_language().
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_language_provider(): array {
|
|
return [
|
|
'No library' => [
|
|
[],
|
|
'en',
|
|
true,
|
|
'Library1',
|
|
1,
|
|
2,
|
|
],
|
|
'One library created but getting translation from an unexisting one' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'es',
|
|
true,
|
|
'AnotherLibrary',
|
|
],
|
|
'One library without any translation' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
],
|
|
'es',
|
|
true,
|
|
],
|
|
'One library with 2 translations (es and fr) - es' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'es',
|
|
],
|
|
'One library with 2 translations (es and fr) - fr' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'fr',
|
|
],
|
|
'One library with 2 translations (es and fr) - unexisting translation (de)' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'de',
|
|
true
|
|
],
|
|
'One library with 3 translations (one of them English) - fr' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'en' => '{"libraryStrings": {"key": "value"}}',
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'fr',
|
|
],
|
|
'One library with 3 translations (one of them English) - en' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'en' => '{"libraryStrings": {"key": "value"}}',
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
'en',
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that the method getAvailableLanguages retrieves all the language available of a library.
|
|
*
|
|
* @dataProvider get_available_languages_provider
|
|
*
|
|
* @param array $datalib Library data to create
|
|
* @param array $expectedlangs Available languages expected.
|
|
* @param string $machinename The machine readable name of the library(content type)
|
|
* @param int $majorversion Major part of version number
|
|
* @param int $minorversion Minor part of version number
|
|
*/
|
|
public function test_get_available_languages(array $datalib, ?array $expectedlangs = null, ?string $machinename = '',
|
|
?int $majorversion = 1, ?int $minorversion = 0): void {
|
|
$this->resetAfterTest(true);
|
|
|
|
// Fetch generator.
|
|
$generator = \testing_util::get_data_generator();
|
|
$h5pgenerator = $generator->get_plugin_generator('core_h5p');
|
|
|
|
$h5pfilestorage = new file_storage();
|
|
$h5ptempath = $h5pfilestorage->getTmpPath();
|
|
|
|
$translations = [];
|
|
if ($datalib) {
|
|
if (array_key_exists('translation', $datalib)) {
|
|
$translations = $datalib['translation'];
|
|
}
|
|
// Create DB entry for this library.
|
|
$tmplib = $h5pgenerator->create_library_record($datalib['machinename'], $datalib['title'], $datalib['majorversion'],
|
|
$datalib['minorversion']);
|
|
// Create the files for this libray.
|
|
[$library, $files] = $h5pgenerator->create_library($h5ptempath, $tmplib->id, $datalib['machinename'],
|
|
$datalib['majorversion'], $datalib['minorversion'], $translations);
|
|
$h5pfilestorage->saveLibrary($library);
|
|
|
|
if (empty($machinename)) {
|
|
$machinename = $datalib['machinename'];
|
|
}
|
|
if (empty($majorversion)) {
|
|
$majorversion = $datalib['majorversion'];
|
|
}
|
|
if (empty($minorversion)) {
|
|
$minorversion = $datalib['minorversion'];
|
|
}
|
|
}
|
|
|
|
// Get available languages.
|
|
$langs = $this->editorframework->getAvailableLanguages($machinename, $majorversion, $minorversion);
|
|
|
|
$this->assertCount(count($expectedlangs), $langs);
|
|
$this->assertEquals(ksort($expectedlangs), ksort($langs));
|
|
}
|
|
|
|
/**
|
|
* Data provider for test_get_available_languages().
|
|
*
|
|
* @return array
|
|
*/
|
|
public function get_available_languages_provider(): array {
|
|
return [
|
|
'No library' => [
|
|
[],
|
|
[],
|
|
'Library1',
|
|
1,
|
|
2,
|
|
],
|
|
'One library created but getting available from an unexisting one' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
[],
|
|
'Library2',
|
|
1,
|
|
2,
|
|
],
|
|
'One library without any translation' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
],
|
|
['en'],
|
|
],
|
|
'One library with 2 translations (es and fr)' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
['en', 'es', 'fr'],
|
|
],
|
|
'One library with 3 translations (one of them English)' => [
|
|
'Library1 1.2' => [
|
|
'machinename' => 'Library1',
|
|
'title' => 'Lib1',
|
|
'majorversion' => 1,
|
|
'minorversion' => 2,
|
|
'translation' => [
|
|
'en' => '{"libraryStrings": {"key": "value"}}',
|
|
'es' => '{"libraryStrings": {"key": "valor"}}',
|
|
'fr' => '{"libraryStrings": {"key": "valeur"}}',
|
|
],
|
|
],
|
|
['en', 'es', 'fr'],
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Test that the method getLibraries get the specified libraries or all the content types (runnable = 1).
|
|
*/
|
|
public function test_getLibraries(): void {
|
|
$this->resetAfterTest(true);
|
|
|
|
$generator = \testing_util::get_data_generator();
|
|
$h5pgenerator = $generator->get_plugin_generator('core_h5p');
|
|
|
|
// Generate some h5p related data.
|
|
$data = $h5pgenerator->generate_h5p_data();
|
|
|
|
$expectedlibraries = [];
|
|
foreach ($data as $key => $value) {
|
|
if (isset($value->data) && $value->data->runnable) {
|
|
$value->data->name = $value->data->machinename;
|
|
$value->data->majorVersion = $value->data->majorversion;
|
|
$value->data->minorVersion = $value->data->minorversion;
|
|
$expectedlibraries[$value->data->title] = $value->data;
|
|
}
|
|
}
|
|
ksort($expectedlibraries);
|
|
|
|
// Get all libraries.
|
|
$libraries = $this->editorframework->getLibraries();
|
|
foreach ($libraries as $library) {
|
|
$actuallibraries[] = $library->title;
|
|
}
|
|
sort($actuallibraries);
|
|
|
|
$this->assertEquals(array_keys($expectedlibraries), $actuallibraries);
|
|
|
|
// Get a subset of libraries.
|
|
$librariessubset = array_slice($expectedlibraries, 0, 4);
|
|
|
|
$actuallibraries = [];
|
|
$libraries = $this->editorframework->getLibraries($librariessubset);
|
|
foreach ($libraries as $library) {
|
|
$actuallibraries[] = $library->title;
|
|
}
|
|
|
|
$this->assertEquals(array_keys($librariessubset), $actuallibraries);
|
|
}
|
|
}
|