MDL-67146 lang: Update behat scenario files with the new string wording
[moodle.git] / h5p / tests / external_test.php
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/>.
17 /**
18  * Core h5p external functions tests.
19  *
20  * @package    core_h5p
21  * @category   external
22  * @copyright  2019 Carlos Escobedo <carlos@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  * @since      Moodle 3.8
25  */
27 defined('MOODLE_INTERNAL') || die();
29 global $CFG;
31 require_once($CFG->libdir . '/externallib.php');
32 require_once($CFG->dirroot . '/webservice/tests/helpers.php');
34 use core_h5p\external;
35 use core_h5p\file_storage;
36 use core_h5p\autoloader;
38 /**
39  * Core h5p external functions tests
40  *
41  * @package    core_h5p
42  * @category   external
43  * @copyright  2019 Carlos Escobedo <carlos@moodle.com>
44  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
45  * @since      Moodle 3.8
46  */
47 class core_h5p_external_testcase extends externallib_advanced_testcase {
49     protected function setUp() {
50         parent::setUp();
51         autoloader::register();
52     }
54     /**
55      * test_get_trusted_h5p_file description
56      */
57     public function test_get_trusted_h5p_file() {
58         global $DB;
59         $this->resetAfterTest(true);
60         $this->setAdminUser();
62         // This is a valid .H5P file.
63         $filename = 'find-the-words.h5p';
64         $path = __DIR__ . '/fixtures/'.$filename;
65         $syscontext = \context_system::instance();
66         $filerecord = [
67             'contextid' => $syscontext->id,
68             'component' => \core_h5p\file_storage::COMPONENT,
69             'filearea'  => 'unittest',
70             'itemid'    => 0,
71             'filepath'  => '/',
72             'filename'  => $filename,
73         ];
74         // Load the h5p file into DB.
75         $fs = get_file_storage();
76         $file = $fs->create_file_from_pathname($filerecord, $path);
77         // Make the URL to pass to the WS.
78         $url  = \moodle_url::make_pluginfile_url(
79             $syscontext->id,
80             \core_h5p\file_storage::COMPONENT,
81             'unittest',
82             0,
83             '/',
84             $filename
85         );
86         // Call the WS.
87         $result = external::get_trusted_h5p_file($url->out(), 0, 0, 0, 0);
88         $result = external_api::clean_returnvalue(external::get_trusted_h5p_file_returns(), $result);
89         // Expected result: Just 1 record on files and none on warnings.
90         $this->assertCount(1, $result['files']);
91         $this->assertCount(0, $result['warnings']);
92         // Get the export file in the DB to compare with the ws's results.
93         $fileh5p = $this->get_export_file($filename, $file->get_pathnamehash());
94         $fileh5purl  = \moodle_url::make_pluginfile_url(
95             $syscontext->id,
96             \core_h5p\file_storage::COMPONENT,
97             \core_h5p\file_storage::EXPORT_FILEAREA,
98             '',
99             '',
100             $fileh5p->get_filename()
101         );
102         $this->assertEquals($fileh5p->get_filepath(), $result['files'][0]['filepath']);
103         $this->assertEquals($fileh5p->get_mimetype(), $result['files'][0]['mimetype']);
104         $this->assertEquals($fileh5p->get_filesize(), $result['files'][0]['filesize']);
105         $this->assertEquals($fileh5p->get_timemodified(), $result['files'][0]['timemodified']);
106         $this->assertEquals($fileh5p->get_filename(), $result['files'][0]['filename']);
107         $this->assertEquals($fileh5purl->out(), $result['files'][0]['fileurl']);
108     }
110     /**
111      * test_h5p_invalid_url description
112      */
113     public function test_h5p_invalid_url() {
114         $this->resetAfterTest();
115         $this->setAdminUser();
117         // Create an empty url.
118         $urlempty = '';
119         $result = external::get_trusted_h5p_file($urlempty, 0, 0, 0, 0);
120         $result = external_api::clean_returnvalue(external::get_trusted_h5p_file_returns(), $result);
121         // Expected result: Just 1 record on warnings and none on files.
122         $this->assertCount(0, $result['files']);
123         $this->assertCount(1, $result['warnings']);
124         // Check the warnings to be sure that h5pinvalidurl is the message by moodle_exception.
125         $this->assertEquals($urlempty, $result['warnings'][0]['item']);
126         $this->assertEquals(get_string('h5pinvalidurl', 'core_h5p'), $result['warnings'][0]['message']);
127     }
129     /**
130      * test_h5p_file_not_found description
131      */
132     public function test_h5p_file_not_found() {
133         $this->resetAfterTest();
134         $this->setAdminUser();
136         // Create a valid url with an h5pfile which doesn't exist in DB.
137         $syscontext = \context_system::instance();
138         $filenotfoundurl  = \moodle_url::make_pluginfile_url(
139             $syscontext->id,
140             \core_h5p\file_storage::COMPONENT,
141             'unittest',
142             0,
143             '/',
144             'notfound.h5p'
145         );
146         // Call the ws.
147         $result = external::get_trusted_h5p_file($filenotfoundurl->out(), 0, 0, 0, 0);
148         $result = external_api::clean_returnvalue(external::get_trusted_h5p_file_returns(), $result);
149         // Expected result: Just 1 record on warnings and none on files.
150         $this->assertCount(0, $result['files']);
151         $this->assertCount(1, $result['warnings']);
152         // Check the warnings to be sure that h5pfilenotfound is the message by h5p error.
153         $this->assertEquals($filenotfoundurl->out(), $result['warnings'][0]['item']);
154         $this->assertEquals(get_string('h5pfilenotfound', 'core_h5p'), $result['warnings'][0]['message']);
155     }
157     /**
158      * Get the H5P export file.
159      *
160      * @param string $filename
161      * @param string $pathnamehash
162      * @return stored_file
163      */
164     protected function get_export_file($filename, $pathnamehash) {
165         global $DB;
167         // Simulate the filenameexport using slug as H5P does.
168         $id = $DB->get_field('h5p', 'id', ['pathnamehash' => $pathnamehash]);
169         $filenameexport = basename($filename, '.h5p').'-'.$id.'-'.$id.'.h5p';
170         $syscontext = \context_system::instance();
171         $fs = get_file_storage();
172         $fileh5p = $fs->get_file($syscontext->id,
173             \core_h5p\file_storage::COMPONENT,
174             \core_h5p\file_storage::EXPORT_FILEAREA,
175             0,
176             '/',
177             $filenameexport);
178         return $fileh5p;
179     }