Merge branch 'MDL-69089-39' of git://github.com/aanabit/moodle into MOODLE_39_STABLE
[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             'Empty name' => ['', 'Old name'],
86             'Blanks only' => ['  ', 'Old name'],
87         ];
88     }
90     /**
91      * Tests for 'set_name' behaviour.
92      *
93      * @dataProvider    set_name_provider
94      * @param   string  $newname    The name to set
95      * @param   string   $expected   The name result
96      *
97      * @covers ::set_name
98      */
99     public function test_set_name(string $newname, string $expected) {
100         global $DB;
102         $this->resetAfterTest();
103         $this->setAdminUser();
105         $oldname = "Old name";
106         $context = context_system::instance();
108         // Create content.
109         $record = new stdClass();
110         $record->name = $oldname;
112         $contenttype = new contenttype($context);
113         $content = $contenttype->create_content($record);
114         $this->assertEquals($oldname, $content->get_name());
116         $content->set_name($newname);
117         $this->assertEquals($expected, $content->get_name());
119         $record = $DB->get_record('contentbank_content', ['id' => $content->get_id()]);
120         $this->assertEquals($expected, $record->name);
121     }
123     /**
124      * Tests for behaviour of get_content_type().
125      *
126      * @covers ::get_content_type
127      */
128     public function test_get_content_type() {
129         $this->resetAfterTest();
131         // Create content.
132         $record = new stdClass();
133         $record->name = 'Test content';
134         $record->configdata = '';
136         $contenttype = new contenttype(context_system::instance());
137         $content = $contenttype->create_content($record);
138         $this->assertEquals('contenttype_testable', $content->get_content_type());
139     }
141     /**
142      * Tests for 'configdata' behaviour.
143      *
144      * @covers ::set_configdata
145      */
146     public function test_configdata_changes() {
147         $this->resetAfterTest();
149         $configdata = "{img: 'icon.svg'}";
151         // Create content.
152         $record = new stdClass();
153         $record->configdata = $configdata;
155         $contenttype = new contenttype(context_system::instance());
156         $content = $contenttype->create_content($record);
157         $this->assertEquals($configdata, $content->get_configdata());
159         $configdata = "{alt: 'Name'}";
160         $content->set_configdata($configdata);
161         $this->assertEquals($configdata, $content->get_configdata());
162     }
164     /**
165      * Tests for 'set_contextid' behaviour.
166      *
167      * @covers ::set_contextid
168      */
169     public function test_set_contextid() {
170         $this->resetAfterTest();
171         $this->setAdminUser();
172         $context = context_system::instance();
173         $course = $this->getDataGenerator()->create_course();
174         $newcontext = \context_course::instance($course->id);
176         // Add some content to the content bank.
177         $generator = $this->getDataGenerator()->get_plugin_generator('core_contentbank');
178         $contents = $generator->generate_contentbank_data('contenttype_testable', 3, 0, $context);
179         $content = reset($contents);
181         $oldcontextid = $content->get_contextid();
183         $file = $content->get_file();
184         $this->assertEquals($oldcontextid, $file->get_contextid());
185         $this->assertEquals($context->id, $oldcontextid);
186         $this->assertNotEquals($newcontext->id, $oldcontextid);
188         $content->set_contextid($newcontext->id);
189         $file = $content->get_file();
191         $this->assertEquals($newcontext->id, $content->get_contextid());
192         $this->assertEquals($newcontext->id, $file->get_contextid());
193     }
195     /**
196      * Tests for 'import_file' behaviour when replacing a file.
197      *
198      * @covers ::import_file
199      */
200     public function test_import_file_replace(): void {
201         global $USER;
202         $this->resetAfterTest();
203         $this->setAdminUser();
204         $context = context_system::instance();
206         // Add some content to the content bank.
207         $generator = $this->getDataGenerator()->get_plugin_generator('core_contentbank');
208         $contents = $generator->generate_contentbank_data('contenttype_testable', 3, 0, $context);
209         $content = reset($contents);
211         $originalfile = $content->get_file();
213         // Create a dummy file.
214         $filerecord = array(
215             'contextid' => $context->id,
216             'component' => 'contentbank',
217             'filearea' => 'draft',
218             'itemid' => $content->get_id(),
219             'filepath' => '/',
220             'filename' => 'example.txt'
221         );
222         $fs = get_file_storage();
223         $file = $fs->create_file_from_string($filerecord, 'Dummy content ');
225         $importedfile = $content->import_file($file);
227         $this->assertEquals($originalfile->get_filename(), $importedfile->get_filename());
228         $this->assertEquals($originalfile->get_filearea(), $importedfile->get_filearea());
229         $this->assertEquals($originalfile->get_filepath(), $importedfile->get_filepath());
230         $this->assertEquals($originalfile->get_mimetype(), $importedfile->get_mimetype());
232         $this->assertEquals($file->get_userid(), $importedfile->get_userid());
233         $this->assertEquals($file->get_contenthash(), $importedfile->get_contenthash());
234     }
236     /**
237      * Tests for 'import_file' behaviour when uploading a new file.
238      *
239      * @covers ::import_file
240      */
241     public function test_import_file_upload(): void {
242         global $USER;
243         $this->resetAfterTest();
244         $this->setAdminUser();
245         $context = context_system::instance();
247         $type = new contenttype($context);
248         $record = (object)[
249             'name' => 'content name',
250             'usercreated' => $USER->id,
251         ];
252         $content = $type->create_content($record);
254         // Create a dummy file.
255         $filerecord = array(
256             'contextid' => $context->id,
257             'component' => 'contentbank',
258             'filearea' => 'draft',
259             'itemid' => $content->get_id(),
260             'filepath' => '/',
261             'filename' => 'example.txt'
262         );
263         $fs = get_file_storage();
264         $file = $fs->create_file_from_string($filerecord, 'Dummy content ');
266         $importedfile = $content->import_file($file);
268         $this->assertEquals($file->get_filename(), $importedfile->get_filename());
269         $this->assertEquals($file->get_userid(), $importedfile->get_userid());
270         $this->assertEquals($file->get_mimetype(), $importedfile->get_mimetype());
271         $this->assertEquals($file->get_contenthash(), $importedfile->get_contenthash());
272         $this->assertEquals('public', $importedfile->get_filearea());
273         $this->assertEquals('/', $importedfile->get_filepath());
275         $contentfile = $content->get_file($file);
276         $this->assertEquals($importedfile->get_id(), $contentfile->get_id());
277     }