ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
MarkdownTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
36 
37 require_once(__DIR__ . "/../../../../../libs/composer/vendor/autoload.php");
38 require_once(__DIR__ . "/../../../Base.php");
39 require_once(__DIR__ . "/InputTest.php");
40 
45 {
46  protected const TEST_ASYNC_URL = 'https://localhost';
47  protected const TEST_PARAMETER_NAME = 'preview';
48 
52 
53  protected ViewControlMode $view_control_mock;
60 
61  public function setUp(): void
62  {
63  $this->markdown_renderer = $this->getMarkdownRendererMock();
64  $this->factory = $this->buildMinimalFieldFactory();
65  $this->name_source = new DefNamesource();
66 
67  $this->view_control_mock = $this->getViewControlModeStub();
68  $this->numberedlist_glyph_mock = $this->getGlyphStub('numberedlist');
69  $this->bulledpoint_glyph_mock = $this->getGlyphStub('bulletpoint');
70  $this->header_glyph_mock = $this->getGlyphStub('header');
71  $this->italic_glyph_mock = $this->getGlyphStub('italic');
72  $this->link_glyph_mock = $this->getGlyphStub('link');
73  $this->bold_glyph_mock = $this->getGlyphStub('bold');
74 
75  parent::setUp();
76  }
77 
86  public function getUIFactory(): NoUIFactory
87  {
88  return new class (
90  $this->buildButtonFactory(),
91  $this->getSymbolFactoryMock(),
92  ) extends NoUIFactory {
93  protected ViewControlFactory $view_control_factory;
94  protected ButtonFactory $button_factory;
95  protected SymbolFactory $symbol_factory;
96 
97  public function __construct(
98  ViewControlFactory $view_control_factory,
99  ButtonFactory $button_factory,
100  SymbolFactory $symbol_factory,
101  ) {
102  $this->view_control_factory = $view_control_factory;
103  $this->button_factory = $button_factory;
104  $this->symbol_factory = $symbol_factory;
105  }
106 
107  public function viewControl(): ViewControlFactory
108  {
109  return $this->view_control_factory;
110  }
111 
112  public function button(): ButtonFactory
113  {
114  return $this->button_factory;
115  }
116 
117  public function symbol(): SymbolFactory
118  {
119  return $this->symbol_factory;
120  }
121  };
122  }
123 
124  public function testRender(): void
125  {
126  $label = 'test_label';
127 
128  $input = $this->factory->markdown($this->markdown_renderer, $label)->withNameFrom($this->name_source);
129 
130  $expected = $this->brutallyTrimHTML(
131  "
132  <div class=\"form-group row\">
133  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label</label>
134  <div class=\"col-sm-8 col-md-9 col-lg-10\">
135  <div class=\"c-input-markdown\">
136  <div class=\"c-input-markdown__controls\">
137  view_control_mode
138  <div class=\"c-input-markdown__actions\">
139  <span data-action=\"insert-heading\">
140  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_2\">header</button>
141  </span>
142  <span data-action=\"insert-link\">
143  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_3\">link</button>
144  </span>
145  <span data-action=\"insert-bold\">
146  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_4\">bold</button>
147  </span>
148  <span data-action=\"insert-italic\">
149  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_5\">italic</button>
150  </span>
151  <span data-action=\"insert-bullet-points\">
152  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_7\">bulletpoint</button>
153  </span>
154  <span data-action=\"insert-enumeration\">
155  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_6\">numberedlist</button>
156  </span>
157  </div>
158  </div>
159  <div class=\"ui-input-textarea\">
160  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\"></textarea>
161  </div>
162  <div class=\"c-input-markdown__preview hidden\">
163  </div>
164  </div>
165  </div>
166  </div>
167  "
168  );
169 
170  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
171 
172  $this->assertEquals($expected, $html);
173  }
174 
175  public function testRenderWithByline(): void
176  {
177  $label = 'test_label';
178  $byline = 'test_byline';
179 
180  $input = $this->factory->markdown(
181  $this->markdown_renderer,
182  $label,
183  $byline
184  )->withNameFrom($this->name_source);
185 
186  $expected = $this->brutallyTrimHTML(
187  "
188  <div class=\"form-group row\">
189  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label</label>
190  <div class=\"col-sm-8 col-md-9 col-lg-10\">
191  <div class=\"c-input-markdown\">
192  <div class=\"c-input-markdown__controls\">
193  view_control_mode
194  <div class=\"c-input-markdown__actions\">
195  <span data-action=\"insert-heading\">
196  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_2\">header</button>
197  </span>
198  <span data-action=\"insert-link\">
199  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_3\">link</button>
200  </span>
201  <span data-action=\"insert-bold\">
202  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_4\">bold</button>
203  </span>
204  <span data-action=\"insert-italic\">
205  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_5\">italic</button>
206  </span>
207  <span data-action=\"insert-bullet-points\">
208  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_7\">bulletpoint</button>
209  </span>
210  <span data-action=\"insert-enumeration\">
211  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_6\">numberedlist</button>
212  </span>
213  </div>
214  </div>
215  <div class=\"ui-input-textarea\">
216  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\"></textarea>
217  </div>
218  <div class=\"c-input-markdown__preview hidden\">
219  </div>
220  </div>
221  <div class=\"help-block\">$byline</div>
222  </div>
223  </div>
224  "
225  );
226 
227  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
228 
229  $this->assertEquals($expected, $html);
230  }
231 
232  public function testRenderWithLimits(): void
233  {
234  $label = 'test_label';
235  $byline = 'test_byline';
236  $min = 1;
237  $max = 9;
238 
239  $input = $this->factory->markdown(
240  $this->markdown_renderer,
241  $label,
242  $byline
243  )->withMinLimit($min)->withMaxLimit($max)->withNameFrom($this->name_source);
244 
245  $expected = $this->brutallyTrimHTML(
246  "
247  <div class=\"form-group row\">
248  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label</label>
249  <div class=\"col-sm-8 col-md-9 col-lg-10\">
250  <div class=\"c-input-markdown\">
251  <div class=\"c-input-markdown__controls\">
252  view_control_mode
253  <div class=\"c-input-markdown__actions\">
254  <span data-action=\"insert-heading\">
255  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_2\">header</button>
256  </span>
257  <span data-action=\"insert-link\">
258  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_3\">link</button>
259  </span>
260  <span data-action=\"insert-bold\">
261  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_4\">bold</button>
262  </span>
263  <span data-action=\"insert-italic\">
264  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_5\">italic</button>
265  </span>
266  <span data-action=\"insert-bullet-points\">
267  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_7\">bulletpoint</button>
268  </span>
269  <span data-action=\"insert-enumeration\">
270  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_6\">numberedlist</button>
271  </span>
272  </div>
273  </div>
274  <div class=\"ui-input-textarea\">
275  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\" minlength=\"$min\" maxlength=\"$max\"></textarea>
276  <div class=\"ui-input-textarea-remainder\"> ui_chars_remaining<span data-action=\"remainder\">$max</span></div>
277  </div>
278  <div class=\"c-input-markdown__preview hidden\">
279  </div>
280  </div>
281  <div class=\"help-block\">$byline</div>
282  </div>
283  </div>
284  "
285  );
286 
287  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
288 
289  $this->assertEquals($expected, $html);
290  }
291 
292  public function testRenderWithDisabled(): void
293  {
294  $label = 'test_label';
295  $byline = 'test_byline';
296 
297  $input = $this->factory->markdown(
298  $this->markdown_renderer,
299  $label,
300  $byline
301  )->withDisabled(true)->withNameFrom($this->name_source);
302 
303  $expected = $this->brutallyTrimHTML(
304  "
305  <div class=\"form-group row\">
306  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label</label>
307  <div class=\"col-sm-8 col-md-9 col-lg-10\">
308  <div class=\"c-input-markdown\">
309  <div class=\"c-input-markdown__controls\">
310  view_control_mode
311  <div class=\"c-input-markdown__actions\">
312  <span data-action=\"insert-heading\">
313  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">header</button>
314  </span>
315  <span data-action=\"insert-link\">
316  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">link</button>
317  </span>
318  <span data-action=\"insert-bold\">
319  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">bold</button>
320  </span>
321  <span data-action=\"insert-italic\">
322  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">italic</button>
323  </span>
324  <span data-action=\"insert-bullet-points\">
325  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">bulletpoint</button>
326  </span>
327  <span data-action=\"insert-enumeration\">
328  <button class=\"btn btn-default\" data-action=\"#\" disabled=\"disabled\">numberedlist</button>
329  </span>
330  </div>
331  </div>
332  <div class=\"ui-input-textarea\">
333  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\" disabled=\"disabled\"></textarea>
334  </div>
335  <div class=\"c-input-markdown__preview hidden\">
336  </div>
337  </div>
338  <div class=\"help-block\">$byline</div>
339  </div>
340  </div>
341  "
342  );
343 
344  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
345 
346  $this->assertEquals($expected, $html);
347  }
348 
349  public function testRenderWithRequired(): void
350  {
351  $label = 'test_label';
352  $byline = 'test_byline';
353 
354  $input = $this->factory->markdown(
355  $this->markdown_renderer,
356  $label,
357  $byline
358  )->withRequired(true)->withNameFrom($this->name_source);
359 
360  $expected = $this->brutallyTrimHTML(
361  "
362  <div class=\"form-group row\">
363  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label<span class=\"asterisk\">*</span></label>
364  <div class=\"col-sm-8 col-md-9 col-lg-10\">
365  <div class=\"c-input-markdown\">
366  <div class=\"c-input-markdown__controls\">
367  view_control_mode
368  <div class=\"c-input-markdown__actions\">
369  <span data-action=\"insert-heading\">
370  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_2\">header</button>
371  </span>
372  <span data-action=\"insert-link\">
373  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_3\">link</button>
374  </span>
375  <span data-action=\"insert-bold\">
376  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_4\">bold</button>
377  </span>
378  <span data-action=\"insert-italic\">
379  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_5\">italic</button>
380  </span>
381  <span data-action=\"insert-bullet-points\">
382  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_7\">bulletpoint</button>
383  </span>
384  <span data-action=\"insert-enumeration\">
385  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_6\">numberedlist</button>
386  </span>
387  </div>
388  </div>
389  <div class=\"ui-input-textarea\">
390  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\"></textarea>
391  </div>
392  <div class=\"c-input-markdown__preview hidden\">
393  </div>
394  </div>
395  <div class=\"help-block\">$byline</div>
396  </div>
397  </div>
398  "
399  );
400 
401  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
402 
403  $this->assertEquals($expected, $html);
404  }
405 
406  public function testRenderWithError(): void
407  {
408  $label = 'test_label';
409  $byline = 'test_byline';
410  $error = 'test_error';
411 
412  $input = $this->factory->markdown(
413  $this->markdown_renderer,
414  $label,
415  $byline
416  )->withError($error)->withNameFrom($this->name_source);
417 
418  $expected = $this->brutallyTrimHTML(
419  "
420  <div class=\"form-group row\">
421  <label for=\"id_1\" class=\"control-label col-sm-4 col-md-3 col-lg-2\">$label</label>
422  <div class=\"col-sm-8 col-md-9 col-lg-10\">
423  <div class=\"help-block alert alert-danger\" aria-describedby=\"id_1\" role=\"alert\">$error</div>
424  <div class=\"c-input-markdown\">
425  <div class=\"c-input-markdown__controls\">
426  view_control_mode
427  <div class=\"c-input-markdown__actions\">
428  <span data-action=\"insert-heading\">
429  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_2\">header</button>
430  </span>
431  <span data-action=\"insert-link\">
432  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_3\">link</button>
433  </span>
434  <span data-action=\"insert-bold\">
435  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_4\">bold</button>
436  </span>
437  <span data-action=\"insert-italic\">
438  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_5\">italic</button>
439  </span>
440  <span data-action=\"insert-bullet-points\">
441  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_7\">bulletpoint</button>
442  </span>
443  <span data-action=\"insert-enumeration\">
444  <button class=\"btn btn-default\" data-action=\"#\" id=\"id_6\">numberedlist</button>
445  </span>
446  </div>
447  </div>
448  <div class=\"ui-input-textarea\">
449  <textarea id=\"id_1\" class=\"form-control form-control-sm\" name=\"name_0\"></textarea>
450  </div>
451  <div class=\"c-input-markdown__preview hidden\">
452  </div>
453  </div>
454  <div class=\"help-block\">$byline</div>
455  </div>
456  </div>
457  "
458  );
459 
460  $html = $this->brutallyTrimHTML($this->getRendererWithStubs()->render($input));
461 
462  $this->assertEquals($expected, $html);
463  }
464 
466  {
467  return $this->getDefaultRenderer(null, [
468  $this->view_control_mock,
469  $this->header_glyph_mock,
470  $this->italic_glyph_mock,
471  $this->bold_glyph_mock,
472  $this->link_glyph_mock,
473  $this->numberedlist_glyph_mock,
474  $this->bulledpoint_glyph_mock,
475  ]);
476  }
477 
479  {
480  return new FieldFactory(
481  $this->createMock(UploadLimitResolver::class),
482  new SignalGenerator(),
483  $this->createMock(DataFactory::class),
484  $this->createMock(Refinery::class),
485  $this->getLanguage()
486  );
487  }
488 
489  protected function buildButtonFactory(): ButtonFactory
490  {
491  return new ButtonFactory();
492  }
493 
495  {
496  $markdown_renderer = $this->createMock(MarkdownRenderer::class);
497  $markdown_renderer->method('getAsyncUrl')->willReturn(self::TEST_ASYNC_URL);
498  $markdown_renderer->method('getParameterName')->willReturn(self::TEST_PARAMETER_NAME);
499  $markdown_renderer->method('render')->willReturnCallback(
500  static function ($value) {
501  return $value;
502  }
503  );
504 
505  return $markdown_renderer;
506  }
507 
508  protected function getSymbolFactoryMock(): SymbolFactory
509  {
510  $glyph_factory = $this->createMock(GlyphFactory::class);
511  $glyph_factory->method('header')->willReturn($this->header_glyph_mock);
512  $glyph_factory->method('italic')->willReturn($this->italic_glyph_mock);
513  $glyph_factory->method('bold')->willReturn($this->bold_glyph_mock);
514  $glyph_factory->method('link')->willReturn($this->link_glyph_mock);
515  $glyph_factory->method('numberedlist')->willReturn($this->numberedlist_glyph_mock);
516  $glyph_factory->method('bulletlist')->willReturn($this->bulledpoint_glyph_mock);
517 
518  $symbol_factory = $this->createMock(SymbolFactory::class);
519  $symbol_factory->method('glyph')->willReturn($glyph_factory);
520 
521  return $symbol_factory;
522  }
523 
525  {
526  $view_control_factory = $this->createMock(ViewControlFactory::class);
527  $view_control_factory->method('mode')->willReturn($this->getViewControlModeStub());
528 
529  return $view_control_factory;
530  }
531 
532  protected function getViewControlModeStub(): ViewControlMode
533  {
534  $view_control = $this->createMock(ViewControlMode::class);
535  $view_control->method('getCanonicalName')->willReturn('view_control_mode');
536 
537  return $view_control;
538  }
539 
540  protected function getGlyphStub(string $name): Glyph
541  {
542  $glyph = $this->createMock(Glyph::class);
543  $glyph->method('getCanonicalName')->willReturn($name);
544  // will be called in the rendering process of this input.
545  $glyph->method('withUnavailableAction')->willReturnSelf();
546 
547  return $glyph;
548  }
549 }
const TEST_ASYNC_URL
getDefaultRenderer(JavaScriptBinding $js_binding=null, array $with_stub_renderings=[])
Definition: Base.php:377
button(string $caption, string $cmd)
getUIFactory()
The rendering of this input requires actual or minimal instances of:
Glyph $header_glyph_mock
Glyph $bulledpoint_glyph_mock
DefNamesource $name_source
brutallyTrimHTML(string $html)
A more radical version of normalizeHTML.
Definition: Base.php:475
Glyph $link_glyph_mock
ViewControlMode $view_control_mock
buildMinimalFieldFactory()
Glyph $numberedlist_glyph_mock
Glyph $bold_glyph_mock
getViewControlFactoryMock()
__construct(VocabulariesInterface $vocabularies)
Provides common functionality for UI tests.
Definition: Base.php:310
This is how the factory for UI elements looks.
Definition: Factory.php:37
FieldFactory $factory
const TEST_PARAMETER_NAME
getGlyphStub(string $name)
Glyph $italic_glyph_mock
MarkdownRenderer $markdown_renderer