ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
ExamplesTest.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 require_once("vendor/composer/vendor/autoload.php");
22 require_once(__DIR__ . "/../Base.php");
23 
28 
33 {
38  protected const MAY_NOT_HAVE_EXAMPLES = [
39  \ILIAS\UI\Help\Topic::class,
40  \ILIAS\UI\Component\Progress\State\Bar\State::class,
41  \ILIAS\UI\Component\Input\Field\Node\Node::class,
42  \ILIAS\UI\Component\Input\Field\Node\Async::class,
43  \ILIAS\UI\Component\Input\Field\Node\Leaf::class,
44  ];
45 
46  protected static string $path_to_base_factory = "components/ILIAS/UI/src/Factory.php";
47  protected Container $dic;
48  protected Crawler\ExamplesYamlParser $example_parser;
49 
50  public function setUp(): void
51  {
52  //This avoids various index not set warnings, which are only relevant in test context.
53  $_SERVER["REQUEST_SCHEME"] = "http";
54  $_SERVER["SERVER_NAME"] = "localhost";
55  $_SERVER["SERVER_PORT"] = "80";
56  $_SERVER["REQUEST_URI"] = "";
57  $_SERVER['SCRIPT_NAME'] = "";
58  $_SERVER['QUERY_STRING'] = "param=1";
59 
60  //This avoids Undefined index: ilfilehash for the moment
61  $_POST["ilfilehash"] = "";
62  $this->setUpMockDependencies();
63  $this->example_parser = new Crawler\ExamplesYamlParser();
64  }
65 
71  protected function setUpMockDependencies(): void
72  {
73  $this->dic = new Container();
74  $this->dic["tpl"] = $this->getTemplateFactory()->getTemplate("tpl.main.html", false, false);
75  $this->dic["lng"] = $this->getLanguage();
76  $this->dic["refinery"] = new \ILIAS\Refinery\Factory(
77  new ILIAS\Data\Factory(),
78  $this->getLanguage()
79  );
80 
81  (new InitUIFramework())->init($this->dic);
82 
83  $this->dic["ui.template_factory"] = $this->getTemplateFactory();
84 
85  $this->dic["ilCtrl"] = $this->getMockBuilder(\ilCtrl::class)->disableOriginalConstructor()->onlyMethods([
86  "getFormActionByClass","setParameterByClass","saveParameterByClass","getLinkTargetByClass", "isAsynch"
87  ])->getMock();
88  $this->dic["ilCtrl"]->method("getFormActionByClass")->willReturn("Testing");
89  $this->dic["ilCtrl"]->method("getLinkTargetByClass")->willReturn("2");
90  $this->dic["ilCtrl"]->method("isAsynch")->willReturn(false);
91 
92  $this->dic["upload"] = $this->getMockBuilder(FileUpload::class)->getMock();
93 
94  $this->dic["tree"] = $this->getMockBuilder(ilTree::class)
95  ->disableOriginalConstructor()
96  ->onlyMethods(["getNodeData"])->getMock();
97 
98  $this->dic["tree"]->method("getNodeData")->willReturn([
99  "ref_id" => "1",
100  "title" => "mock root node",
101  "type" => "crs"
102  ]);
103 
104  $component_factory = $this->createMock(ilComponentFactory::class);
105  $component_factory->method("getActivePluginsInSlot")->willReturn(new ArrayIterator());
106  $this->dic["component.factory"] = $component_factory;
107 
108  $this->dic["help.text_retriever"] = new ILIAS\UI\Help\TextRetriever\Echoing();
109 
110  (new InitHttpServices())->init($this->dic);
111  }
112 
117  {
118  global $DIC;
119  $DIC = $this->dic;
120 
121  foreach ($this->getEntriesFromCrawler() as $entry) {
122  if (in_array(trim($entry->getNamespace(), '\\'), self::MAY_NOT_HAVE_EXAMPLES, true)) {
123  continue;
124  }
125  if (!$entry->isAbstract()) {
126  $this->assertGreaterThan(
127  0,
128  count($entry->getExamples()),
129  "Non abstract Component " . $entry->getNamespace()
130  . " does not provide any example. Please provide at least one in " . $entry->getExamplesNamespace() . " at " . $entry->getExamplesPath()
131  );
132  }
133  }
134  }
135 
136  #[\PHPUnit\Framework\Attributes\DataProvider('getFullFunctionNamesAndPathExample')]
137  public function testAllExamplesRenderAString(string $example_function_name, string $example_path): void
138  {
139  global $DIC;
140  $DIC = $this->dic;
141 
142  include_once $example_path;
143  try {
144  $this->assertIsString($example_function_name(), " Example $example_function_name does not render a string");
145  } catch (NotImplementedException $e) {
146  $this->assertTrue(true);
147  }
148  }
149 
150  #[\PHPUnit\Framework\Attributes\DataProvider('getFullFunctionNamesAndPathExample')]
151  public function testAllExamplesHaveExpectedOutcomeInDocs(string $example_function_name, string $example_path)
152  {
153  $docs = $this->example_parser->parseYamlStringArrayFromFile($example_path);
154  $this->assertArrayHasKey('expected output', $docs);
155  }
156 
160  protected static function getEntriesFromCrawler(): Crawler\Entry\ComponentEntries
161  {
162  $crawler = new Crawler\FactoriesCrawler();
163  return $crawler->crawlFactory(self::$path_to_base_factory);
164  }
165 
166  public static function getFullFunctionNamesAndPathExample(): array
167  {
168  $function_names = [];
169  foreach (static::getEntriesFromCrawler() as $entry) {
170  foreach ($entry->getExamples() as $name => $example_path) {
171  $function_names[$entry->getExamplesNamespace() . "\\" . $name] = [
172  $entry->getExamplesNamespace() . "\\" . $name,
173  $example_path
174  ];
175  }
176  }
177  return $function_names;
178  }
179 
180  #[\PHPUnit\Framework\Attributes\DataProvider('getListOfFullscreenExamples')]
181  public function testFullscreenModeExamples(string $example_function_name, string $example_path): void
182  {
183  global $DIC;
184  $DIC = $this->dic;
185 
186  include_once $example_path;
187  try {
188  $this->assertIsString($example_function_name($DIC), " Example $example_function_name does not render a string");
189  } catch (NotImplementedException $e) {
190  $this->assertTrue(true);
191  }
192  }
193 
194  public static function getListOfFullscreenExamples(): array
195  {
196  return [
197  ['ILIAS\UI\examples\MainControls\Footer\base', "components/ILIAS/UI/src/examples/MainControls/Footer/base.php"],
198  ['ILIAS\UI\examples\MainControls\MetaBar\renderMetaBarInFullscreenMode', "components/ILIAS/UI/src/examples/MainControls/MetaBar/base_metabar.php"],
199  ['ILIAS\UI\examples\Layout\Page\Standard\getUIMainbarExampleCondensed', "components/ILIAS/UI/src/examples/Layout/Page/Standard/ui_mainbar.php"],
200  ['ILIAS\UI\examples\Layout\Page\Standard\getUIMainbarExampleFull', "components/ILIAS/UI/src/examples/Layout/Page/Standard/ui_mainbar.php"],
201  ['ILIAS\UI\examples\Layout\Page\Standard\ui', "components/ILIAS/UI/src/examples/Layout/Page/Standard/ui.php"],
202  ['ILIAS\UI\examples\MainControls\ModeInfo\renderModeInfoFullscreenMode', "components/ILIAS/UI/src/examples/MainControls/ModeInfo/modeinfo.php"]
203  ];
204  }
205 }
static getListOfFullscreenExamples()
Class ExamplesTest Checks if all examples are implemented and properly returning strings.
Interface Observer Contains several chained tasks and infos about them.
setUpMockDependencies()
Some wiring up of dependencies to get all the examples running.
Crawler ExamplesYamlParser $example_parser
This exception indicates that an UI component was accepted by the JF but is not backed by a real impl...
static string $path_to_base_factory
Customizing of pimple-DIC for ILIAS.
Definition: Container.php:35
This is more or less a copy of the removed InitUIFramework file inside the Init component.
static getEntriesFromCrawler()
getLanguage()
static getFullFunctionNamesAndPathExample()
$_SERVER['HTTP_HOST']
Definition: raiseError.php:26
testAllExamplesRenderAString(string $example_function_name, string $example_path)
global $DIC
Definition: shib_login.php:26
testAllExamplesHaveExpectedOutcomeInDocs(string $example_function_name, string $example_path)
testFullscreenModeExamples(string $example_function_name, string $example_path)
Container $dic
const MAY_NOT_HAVE_EXAMPLES
testAllNonAbstractComponentsShowcaseExamples()
Responsible for loading the HTTP Service into the dependency injection container of ILIAS...