weekly release 2.6dev
[moodle.git] / files / tests / externallib_test.php
CommitLineData
11f20be7
AA
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/>.
16
17
18/**
19 * PHPunit tests for external files API.
20 *
21 * @package core_files
22 * @category external
23 * @copyright 2013 Ankit Agarwal
24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 * @since Moodle 2.6
26 */
27defined('MOODLE_INTERNAL') || die();
28
29global $CFG;
30
31require_once($CFG->dirroot . '/webservice/tests/helpers.php');
32require_once($CFG->dirroot . '/files/externallib.php');
33
8252b7c2 34class core_files_externallib_testcase extends advanced_testcase {
11f20be7
AA
35
36 /*
37 * Test core_files_external::upload().
38 */
39
40 public function test_upload() {
41 global $USER;
42
43 $this->resetAfterTest();
44 $this->setAdminUser();
45 $context = context_user::instance($USER->id);
46 $contextid = $context->id;
47 $component = "user";
873482fe 48 $filearea = "draft";
11f20be7
AA
49 $itemid = 0;
50 $filepath = "/";
51 $filename = "Simple.txt";
52 $filecontent = base64_encode("Let us create a nice simple file");
57d16acd
AA
53 $contextlevel = null;
54 $instanceid = null;
11f20be7
AA
55 $browser = get_file_browser();
56
57 // Make sure no file exists.
58 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
59 $this->assertEmpty($file);
60
61 // Call the api to create a file.
873482fe 62 $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath,
57d16acd 63 $filename, $filecontent, $contextlevel, $instanceid);
873482fe
DW
64 // Get the created draft item id.
65 $itemid = $fileinfo['itemid'];
11f20be7
AA
66
67 // Make sure the file was created.
68 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
69 $this->assertNotEmpty($file);
70
71 // Make sure no file exists.
11f20be7
AA
72 $filename = "Simple2.txt";
73 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
74 $this->assertEmpty($file);
75
76 // Call the api to create a file.
57d16acd
AA
77 $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid,
78 $filepath, $filename, $filecontent, $contextlevel, $instanceid);
873482fe
DW
79 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
80 $this->assertNotEmpty($file);
11f20be7 81
57d16acd 82 // Let us try creating a file using contextlevel and instance id.
57d16acd
AA
83 $filename = "Simple5.txt";
84 $contextid = 0;
85 $contextlevel = "user";
86 $instanceid = $USER->id;
87 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
88 $this->assertEmpty($file);
89 $fileinfo = core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath,
90 $filename, $filecontent, $contextlevel, $instanceid);
873482fe
DW
91 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
92 $this->assertNotEmpty($file);
57d16acd 93
11f20be7
AA
94 // Make sure the same file cannot be created again.
95 $this->setExpectedException("moodle_exception");
57d16acd
AA
96 core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath,
97 $filename, $filecontent, $contextlevel, $instanceid);
11f20be7
AA
98 }
99
100 /*
101 * Make sure only user component is allowed in core_files_external::upload().
102 */
103 public function test_upload_param_component() {
104 global $USER;
105
106 $this->resetAfterTest();
107 $this->setAdminUser();
108 $context = context_user::instance($USER->id);
109 $contextid = $context->id;
110 $component = "backup";
111 $filearea = "private";
112 $itemid = 0;
113 $filepath = "/";
114 $filename = "Simple3.txt";
115 $filecontent = base64_encode("Let us create a nice simple file");
57d16acd
AA
116 $contextlevel = null;
117 $instanceid = null;
11f20be7
AA
118
119 // Make sure exception is thrown.
120 $this->setExpectedException("coding_exception");
57d16acd
AA
121 core_files_external::upload($contextid, $component, $filearea, $itemid,
122 $filepath, $filename, $filecontent, $contextlevel, $instanceid);
11f20be7
AA
123 }
124
125 /*
873482fe 126 * Make sure only private or draft areas are allowed in core_files_external::upload().
11f20be7
AA
127 */
128 public function test_upload_param_area() {
129 global $USER;
130
131 $this->resetAfterTest();
132 $this->setAdminUser();
133 $context = context_user::instance($USER->id);
134 $contextid = $context->id;
135 $component = "user";
136 $filearea = "draft";
873482fe 137 $itemid = file_get_unused_draft_itemid();
11f20be7
AA
138 $filepath = "/";
139 $filename = "Simple4.txt";
140 $filecontent = base64_encode("Let us create a nice simple file");
57d16acd
AA
141 $contextlevel = null;
142 $instanceid = null;
11f20be7 143
873482fe
DW
144 // Make sure the file is created.
145 @core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent);
146 $browser = get_file_browser();
147 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
148 $this->assertNotEmpty($file);
11f20be7
AA
149 }
150
71e38b12
AA
151 /*
152 * Make sure core_files_external::upload() works without new parameters.
153 */
154 public function test_upload_without_new_param() {
155 global $USER;
156
157 $this->resetAfterTest();
158 $this->setAdminUser();
159 $context = context_user::instance($USER->id);
160 $contextid = $context->id;
161 $component = "user";
162 $filearea = "private";
163 $itemid = 0;
164 $filepath = "/";
165 $filename = "Simple4.txt";
166 $filecontent = base64_encode("Let us create a nice simple file");
167
71e38b12 168 @core_files_external::upload($contextid, $component, $filearea, $itemid, $filepath, $filename, $filecontent);
873482fe
DW
169
170 // Assert debugging called (deprecation warning).
171 $this->assertDebuggingCalled();
172
173 // Make sure the file is created.
71e38b12
AA
174 $browser = get_file_browser();
175 $file = $browser->get_file_info($context, $component, $filearea, $itemid, $filepath, $filename);
176 $this->assertNotEmpty($file);
177 }
196c8b71
AG
178
179 public function test_get_files() {
180 global $USER, $DB;
181
182 $this->resetAfterTest();
183
184 $this->setAdminUser();
185 $USER->email = 'test@moodle.com';
196c8b71
AG
186
187 $course = $this->getDataGenerator()->create_course();
188 $record = new stdClass();
189 $record->course = $course->id;
190 $record->name = "Mod data upload test";
191
192 $record->intro = "Some intro of some sort";
193
194 $module = $this->getDataGenerator()->create_module('data', $record);
195
196 $field = data_get_field_new('file', $module);
197
198 $fielddetail = new stdClass();
199 $fielddetail->d = $module->id;
200 $fielddetail->mode = 'add';
201 $fielddetail->type = 'file';
202 $fielddetail->sesskey = sesskey();
203 $fielddetail->name = 'Upload file';
204 $fielddetail->description = 'Some description';
205 $fielddetail->param3 = '0';
206
207 $field->define_field($fielddetail);
208 $field->insert_field();
209 $recordid = data_add_record($module);
210
211 $timemodified = $DB->get_field('data_records', 'timemodified', array('id' => $recordid));
212
213 $datacontent = array();
214 $datacontent['fieldid'] = $field->field->id;
215 $datacontent['recordid'] = $recordid;
216 $datacontent['content'] = 'Simple4.txt';
217
218 $contentid = $DB->insert_record('data_content', $datacontent);
219
220 $context = context_module::instance($module->id);
221 $usercontext = context_user::instance($USER->id);
222 $component = 'mod_data';
223 $filearea = 'content';
224 $itemid = $contentid;
225 $filename = $datacontent['content'];
226 $filecontent = base64_encode("Let us create a nice simple file.");
227
228 $filerecord = array();
229 $filerecord['contextid'] = $context->id;
230 $filerecord['component'] = $component;
231 $filerecord['filearea'] = $filearea;
232 $filerecord['itemid'] = $itemid;
233 $filerecord['filepath'] = '/';
234 $filerecord['filename'] = $filename;
235
236 $fs = get_file_storage();
237 $file = $fs->create_file_from_string($filerecord, $filecontent);
238
239 $filename = '';
240 $testfilelisting = core_files_external::get_files($context->id, $component, $filearea, $itemid, '/', $filename);
241
242 $testdata = array();
243 $testdata['parents'] = array();
244 $testdata['parents']['0'] = array('contextid' => 1,
245 'component' => null,
246 'filearea' => null,
247 'itemid' => null,
248 'filepath' => null,
249 'filename' => 'System');
250 $testdata['parents']['1'] = array('contextid' => 3,
251 'component' => null,
252 'filearea' => null,
253 'itemid' => null,
254 'filepath' => null,
255 'filename' => 'Miscellaneous');
256 $testdata['parents']['2'] = array('contextid' => 15,
257 'component' => null,
258 'filearea' => null,
259 'itemid' => null,
260 'filepath' => null,
261 'filename' => 'Test course 1');
262 $testdata['parents']['3'] = array('contextid' => 20,
263 'component' => null,
264 'filearea' => null,
265 'itemid' => null,
266 'filepath' => null,
267 'filename' => 'Mod data upload test (Database)');
268 $testdata['parents']['4'] = array('contextid' => 20,
269 'component' => 'mod_data',
270 'filearea' => 'content',
271 'itemid' => null,
272 'filepath' => null,
273 'filename' => 'Fields');
274 $testdata['files'] = array();
275 $testdata['files']['0'] = array('contextid' => 20,
276 'component' => 'mod_data',
277 'filearea' => 'content',
278 'itemid' => 1,
279 'filepath' => '/',
280 'filename' => 'Simple4.txt',
281 'url' => 'http://www.example.com/moodle/pluginfile.php/20/mod_data/content/1/Simple4.txt',
282 'isdir' => null,
283 'timemodified' => $timemodified);
284
285 $this->assertEquals($testfilelisting, $testdata);
286
287 // Try again but without the context.
288 $nocontext = -1;
289 $modified = 0;
290 $contextlevel = 'module';
291 $instanceid = $module->id;
292 $testfilelisting = core_files_external::get_files($nocontext, $component, $filearea, $itemid, '/', $filename, $modified, $contextlevel, $instanceid);
293 $this->assertEquals($testfilelisting, $testdata);
294 }
873482fe 295}