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