ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
LauncherInlineTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 require_once(__DIR__ . "/../../../../../../vendor/composer/vendor/autoload.php");
22 require_once(__DIR__ . "/../../Base.php");
23 
24 use ILIAS\UI\Component as C;
26 use ILIAS\Data\URI;
28 
30 {
33 
34  public function setUp(): void
35  {
36  $this->df = new \ILIAS\Data\Factory();
37  }
38 
39  protected function getInputFactory(): I\Input\Field\Factory
40  {
41  $this->language = $this->createMock(ILIAS\Language\Language::class);
42  return new I\Input\Field\Factory(
43  $this->createMock(I\Input\UploadLimitResolver::class),
44  new I\SignalGenerator(),
45  $this->df,
46  new Refinery($this->df, $this->language),
47  $this->language
48  );
49  }
50 
51  protected function getModalFactory(): I\Modal\Factory
52  {
53  return new I\Modal\Factory(
54  new I\SignalGenerator(),
55  new I\Modal\InterruptiveItem\Factory(),
56  $this->getInputFactory()
57  );
58  }
59 
60  protected function getIconFactory(): I\Symbol\Icon\Factory
61  {
62  return new I\Symbol\Icon\Factory();
63  }
64 
65  public function getUIFactory(): NoUIFactory
66  {
67  $factory = new class () extends NoUIFactory {
68  public I\SignalGenerator $sig_gen;
69  public I\Input\Field\Factory $input_factory;
70 
71  public function button(): C\Button\Factory
72  {
73  return new I\Button\Factory(
74  $this->sig_gen
75  );
76  }
77  public function symbol(): C\Symbol\Factory
78  {
79  return new I\Symbol\Factory(
80  new I\Symbol\Icon\Factory(),
81  new I\Symbol\Glyph\Factory(),
82  new I\Symbol\Avatar\Factory()
83  );
84  }
85  public function modal(): C\Modal\Factory
86  {
87  return new I\Modal\Factory(
88  $this->sig_gen,
89  new I\Modal\InterruptiveItem\Factory(),
90  $this->input_factory
91  );
92  }
93  };
94  $factory->sig_gen = new I\SignalGenerator();
95  $factory->input_factory = $this->getInputFactory();
96  return $factory;
97  }
98 
99  protected function getURI(): URI
100  {
101  return $this->df->uri('http://localhost/ilias.php');
102  }
103 
104  protected function getLauncher(): I\Launcher\Inline
105  {
106  $target = $this->df->link('LaunchSomething', $this->getURI());
107  return new I\Launcher\Inline(
108  $this->getModalFactory(),
109  $target
110  );
111  }
112 
116  protected function getMessageBox(): array
117  {
118  $html = sha1(C\MessageBox\MessageBox::class);
119  $stub = $this->createMock(C\MessageBox\MessageBox::class);
120  $stub->method('getCanonicalName')->willReturn($html);
121 
122  return [$stub, $html];
123  }
124 
125  public function testLauncherInlineConstruction(): void
126  {
127  $l = $this->getLauncher();
128  $this->assertInstanceOf(C\Launcher\Inline::class, $l);
129  $this->assertEquals($this->df->link('LaunchSomething', $this->getURI()), $l->getTarget());
130  $this->assertEquals('LaunchSomething', $l->getButtonLabel());
131  $this->assertTrue($l->isLaunchable());
132  $this->assertNull($l->getStatusIcon());
133  $this->assertNull($l->getStatusMessageBox());
134  $this->assertNull($l->getModal());
135  $this->assertNull($l->getModalSubmitLabel());
136  $this->assertNull($l->getModalCancelLabel());
137  }
138 
139  public function testLauncherInlineBasicModifier(): void
140  {
141  [$msg] = $this->getMessageBox();
142  $icon = $this->getIconFactory()->standard('course', 'some icon');
143  $some_submit_label = 'some submit label';
144  $some_cancel_label = 'some cancel label';
145  $l = $this->getLauncher()
146  ->withDescription('some description')
147  ->withButtonLabel('different label', false)
148  ->withStatusMessageBox($msg)
149  ->withStatusIcon($icon)
150  ->withModalSubmitLabel($some_submit_label)
151  ->withModalCancelLabel($some_cancel_label)
152  ;
153 
154  $this->assertEquals($this->df->link('LaunchSomething', $this->getURI()), $l->getTarget());
155  $this->assertEquals('different label', $l->getButtonLabel());
156  $this->assertfalse($l->isLaunchable());
157  $this->assertEquals($msg, $l->getStatusMessageBox());
158  $this->assertEquals($icon, $l->getStatusIcon());
159  $this->assertNull($l->getModal());
160  $this->assertEquals($l->getModalSubmitLabel(), $some_submit_label);
161  $this->assertEquals($l->getModalCancelLabel(), $some_cancel_label);
162  }
163 
164  public function testLauncherInlineWithFields(): void
165  {
166  $ff = $this->getInputFactory();
167  $field = $ff->checkbox('Understood', 'ok');
168  $group = $ff->group([$field]);
169  $evaluation = fn(Result $result, Launcher & $launcher) => true;
170  [$instruction] = $this->getMessageBox();
171  $l = $this->getLauncher()
172  ->withInputs($group, $evaluation, $instruction);
173 
174  $this->assertEquals($evaluation, $l->getEvaluation());
175  $this->assertInstanceOf(C\Modal\Roundtrip::class, $l->getModal());
176 
177  $this->assertEquals(
178  $instruction,
179  $l->getModal()->getContent()[0]
180  );
181 
182  $ns = new class () extends I\Input\FormInputNameSource {
183  public function getNewName(): string
184  {
185  return 'form/input_0';
186  }
187  };
188  $this->assertEquals(
189  [$field->withNameFrom($ns)],
190  $l->getModal()->getInputs()
191  );
192  }
193 
194  public function testLauncherInlineRendering(): void
195  {
196  $ff = $this->getInputFactory();
197  $group = $ff->group([$ff->checkbox('Understood', 'ok')]);
198  $evaluation = fn(Result $result, Launcher & $launcher) => true;
199  [$msg, $msg_html] = $this->getMessageBox();
200  $icon = $this->getIconFactory()->standard('course', 'some icon');
201 
202  $l = $this->getLauncher()
203  ->withDescription('some description')
204  ->withButtonLabel('different label', false)
205  ->withStatusMessageBox($msg)
206  ->withStatusIcon($icon)
207  ->withInputs($group, $evaluation, $msg)
208  ->withModalSubmitLabel('some submit label')
209  ->withModalCancelLabel('some cancel label')
210  ;
211 
212  $expected = <<<EXP
213 <div class="c-launcher c-launcher--inline">
214  <div class="c-launcher__status">
215  <div class="c-launcher__status__message">$msg_html
216  </div>
217  <div class="c-launcher__status__icon"><img class="icon course small" src="./assets/images/standard/icon_default.svg" alt="some icon"/></div>
218  </div>
219  <div class="c-launcher__description">
220  some description
221  </div>
222  <button class="btn btn-bulky" id="id_5" disabled="disabled"><span class="glyph" role="img"><span class="glyphicon glyphicon-launch" aria-hidden="true"></span></span><span class="bulky-label">different label</span></button>
223  <div class="c-launcher__form">
224  <dialog class="c-modal il-modal-roundtrip" tabindex="-1" id="id_1">
225  <div class="modal-dialog" role="document" data-replace-marker="component">
226  <div class="modal-content">
227  <div class="modal-header">
228  <form><button formmethod="dialog" class="close" aria-label="close"><span aria-hidden="true">&times;</span></button></form>
229  <h1 class="modal-title">different label</h1>
230  </div>
231  <div class="modal-body">$msg_html
232  <form id="id_3" class="c-form c-form--horizontal" enctype="multipart/form-data" action="http://localhost/ilias.php" method="post">
233  <fieldset class="c-input" data-il-ui-component="checkbox-field-input" data-il-ui-input-name="form/input_0">
234  <label for="id_2">Understood</label>
235  <div class="c-input__field">
236  <input type="checkbox" id="id_2" value="checked" name="form/input_0" class="c-field-checkbox" />
237  </div>
238  <div class="c-input__help-byline">ok</div>
239  </fieldset>
240  </form>
241  </div>
242  <div class="modal-footer">
243  <form>
244  <button class="btn btn-default" id="id_4">some submit label</button>
245  <button formmethod="dialog" class="btn btn-default" data-dismiss="modal">some cancel label</button>
246  </form>
247  </div>
248  </div>
249  </div>
250  </dialog>
251  </div>
252 </div>
253 EXP;
254  $r = $this->getDefaultRenderer(null, [$msg]);
255  $actual = $r->render($l);
256  $this->assertEquals(
257  $this->brutallyTrimSignals($this->brutallyTrimHTML($expected)),
258  $this->brutallyTrimSignals($this->brutallyTrimHTML($actual))
259  );
260  }
261 }
button(string $caption, string $cmd)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ILIAS Data Factory $df
Interface Observer Contains several chained tasks and infos about them.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ILIAS Language Language $language
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
The scope of this class is split ilias-conform URI&#39;s into components.
Definition: URI.php:34
form( $class_path, string $cmd, string $submit_caption="")
modal(string $title="", string $cancel_label="")
language()
description: > Example for rendring a language glyph.
Definition: language.php:25
disabled()
description: > Example showing how to plug a disabled checkbox into a form
Definition: disabled.php:16
$r