<?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_testcase extends \advanced_testcase {
> class editor_framework_test extends \advanced_testcase {
/** @var editor_framework H5P editor_framework instance */
protected $editorframework;
/**
> * Setup to ensure that fixtures are loaded.
* Set up function for tests.
> */
*/
> public static function setupBeforeClass(): void {
protected function setUp(): void {
> autoloader::register();
parent::setUp();
> }
>
autoloader::register();
> /**
< autoloader::register();
<
}
/**
* 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)) {
> 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);
}
}