<?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 H5PEditorAjaxInterface 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;
< use ReflectionMethod;
> use Moodle\H5PCore;
/**
*
* Test class covering the H5PEditorAjaxInterface 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_ajax_testcase extends \advanced_testcase {
> class editor_ajax_test extends \advanced_testcase {
/** @var editor_ajax H5P editor ajax instance */
protected $editorajax;
/**
* Set up function for tests.
*/
< protected function setUp() {
> protected function setUp(): void {
parent::setUp();
autoloader::register();
$this->editorajax = new editor_ajax();
}
/**
* Test that getLatestLibraryVersions method retrieves the latest installed library versions.
*/
public function test_getLatestLibraryVersions(): void {
$this->resetAfterTest();
$generator = \testing_util::get_data_generator();
$h5pgenerator = $generator->get_plugin_generator('core_h5p');
// Create several libraries records.
$h5pgenerator->create_library_record('Library1', 'Lib1', 2, 0);
$lib2 = $h5pgenerator->create_library_record('Library2', 'Lib2', 2, 1);
$expectedlibraries[] = $lib2->id;
$lib3 = $h5pgenerator->create_library_record('Library3', 'Lib3', 1, 3);
$expectedlibraries[] = $lib3->id;
$h5pgenerator->create_library_record('Library1', 'Lib1', 2, 1);
$lib12 = $h5pgenerator->create_library_record('Library1', 'Lib1', 3, 0);
$expectedlibraries[] = $lib12->id;
$actuallibraries = $this->editorajax->getLatestLibraryVersions();
ksort($actuallibraries);
$this->assertEquals($expectedlibraries, array_keys($actuallibraries));
}
/**
> * Test that getContentTypeCache method retrieves the latest library versions that exists locally.
* Test that the method getTranslations retrieves the translations of several libraries.
> */
*
> public function test_getContentTypeCache(): void {
* @dataProvider get_translations_provider
> $this->resetAfterTest();
*
>
* @param array $datalibs Libraries to create
> $h5pgenerator = \testing_util::get_data_generator()->get_plugin_generator('core_h5p');
* @param string $lang Language to get the translations
>
* @param bool $emptyexpected True if empty translations are expected; false otherwise
> // Create several libraries records.
* @param array $altstringlibs When defined, libraries are no created and the content here is used to call the method
> $lib1 = $h5pgenerator->create_library_record('Library1', 'Lib1', 1, 0, 1, '', null, 'http://tutorial.org',
*/
> 'http://example.org');
public function test_get_translations(array $datalibs, string $lang, bool $emptyexpected, ?array $altstringlibs = []): void {
> $lib2 = $h5pgenerator->create_library_record('Library2', 'Lib2', 2, 0, 1, '', null, 'http://tutorial.org');
$this->resetAfterTest();
> $lib3 = $h5pgenerator->create_library_record('Library3', 'Lib3', 3, 0);
> $libs = [$lib1, $lib2, $lib3];
// Fetch generator.
>
$generator = \testing_util::get_data_generator();
> $libraries = $this->editorajax->getContentTypeCache();
$h5pgenerator = $generator->get_plugin_generator('core_h5p');
> $this->assertCount(3, $libraries);
> foreach ($libs as $lib) {
$h5pfilestorage = new file_storage();
> $library = $libraries[$lib->id];
$h5ptempath = $h5pfilestorage->getTmpPath();
> $this->assertEquals($library->id, $lib->id);
> $this->assertEquals($library->machine_name, $lib->machinename);
if (!empty($altstringlibs)) {
> $this->assertEquals($library->major_version, $lib->majorversion);
// Libraries won't be created and the getTranslation method will be called with this $altstringlibs.
> $this->assertEquals($library->tutorial, $lib->tutorial);
$stringlibs = $altstringlibs;
> $this->assertEquals($library->example, $lib->example);
} else {
> $this->assertEquals($library->is_recommended, 0);
$stringlibs = [];
> $this->assertEquals($library->summary, '');
foreach ($datalibs as $datalib) {
> }
// 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'], $datalib['translation']);
$h5pfilestorage->saveLibrary($library);
< $stringlibs[] = \H5PCore::libraryToString($library);
> $stringlibs[] = H5PCore::libraryToString($library);
}
}
$translations = $this->editorajax->getTranslations($stringlibs, $lang);
if ($emptyexpected) {
$this->assertEmpty($translations);
} else {
foreach ($translations as $stringlib => $translation) {
$this->assertEquals($datalibs[$stringlib]['translation'][$lang], $translation);
}
}
}
/**
* Data provider for test_get_translations().
*
* @return array
*/
public function get_translations_provider(): array {
return [
'No library' => [
[],
'es',
true,
['Library1 1.2']
],
'One library with existing translation (es)' => [
[
'Library1 1.2' => [
'machinename' => 'Library1',
'title' => 'Lib1',
'majorversion' => 1,
'minorversion' => 2,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
]
],
'es',
false
],
'One library with existing translation (fr)' => [
[
'Library1 1.2' => [
'machinename' => 'Library1',
'title' => 'Lib1',
'majorversion' => 1,
'minorversion' => 2,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
]
],
'fr',
false
],
'One library with 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
],
'Two libraries with existing translation (es)' => [
[
'Library1 1.2' => [
'machinename' => 'Library1',
'title' => 'Lib1',
'majorversion' => 1,
'minorversion' => 2,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
],
'Library2 3.4' => [
'machinename' => 'Library2',
'title' => 'Lib1',
'majorversion' => 3,
'minorversion' => 4,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
]
],
'es',
false
],
'Two libraries with unexisting translation (de)' => [
[
'Library1 1.2' => [
'machinename' => 'Library1',
'title' => 'Lib1',
'majorversion' => 1,
'minorversion' => 2,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
],
'Library2 3.4' => [
'machinename' => 'Library2',
'title' => 'Lib1',
'majorversion' => 3,
'minorversion' => 4,
'translation' => [
'es' => '{"libraryStrings": {"key": "valor"}}',
'fr' => '{"libraryStrings": {"key": "valeur"}}',
],
]
],
'de',
true
],
];
}
}