ILIAS  trunk Revision v12.0_alpha-1227-g7ff6d300864
FileInputTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21require_once(__DIR__ . "/../../../../../../../vendor/composer/vendor/autoload.php");
22require_once(__DIR__ . "/../../../Base.php");
23require_once(__DIR__ . "/InputTest.php");
24require_once(__DIR__ . "/CommonFieldRendering.php");
25
26use ILIAS\Data;
34
36{
37 protected ButtonFactory $button_factory;
38 protected SymbolFactory $symbol_factory;
39
40 public function __construct(ButtonFactory $button_factory, SymbolFactory $symbol_factory)
41 {
42 $this->button_factory = $button_factory;
43 $this->symbol_factory = $symbol_factory;
44 }
45
46 public function button(): ButtonFactory
47 {
49 }
50
51 public function symbol(): SymbolFactory
52 {
54 }
55}
56
58{
59 use CommonFieldRendering;
60
62
63 public function setUp(): void
64 {
65 $this->name_source = new DefNamesource();
66 }
67
68 protected function brutallyTrimHTML(string $html): string
69 {
70 $html = str_replace(" />", "/>", $html);
71 return parent::brutallyTrimHTML($html);
72 }
73
74 private function getUploadHandler(?FileInfoResult $file = null): Field\UploadHandler
75 {
76 return new class ($file) implements Field\UploadHandler {
77 protected ?FileInfoResult $file;
78
79 public function __construct(?FileInfoResult $file)
80 {
81 $this->file = $file;
82 }
83
84 public function getFileIdentifierParameterName(): string
85 {
86 return 'file_id';
87 }
88
89 public function getUploadURL(): string
90 {
91 return 'uploadurl';
92 }
93
94 public function getFileRemovalURL(): string
95 {
96 return 'removalurl';
97 }
98
102 public function getExistingFileInfoURL(): string
103 {
104 return 'infourl';
105 }
106
110 public function getInfoForExistingFiles(array $file_ids): array
111 {
112 return [];
113 }
114
115 public function getInfoResult(string $identifier): ?FileInfoResult
116 {
117 if (null !== $this->file && $identifier === $this->file->getFileIdentifier()) {
118 return $this->file;
119 }
120
121 return null;
122 }
123
124 public function supportsChunkedUploads(): bool
125 {
126 return false;
127 }
128 };
129 }
130
131
132 public function testImplementsFactoryInterface(): void
133 {
134 $f = $this->getFieldFactory();
135
136 $text = $f->file($this->getUploadHandler(), "label", "byline");
137
138 $this->assertInstanceOf(\ILIAS\UI\Component\Input\Container\Form\FormInput::class, $text);
139 $this->assertInstanceOf(Field\File::class, $text);
140 }
141
142
143 public function testRender(): void
144 {
145 $f = $this->getFieldFactory();
146 $label = "label";
147 $byline = "byline";
148 $file_input = $f->file($this->getUploadHandler(), $label, $byline)->withNameFrom($this->name_source);
149
150 $expected = $this->getFormWrappedHtml(
151 'file-field-input',
152 $label,
153 '
154 <div class="ui-input-file">
155 <div class="ui-input-file-input-list">
156 <template>
157 <div class="ui-input-file-input">
158 <div class="ui-input-file-info"><span data-action="expand"></span><span
159 data-action="collapse"></span><span data-dz-name></span><span data-dz-size></span><span
160 data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span
161 class="ui-input-file-input-error-msg" data-dz-error-msg></span></div>
162 <div class="ui-input-file-metadata" style="display: none;"><input id="id_1" type="hidden"
163 name="name_0[input_0][]" value="" /></div>
164 <div class="ui-input-file-input-progress-container">
165 <div class="ui-input-file-input-progress-indicator"></div>
166 </div>
167 </div>
168 </template>
169 </div>
170 <div class="ui-input-file-input-dropzone">
171 <button type="button" class="btn btn-link" data-action="#" id="id_2">select_file_from_computer</button>
172 <span class="ui-input-file-input-error-msg" data-dz-error-msg></span>
173 </div>
174 <div class="help-block"> file_notice 0 B | ui_file_upload_max_nr 1</div>
175 </div>
176 ',
177 $byline,
178 null,
179 'id_3'
180 );
181 $this->assertEquals($expected, $this->renderInsideContainer($file_input));
182 }
183
184 public function testCommonRendering(): void
185 {
186 $f = $this->getFieldFactory();
187 $file_input = $f->file($this->getUploadHandler(), 'label', null)
188 ->withNameFrom($this->name_source);
189 $this->testWithError($file_input);
190 $this->testWithNoByline($file_input);
191 $this->testWithRequired($file_input);
192 $this->testWithDisabled($file_input);
193 $this->testWithAdditionalOnloadCodeRendersId($file_input);
194 }
195
196 public function testRenderValue(): void
197 {
198 $test_file_id = "test_file_id_1";
199 $test_file_name = "test file name 1";
200
201 $test_file_info = $this->createMock(FileInfoResult::class);
202 $test_file_info->method('getFileIdentifier')->willReturn("test_file_id_1");
203 $test_file_info->method('getName')->willReturn("test file name 1");
204 $test_file_info->method('getSize')->willReturn(1001);
205
206 $file_input = $this->getFieldFactory()->file(
207 $this->getUploadHandler($test_file_info),
208 "",
209 )->withValue([
210 $test_file_id,
211 ])->withNameFrom($this->name_source);
212
213 $expected = $this->getFormWrappedHtml(
214 'file-field-input',
215 '',
216 '
217 <div class="ui-input-file">
218 <div class="ui-input-file-input-list">
219 <div class="ui-input-file-input">
220 <div class="ui-input-file-info">
221 <span data-action="expand"></span>
222 <span data-action="collapse"></span>
223 <span data-dz-name>test file name 1</span>
224 <span data-dz-size>1 KB</span>
225 <span data-action="remove">
226 <button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button>
227 </span>
228 <span class="ui-input-file-input-error-msg" data-dz-error-msg></span>
229 </div>
230 <div class="ui-input-file-metadata" style="display: none;">
231 <input id="id_1" type="hidden" name="name_0[input_0][]" value="test_file_id_1"/>
232 </div>
233 <div class="ui-input-file-input-progress-container">
234 <div class="ui-input-file-input-progress-indicator"></div>
235 </div>
236 </div>
237 <template>
238 <div class="ui-input-file-input">
239 <div class="ui-input-file-info"><span data-action="expand"></span><span
240 data-action="collapse"></span><span data-dz-name></span><span data-dz-size></span><span
241 data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span
242 class="ui-input-file-input-error-msg" data-dz-error-msg></span></div>
243 <div class="ui-input-file-metadata" style="display: none;"><input id="id_2" type="hidden"
244 name="name_0[input_0][]" value="" /></div>
245 <div class="ui-input-file-input-progress-container">
246 <div class="ui-input-file-input-progress-indicator"></div>
247 </div>
248 </div>
249 </template>
250 </div>
251 <div class="ui-input-file-input-dropzone">
252 <button type="button" class="btn btn-link" data-action="#" id="id_3">select_file_from_computer</button>
253 <span class="ui-input-file-input-error-msg" data-dz-error-msg></span>
254 </div>
255 <div class="help-block"> file_notice 0 B | ui_file_upload_max_nr 1</div>
256 </div>
257 ',
258 null,
259 null,
260 'id_4'
261 );
262 $this->assertEquals($expected, $this->renderInsideContainer($file_input));
263 }
264
265
266 public function testRenderWithMetadata(): void
267 {
268 $factory = $this->getFieldFactory();
269 $label = 'file_input';
270 $metadata_input = $factory->text("text_input");
271 $file_input = $factory->file(
272 ($u = $this->getUploadHandler()),
273 $label,
274 null,
275 $metadata_input
276 )->withValue([
277 [
278 "file_id",
279 ""
280 ]
281 ])->withNameFrom($this->name_source);
282
283 $expected = $this->getFormWrappedHtml(
284 'file-field-input',
285 $label,
286 '
287 <div class="ui-input-file">
288 <div class="ui-input-file-input-list">
289 <div class="ui-input-file-input">
290 <div class="ui-input-file-info"><span data-action="expand"><button type="button" class="btn btn-link" aria-label="expand_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span></span></button></span><span data-action="collapse"><button type="button" class="btn btn-link" aria-label="collapse_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span></span></button></span><span data-dz-name></span><span
291 data-dz-size></span><span data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span class="ui-input-file-input-error-msg"
292 data-dz-error-msg></span></div>
293 <div class="ui-input-file-metadata" style="display: none;"><input id="id_1" type="hidden"
294 name="name_0[input_1][]" value="file_id" />
295 <fieldset class="c-input" data-il-ui-component="text-field-input"
296 data-il-ui-input-name="name_0[input_2][]"><label for="id_2">text_input</label>
297 <div class="c-input__field"><input id="id_2" type="text" name="name_0[input_2][]"
298 class="c-field-text" /></div>
299 </fieldset>
300 </div>
301 <div class="ui-input-file-input-progress-container">
302 <div class="ui-input-file-input-progress-indicator"></div>
303 </div>
304 </div><template>
305 <div class="ui-input-file-input">
306 <div class="ui-input-file-info"><span data-action="expand"><button type="button" class="btn btn-link" aria-label="expand_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span></span></button></span><span data-action="collapse"><button type="button" class="btn btn-link" aria-label="collapse_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span></span></button></span><span data-dz-name></span><span
307 data-dz-size></span><span data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span class="ui-input-file-input-error-msg"
308 data-dz-error-msg></span></div>
309 <div class="ui-input-file-metadata" style="display: none;"><input id="id_3" type="hidden"
310 name="name_0[input_1][]" value="" />
311 <fieldset class="c-input" data-il-ui-component="text-field-input"
312 data-il-ui-input-name="name_0[input_2][]"><label for="id_4">text_input</label>
313 <div class="c-input__field"><input id="id_4" type="text" name="name_0[input_2][]"
314 class="c-field-text" /></div>
315 </fieldset>
316 </div>
317 <div class="ui-input-file-input-progress-container">
318 <div class="ui-input-file-input-progress-indicator"></div>
319 </div>
320 </div>
321 </template>
322 </div>
323 <div class="ui-input-file-input-dropzone"><button type="button" class="btn btn-link" data-action="#"
324 id="id_5">select_file_from_computer</button><span class="ui-input-file-input-error-msg"
325 data-dz-error-msg></span></div>
326 <div class="help-block"> file_notice 0 B | ui_file_upload_max_nr 1</div>
327 </div>
328 ',
329 null,
330 null,
331 'id_6',
332 );
333 $this->assertEquals($expected, $this->renderInsideContainer($file_input));
334 }
335
336
337 public function testRenderWithMetadataValue(): void
338 {
339 $test_file_id = "test_file_id_1";
340 $test_file_name = "test file name 1";
341
342 $test_file_info = $this->createMock(FileInfoResult::class);
343 $test_file_info->method('getFileIdentifier')->willReturn("test_file_id_1");
344 $test_file_info->method('getName')->willReturn("test file name 1");
345 $test_file_info->method('getSize')->willReturn(1000 * 1000 + 1);
346
347 $factory = $this->getFieldFactory();
348 $label = 'file_input';
349 $metadata_input = $factory->text("text_input");
350 $file_input = $factory->file(
351 $u = $this->getUploadHandler($test_file_info),
352 $label,
353 null,
354 $metadata_input
355 )->withValue([
356 [
357 $test_file_id,
358 "test",
359 ]
360 ])->withNameFrom($this->name_source);
361
362
363 $expected = $this->getFormWrappedHtml(
364 'file-field-input',
365 $label,
366 '
367 <div class="ui-input-file">
368 <div class="ui-input-file-input-list">
369 <div class="ui-input-file-input">
370 <div class="ui-input-file-info"><span data-action="expand"><button type="button" class="btn btn-link" aria-label="expand_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span></span></button></span><span data-action="collapse"><button type="button" class="btn btn-link" aria-label="collapse_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span></span></button></span><span data-dz-name>test file name 1</span><span
371 data-dz-size>1 MB</span><span data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span class="ui-input-file-input-error-msg"
372 data-dz-error-msg></span></div>
373 <div class="ui-input-file-metadata" style="display: none;"><input id="id_1" type="hidden"
374 name="name_0[input_1][]" value="test_file_id_1" />
375 <fieldset class="c-input" data-il-ui-component="text-field-input"
376 data-il-ui-input-name="name_0[input_2][]"><label for="id_2">text_input</label>
377 <div class="c-input__field"><input id="id_2" type="text" value="test"
378 name="name_0[input_2][]" class="c-field-text" /></div>
379 </fieldset>
380 </div>
381 <div class="ui-input-file-input-progress-container">
382 <div class="ui-input-file-input-progress-indicator"></div>
383 </div>
384 </div><template>
385 <div class="ui-input-file-input">
386 <div class="ui-input-file-info"><span data-action="expand"><button type="button" class="btn btn-link" aria-label="expand_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-right" aria-hidden="true"></span></span></button></span><span data-action="collapse"><button type="button" class="btn btn-link" aria-label="collapse_content" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span></span></button></span><span data-dz-name></span><span
387 data-dz-size></span><span data-action="remove"><button type="button" class="btn btn-link" aria-label="close" data-action=""><span class="glyph" aria-hidden="true"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></button></span><span class="ui-input-file-input-error-msg"
388 data-dz-error-msg></span></div>
389 <div class="ui-input-file-metadata" style="display: none;"><input id="id_3" type="hidden"
390 name="name_0[input_1][]" value="" />
391 <fieldset class="c-input" data-il-ui-component="text-field-input"
392 data-il-ui-input-name="name_0[input_2][]"><label for="id_4">text_input</label>
393 <div class="c-input__field"><input id="id_4" type="text" name="name_0[input_2][]"
394 class="c-field-text" /></div>
395 </fieldset>
396 </div>
397 <div class="ui-input-file-input-progress-container">
398 <div class="ui-input-file-input-progress-indicator"></div>
399 </div>
400 </div>
401 </template>
402 </div>
403 <div class="ui-input-file-input-dropzone"><button type="button" class="btn btn-link" data-action="#"
404 id="id_5">select_file_from_computer</button><span class="ui-input-file-input-error-msg"
405 data-dz-error-msg></span></div>
406 <div class="help-block"> file_notice 0 B | ui_file_upload_max_nr 1</div>
407 </div>
408 ',
409 null,
410 null,
411 'id_6'
412 );
413 $this->assertEquals($expected, $this->renderInsideContainer($file_input));
414 }
415
416 protected function buildButtonFactory(): I\Button\Factory
417 {
418 return new I\Button\Factory();
419 }
420
421 protected function buildSymbolFactory(): I\Symbol\Factory
422 {
423 return new I\Symbol\Factory(
424 new I\Symbol\Icon\Factory(),
425 new I\Symbol\Glyph\Factory(),
426 new I\Symbol\Avatar\Factory()
427 );
428 }
429
431 {
433 $this->buildButtonFactory(),
434 $this->buildSymbolFactory()
435 );
436 }
437}
getUploadHandler(?FileInfoResult $file=null)
testImplementsFactoryInterface()
brutallyTrimHTML(string $html)
DefNamesource $name_source
Builds a Color from either hex- or rgb values.
Definition: Factory.php:31
Builds data types.
Definition: Factory.php:36
Definition: UI.php:24
Provides common functionality for UI tests.
Definition: Base.php:337
__construct(ButtonFactory $button_factory, SymbolFactory $symbol_factory)
This describes commonalities between all inputs.
Definition: Input.php:47
This describes a symbol.
Definition: Symbol.php:30
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Bulky.php:21
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Checkbox.php:21
Interface Observer \BackgroundTasks Contains several chained tasks and infos about them.
$text
Definition: xapiexit.php:21