ILIAS  release_8 Revision v8.24
StandardFormTest.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
21require_once(__DIR__ . "/../../../../../../libs/composer/vendor/autoload.php");
22require_once(__DIR__ . "/../../../../Base.php");
23require_once(__DIR__ . "/FormTest.php");
24
26use ILIAS\Data;
29use Psr\Http\Message\ServerRequestInterface;
32
34{
36
38 {
39 $this->button_factory = $button_factory;
40 }
41
42 public function button(): Factory
43 {
45 }
46}
47
49{
50 public int $count = 0;
51
52 public function getNewName(): string
53 {
54 $name = "input_{$this->count}";
55 $this->count++;
56
57 return $name;
58 }
59
60 public function getNewDedicatedName(string $dedicated_name): string
61 {
62 $name = $dedicated_name . "_{$this->count}";
63 $this->count++;
64
65 return $name;
66 }
67}
68
73{
74 protected function buildFactory(): I\Input\Container\Form\Factory
75 {
76 return new I\Input\Container\Form\Factory($this->buildInputFactory());
77 }
78
79 protected function buildInputFactory(): I\Input\Field\Factory
80 {
81 $df = new Data\Factory();
82 $language = $this->createMock(ilLanguage::class);
83 return new I\Input\Field\Factory(
84 $this->createMock(\ILIAS\UI\Implementation\Component\Input\UploadLimitResolver::class),
85 new SignalGenerator(),
86 $df,
87 new \ILIAS\Refinery\Factory($df, $language),
88 $language
89 );
90 }
91
92 protected function buildButtonFactory(): I\Button\Factory
93 {
94 return new I\Button\Factory();
95 }
96
98 {
99 return new WithButtonNoUIFactory($this->buildButtonFactory());
100 }
101
102 public function test_getPostURL(): void
103 {
104 $f = $this->buildFactory();
105 $if = $this->buildInputFactory();
106 $url = "MY_URL";
107 $form = $f->standard($url, [$if->text("label")]);
108 $this->assertEquals($url, $form->getPostURL());
109 }
110
111 public function test_render(): void
112 {
113 $f = $this->buildFactory();
114 $if = $this->buildInputFactory();
115
116 $url = "MY_URL";
117 $form = $f->standard($url, [
118 $if->text("label", "byline"),
119 ]);
120
121 $r = $this->getDefaultRenderer();
122 $html = $this->brutallyTrimHTML($r->render($form));
123
124 $expected = $this->brutallyTrimHTML('
125<form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" action="MY_URL" method="post" novalidate="novalidate">
126 <div class="il-standard-form-header clearfix">
127 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
128 </div>
129 <div class="form-group row">
130 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label</label>
131 <div class="col-sm-8 col-md-9 col-lg-10">
132 <input id="id_1" type="text" name="form/input_0" class="form-control form-control-sm"/>
133 <div class="help-block">byline</div>
134 </div>
135 </div>
136 <div class="il-standard-form-footer clearfix">
137 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
138 </div>
139</form>
140 ');
141 $this->assertHTMLEquals($expected, $html);
142 }
143
144 public function test_submit_caption(): void
145 {
146 $f = $this->buildFactory();
147 $if = $this->buildInputFactory();
148
149 $url = "MY_URL";
150 $form = $f->standard($url, [
151 $if->text("label", "byline"),
152 ]);
153
154 $this->assertNull($form->getSubmitCaption());
155
156 $caption = 'Caption';
157 $form = $form->withSubmitCaption($caption);
158
159 $this->assertEquals($caption, $form->getSubmitCaption());
160 }
161
162 public function test_submit_caption_render(): void
163 {
164 $f = $this->buildFactory();
165 $if = $this->buildInputFactory();
166
167 $url = "MY_URL";
168 $form = $f->standard($url, [
169 $if->text("label", "byline"),
170 ])->withSubmitCaption('create');
171
172 $r = $this->getDefaultRenderer();
173 $html = $this->brutallyTrimHTML($r->render($form));
174
175 $expected = $this->brutallyTrimHTML('
176<form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" action="MY_URL" method="post" novalidate="novalidate">
177 <div class="il-standard-form-header clearfix">
178 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">create</button></div>
179 </div>
180 <div class="form-group row">
181 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label</label>
182 <div class="col-sm-8 col-md-9 col-lg-10">
183 <input id="id_1" type="text" name="form/input_0" class="form-control form-control-sm"/>
184 <div class="help-block">byline</div>
185 </div>
186 </div>
187 <div class="il-standard-form-footer clearfix">
188 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">create</button></div>
189 </div>
190</form>
191 ');
192 $this->assertHTMLEquals($expected, $html);
193 }
194
195 public function test_render_no_url(): void
196 {
197 $f = $this->buildFactory();
198 $if = $this->buildInputFactory();
199
200 $url = "";
201 $form = $f->standard($url, [
202 $if->text("label", "byline"),
203 ]);
204
205 $r = $this->getDefaultRenderer();
206 $html = $this->brutallyTrimHTML($r->render($form));
207
208 $expected = $this->brutallyTrimHTML('
209<form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" method="post" novalidate="novalidate">
210 <div class="il-standard-form-header clearfix">
211 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
212 </div>
213 <div class="form-group row">
214 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label</label>
215 <div class="col-sm-8 col-md-9 col-lg-10">
216 <input id="id_1" type="text" name="form/input_0" class="form-control form-control-sm"/>
217 <div class="help-block">byline</div>
218 </div>
219 </div>
220 <div class="il-standard-form-footer clearfix">
221 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
222 </div>
223</form>
224 ');
225 $this->assertHTMLEquals($expected, $html);
226 }
227
228
229 public function testRenderWithErrorOnField(): void
230 {
231 $r = $this->getDefaultRenderer();
232 $df = new Data\Factory();
233 $language = $this->createMock(\ilLanguage::class);
234 $language
235 ->expects($this->once())
236 ->method("txt")
237 ->willReturn('testing error message');
238
239 $refinery = new \ILIAS\Refinery\Factory($df, $language);
240
242 $this->createMock(\ILIAS\UI\Implementation\Component\Input\UploadLimitResolver::class),
243 new SignalGenerator(),
244 $df,
245 $refinery,
246 $language
247 );
248
249 $fail = $refinery->custom()->constraint(function ($v) {
250 return false;
251 }, "This is invalid...");
252 $input = $if->text("label", "byline");
253
254 $input = $input->withAdditionalTransformation($fail);
255
256 $form = new Form\Standard($if, new InputNameSource(), '', [$input]);
257
258 $request = $this->createMock(ServerRequestInterface::class);
259 $request
260 ->expects($this->once())
261 ->method("getParsedBody")
262 ->willReturn([
263 'form_0/input_1' => ''
264 ]);
265
266 $form = $form->withRequest($request);
267 $this->assertNull($form->getData());
268
269 $html = $this->brutallyTrimHTML($r->render($form));
270 $expected = $this->brutallyTrimHTML('
271 <form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" method="post" novalidate="novalidate">
272 <div class="il-standard-form-header clearfix">
273 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
274 </div>
275
276 <div class="help-block alert alert-danger" role="alert">testing error message</div>
277
278 <div class="form-group row">
279 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label</label>
280 <div class="col-sm-8 col-md-9 col-lg-10">
281 <div class="help-block alert alert-danger" aria-describedby="id_1" role="alert">This is invalid...</div>
282 <input id="id_1" type="text" name="form_0/input_1" class="form-control form-control-sm" />
283 <div class="help-block">byline</div>
284 </div>
285 </div>
286 <div class="il-standard-form-footer clearfix">
287 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
288 </div>
289 </form>
290 ');
291 $this->assertHTMLEquals($expected, $html);
292 }
293
294
295 public function testRenderWithErrorOnForm(): void
296 {
297 $r = $this->getDefaultRenderer();
298 $df = new Data\Factory();
299 $language = $this->createMock(\ilLanguage::class);
300 $refinery = new \ILIAS\Refinery\Factory($df, $language);
301
303 $this->createMock(\ILIAS\UI\Implementation\Component\Input\UploadLimitResolver::class),
304 new SignalGenerator(),
305 $df,
306 $refinery,
307 $language
308 );
309
310 $fail = $refinery->custom()->constraint(function ($v) {
311 return false;
312 }, "This is a fail on form.");
313 $input = $if->text("label", "byline");
314
315 $form = new Form\Standard($if, new InputNameSource(), '', [$input]);
316 $form = $form->withAdditionalTransformation($fail);
317
318 $request = $this->createMock(ServerRequestInterface::class);
319 $request
320 ->expects($this->once())
321 ->method("getParsedBody")
322 ->willReturn([
323 'form_0/input_1' => ''
324 ]);
325
326 $form = $form->withRequest($request);
327 $this->assertNull($form->getData());
328
329 $html = $this->brutallyTrimHTML($r->render($form));
330 $expected = $this->brutallyTrimHTML('
331 <form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" method="post" novalidate="novalidate">
332 <div class="il-standard-form-header clearfix">
333 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
334 </div>
335
336 <div class="help-block alert alert-danger" role="alert">This is a fail on form.</div>
337
338 <div class="form-group row">
339 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label</label>
340 <div class="col-sm-8 col-md-9 col-lg-10">
341 <input id="id_1" type="text" name="form_0/input_1" class="form-control form-control-sm" />
342 <div class="help-block">byline</div>
343 </div>
344 </div>
345 <div class="il-standard-form-footer clearfix">
346 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
347 </div>
348 </form>
349 ');
350 $this->assertHTMLEquals($expected, $html);
351 }
352
354 {
355 $f = $this->buildFactory();
356 $if = $this->buildInputFactory();
357
358 $url = "MY_URL";
359 $form = $f->standard($url, [$if->text("label", "byline")->withRequired(true)]);
360
361 $r = $this->getDefaultRenderer();
362 $html = $this->brutallyTrimHTML($r->render($form));
363
364 $expected = $this->brutallyTrimHTML('
365<form role="form" class="il-standard-form form-horizontal" enctype="multipart/form-data" action="MY_URL" method="post" novalidate="novalidate">
366 <div class="il-standard-form-header clearfix">
367 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
368 </div>
369 <div class="form-group row">
370 <label for="id_1" class="control-label col-sm-4 col-md-3 col-lg-2">label<span class="asterisk">*</span></label>
371 <div class="col-sm-8 col-md-9 col-lg-10">
372 <input id="id_1" type="text" name="form/input_0" class="form-control form-control-sm"/>
373 <div class="help-block">byline</div>
374 </div>
375 </div>
376 <div class="il-standard-form-footer clearfix">
377 <span class="asterisk">*</span><span class="small"> required_field</span>
378 </div>
379 <div class="il-standard-form-footer clearfix">
380 <div class="il-standard-form-cmd"><button class="btn btn-default" data-action="">save</button></div>
381 </div>
382</form>
383 ');
384 $this->assertHTMLEquals($expected, $html);
385 }
386}
Builds a Color from either hex- or rgb values.
Definition: Factory.php:17
Factory for Date Formats.
Definition: Factory.php:27
Builds data types.
Definition: Factory.php:21
This implements commonalities between all forms.
Definition: Container.php:34
This implements commonalities between all forms.
Definition: Form.php:34
Provides common functionality for UI tests.
Definition: Base.php:299
assertHTMLEquals(string $expected_html_as_string, string $html_as_string)
Definition: Base.php:427
brutallyTrimHTML(string $html)
A more radical version of normalizeHTML.
Definition: Base.php:444
getDefaultRenderer(JavaScriptBinding $js_binding=null, array $with_stub_renderings=[])
Definition: Base.php:355
getNewName()
Generates a unique name on every call.
getNewDedicatedName(string $dedicated_name)
Test on standard form implementation.
__construct(Factory $button_factory)
This describes commonalities between all inputs.
Definition: Input.php:49
Describes a source for input names.
Definition: NameSource.php:27
if($format !==null) $name
Definition: metadata.php:247
Refinery Factory $refinery
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...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Factory.php:21
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ChatMainBarProvider \MainMenu\Provider.
Class Factory.
$url