Merge branch 'MDL-65847-auth_db_error_handling-39' of git://github.com/leonstr/moodle...
[moodle.git] / contentbank / tests / content_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  * Test for content bank contenttype class.
19  *
20  * @package    core_contentbank
21  * @category   test
22  * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 namespace core_contentbank;
28 use stdClass;
29 use context_system;
30 use contenttype_testable\contenttype as contenttype;
32 /**
33  * Test for content bank contenttype class.
34  *
35  * @package    core_contentbank
36  * @category   test
37  * @copyright  2020 Amaia Anabitarte <amaia@moodle.com>
38  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  * @coversDefaultClass \core_contentbank\content
40  *
41  */
42 class core_contenttype_content_testcase extends \advanced_testcase {
44     /**
45      * Setup to ensure that fixtures are loaded.
46      */
47     public static function setupBeforeClass(): void {
48         global $CFG;
50         require_once($CFG->dirroot . '/contentbank/tests/fixtures/testable_contenttype.php');
51         require_once($CFG->dirroot . '/contentbank/tests/fixtures/testable_content.php');
52     }
54     /**
55      * Tests for behaviour of get_name().
56      *
57      * @covers ::get_name
58      */
59     public function test_get_name() {
60         $this->resetAfterTest();
62         // Create content.
63         $record = new stdClass();
64         $record->name = 'Test content';
65         $record->configdata = '';
67         $contenttype = new contenttype(context_system::instance());
68         $content = $contenttype->create_content($record);
69         $this->assertEquals($record->name, $content->get_name());
70     }
72     /**
73      * Data provider for test_set_name.
74      *
75      * @return  array
76      */
77     public function set_name_provider() {
78         return [
79             'Standard name' => ['New name', 'New name'],
80             'Name with digits' => ['Today is 17/04/2017', 'Today is 17/04/2017'],
81             'Name with symbols' => ['Follow us: @moodle', 'Follow us: @moodle'],
82             'Name with tags' => ['This is <b>bold</b>', 'This is bold'],
83             'Long name' => [str_repeat('a', 100), str_repeat('a', 100)],
84             'Too long name' => [str_repeat('a', 300), str_repeat('a', 255)]
85         ];
86     }
88     /**
89      * Tests for 'set_name' behaviour.
90      *
91      * @dataProvider    set_name_provider
92      * @param   string  $newname    The name to set
93      * @param   string   $expected   The name result
94      *
95      * @covers ::set_name
96      */
97     public function test_set_name(string $newname, string $expected) {
98         global $DB;
100         $this->resetAfterTest();
101         $this->setAdminUser();
103         $oldname = "Old name";
104         $context = context_system::instance();
106         // Create content.
107         $record = new stdClass();
108         $record->name = $oldname;
110         $contenttype = new contenttype($context);
111         $content = $contenttype->create_content($record);
112         $this->assertEquals($oldname, $content->get_name());
114         $content->set_name($newname);
115         $this->assertEquals($expected, $content->get_name());
117         $record = $DB->get_record('contentbank_content', ['id' => $content->get_id()]);
118         $this->assertEquals($expected, $record->name);
119     }
121     /**
122      * Tests for behaviour of get_content_type().
123      *
124      * @covers ::get_content_type
125      */
126     public function test_get_content_type() {
127         $this->resetAfterTest();
129         // Create content.
130         $record = new stdClass();
131         $record->name = 'Test content';
132         $record->configdata = '';
134         $contenttype = new contenttype(context_system::instance());
135         $content = $contenttype->create_content($record);
136         $this->assertEquals('contenttype_testable', $content->get_content_type());
137     }
139     /**
140      * Tests for 'configdata' behaviour.
141      *
142      * @covers ::set_configdata
143      */
144     public function test_configdata_changes() {
145         $this->resetAfterTest();
147         $configdata = "{img: 'icon.svg'}";
149         // Create content.
150         $record = new stdClass();
151         $record->configdata = $configdata;
153         $contenttype = new contenttype(context_system::instance());
154         $content = $contenttype->create_content($record);
155         $this->assertEquals($configdata, $content->get_configdata());
157         $configdata = "{alt: 'Name'}";
158         $content->set_configdata($configdata);
159         $this->assertEquals($configdata, $content->get_configdata());
160     }
162     /**
163      * Tests for 'set_contextid' behaviour.
164      *
165      * @covers ::set_contextid
166      */
167     public function test_set_contextid() {
168         $this->resetAfterTest();
169         $this->setAdminUser();
170         $context = context_system::instance();
171         $course = $this->getDataGenerator()->create_course();
172         $newcontext = \context_course::instance($course->id);
174         // Add some content to the content bank.
175         $generator = $this->getDataGenerator()->get_plugin_generator('core_contentbank');
176         $contents = $generator->generate_contentbank_data('contenttype_testable', 3, 0, $context);
177         $content = reset($contents);
179         $oldcontextid = $content->get_contextid();
181         $file = $content->get_file();
182         $this->assertEquals($oldcontextid, $file->get_contextid());
183         $this->assertEquals($context->id, $oldcontextid);
184         $this->assertNotEquals($newcontext->id, $oldcontextid);
186         $content->set_contextid($newcontext->id);
187         $file = $content->get_file();
189         $this->assertEquals($newcontext->id, $content->get_contextid());
190         $this->assertEquals($newcontext->id, $file->get_contextid());
191     }
193     /**
194      * Tests for 'import_file' behaviour when replacing a file.
195      *
196      * @covers ::import_file
197      */
198     public function test_import_file_replace(): void {
199         global $USER;
200         $this->resetAfterTest();
201         $this->setAdminUser();
202         $context = context_system::instance();
204         // Add some content to the content bank.
205         $generator = $this->getDataGenerator()->get_plugin_generator('core_contentbank');
206         $contents = $generator->generate_contentbank_data('contenttype_testable', 3, 0, $context);
207         $content = reset($contents);
209         $originalfile = $content->get_file();
211         // Create a dummy file.
212         $filerecord = array(
213             'contextid' => $context->id,
214             'component' => 'contentbank',
215             'filearea' => 'draft',
216             'itemid' => $content->get_id(),
217             'filepath' => '/',
218             'filename' => 'example.txt'
219         );
220         $fs = get_file_storage();
221         $file = $fs->create_file_from_string($filerecord, 'Dummy content ');
223         $importedfile = $content->import_file($file);
225         $this->assertEquals($originalfile->get_filename(), $importedfile->get_filename());
226         $this->assertEquals($originalfile->get_filearea(), $importedfile->get_filearea());
227         $this->assertEquals($originalfile->get_filepath(), $importedfile->get_filepath());
228         $this->assertEquals($originalfile->get_mimetype(), $importedfile->get_mimetype());
230         $this->assertEquals($file->get_userid(), $importedfile->get_userid());
231         $this->assertEquals($file->get_contenthash(), $importedfile->get_contenthash());
232     }
234     /**
235      * Tests for 'import_file' behaviour when uploading a new file.
236      *
237      * @covers ::import_file
238      */
239     public function test_import_file_upload(): void {
240         global $USER;
241         $this->resetAfterTest();
242         $this->setAdminUser();
243         $context = context_system::instance();
245         $type = new contenttype($context);
246         $record = (object)[
247             'name' => 'content name',
248             'usercreated' => $USER->id,
249         ];
250         $content = $type->create_content($record);
252         // Create a dummy file.
253         $filerecord = array(
254             'contextid' => $context->id,
255             'component' => 'contentbank',
256             'filearea' => 'draft',
257             'itemid' => $content->get_id(),
258             'filepath' => '/',
259             'filename' => 'example.txt'
260         );
261         $fs = get_file_storage();
262         $file = $fs->create_file_from_string($filerecord, 'Dummy content ');
264         $importedfile = $content->import_file($file);
266         $this->assertEquals($file->get_filename(), $importedfile->get_filename());
267         $this->assertEquals($file->get_userid(), $importedfile->get_userid());
268         $this->assertEquals($file->get_mimetype(), $importedfile->get_mimetype());
269         $this->assertEquals($file->get_contenthash(), $importedfile->get_contenthash());
270         $this->assertEquals('public', $importedfile->get_filearea());
271         $this->assertEquals('/', $importedfile->get_filepath());
273         $contentfile = $content->get_file($file);
274         $this->assertEquals($importedfile->get_id(), $contentfile->get_id());
275     }