ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
ilCtrlContextTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /* Copyright (c) 2021 Thibeau Fuhrer <thf@studer-raimann.ch> Extended GPL, see docs/LICENSE */
6 
10 
15 class ilCtrlContextTest extends TestCase
16 {
21 
26 
31 
35  private array $values;
36 
40  protected function setUp(): void
41  {
42  $this->values = [];
43  $this->refinery = $this->createMock(Refinery::class);
44  $this->factory = $this->createMock(ilCtrlPathFactory::class);
45  $this->request = $this->createMock(ArrayBasedRequestWrapper::class);
46  $this->request->method('has')->willReturn(true);
47  $this->request
48  ->method('retrieve')
49  ->willReturnCallback(function ($key) {
50  return $this->values[$key] ?? null;
51  });
52  }
53 
58  protected function getPath(string $cid_path = null): ilCtrlPathInterface
59  {
60  return new class ($cid_path) extends ilCtrlAbstractPath {
61  // override parent constructor, so we don't
62  // have to mock the ilCtrlStructure.
63  public function __construct(string $cid_path = null)
64  {
65  $this->cid_path = $cid_path;
66  }
67  };
68  }
69 
74  protected function getContextWithManualAdoption(array $request_values = null): ilCtrlContextInterface
75  {
76  $this->values = $request_values ?? [];
77 
78  return new class ($this->factory, $this->request, $this->refinery) extends ilCtrlContext {
79  // override parent constructor, so the request values
80  // are not adopted immediately.
81  public function __construct(
82  ilCtrlPathFactory $path_factory,
84  Refinery $refinery
85  ) {
86  $this->path_factory = $path_factory;
87  $this->path = $path_factory->null();
88  $this->request_wrapper = $request_wrapper;
89  $this->refinery = $refinery;
90  }
91 
92  // provide a public method that manually adopts the
93  // request values.
94  public function adopt(): void
95  {
96  $this->adoptRequestParameters();
97  }
98  };
99  }
100 
101  public function testContextPropertyAdoptionByRequest(): void
102  {
103  $expected_cid_path = 'test_cid_path';
104  $this->factory
105  ->method('existing')
106  ->willReturn($this->getPath($expected_cid_path));
107 
108  $this->factory
109  ->method('find')
110  ->willReturn($this->getPath($expected_cid_path));
111 
113  ilCtrlInterface::PARAM_CMD_MODE => 'test_cmd_mode',
114  ilCtrlInterface::PARAM_REDIRECT => 'test_redirect_source',
115  ilCtrlInterface::PARAM_BASE_CLASS => 'test_base_class',
116  ilCtrlInterface::PARAM_CMD_CLASS => 'test_cmd_class',
117  ilCtrlInterface::PARAM_CMD => 'test_cmd',
118  ilCtrlInterface::PARAM_CID_PATH => $expected_cid_path,
119  ]);
120 
121  $this->assertFalse($context->isAsync());
122  $this->assertEquals('ilias.php', $context->getTargetScript());
123  $this->assertNull($context->getCmdMode());
124  $this->assertNull($context->getRedirectSource());
125  $this->assertNull($context->getBaseClass());
126  $this->assertNull($context->getCmdClass());
127  $this->assertNull($context->getCmd());
128  $this->assertNull($context->getPath()->getCidPath());
129  $this->assertNull($context->getObjType());
130  $this->assertNull($context->getObjId());
131 
132  // manually adopt request values.
133  $context->adopt();
134 
135  $this->assertFalse($context->isAsync());
136  $this->assertNull($context->getObjType());
137  $this->assertNull($context->getObjId());
138  $this->assertEquals('ilias.php', $context->getTargetScript());
139 
140  $this->assertEquals('test_cmd_mode', $context->getCmdMode());
141  $this->assertEquals('test_redirect_source', $context->getRedirectSource());
142  $this->assertEquals('test_base_class', $context->getBaseClass());
143  $this->assertEquals('test_cmd_class', $context->getCmdClass());
144  $this->assertEquals('test_cmd', $context->getCmd());
145  $this->assertEquals('test_cid_path', $context->getPath()->getCidPath());
146  }
147 
149  {
151  $this->assertFalse($context->isAsync());
152 
154  $context->adopt();
155  $this->assertFalse($context->isAsync());
156 
158  $context->adopt();
159  $this->assertFalse($context->isAsync());
160 
162  $context->adopt();
163  $this->assertTrue($context->isAsync());
164  }
165 
167  {
168  $expected_cid_path = '0';
169  $this->factory
170  ->method('find')
171  ->willReturn($this->getPath($expected_cid_path));
172 
174  $this->assertNull($context->getBaseClass());
175 
176  $this->values[ilCtrlInterface::PARAM_BASE_CLASS] = ilCtrlBaseClass1TestGUI::class;
177  $context->adopt();
178 
179  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getBaseClass());
180  $this->assertEquals($expected_cid_path, $context->getPath()->getCidPath());
181  }
182 
184  {
186  $this->assertNull($context->getBaseClass());
187  $this->assertNull($context->getPath()->getCidPath());
188 
189  $context->adopt();
190 
191  $this->assertNull($context->getBaseClass());
192  $this->assertNull($context->getPath()->getCidPath());
193  }
194 
196  {
197  $context = new ilCtrlContext($this->factory, $this->request, $this->refinery);
198 
199  $this->assertNull($context->getObjType());
200  $this->assertNull($context->getObjId());
201  $this->assertEquals('ilias.php', $context->getTargetScript());
202 
203  $context
204  ->setObjType('test_type')
205  ->setObjId(42)
206  ->setTargetScript('test_script');
207 
208  $this->assertEquals('test_type', $context->getObjType());
209  $this->assertEquals(42, $context->getObjId());
210  $this->assertEquals('test_script', $context->getTargetScript());
211  }
212 
214  {
215  $context = new ilCtrlContext($this->factory, $this->request, $this->refinery);
216  $this->factory
217  ->method('find')
218  ->willReturn($this->getPath('http://localhost'));
219 
220  $this->assertNull($context->getCmdClass());
221  $context->setCmdClass(ilCtrlCommandClass1TestGUI::class);
222  $this->assertEquals(ilCtrlCommandClass1TestGUI::class, $context->getCmdClass());
223 
225  ilCtrlInterface::PARAM_CMD_CLASS => ilCtrlBaseClass1TestGUI::class,
226  ]);
227 
228  $this->assertNull($context->getCmdClass());
229  $context->adopt();
230  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getCmdClass());
231  }
232 
234  {
235  $context = new ilCtrlContext($this->factory, $this->request, $this->refinery);
236  $this->factory
237  ->method('find')
238  ->willReturn($this->getPath('http://localhost'));
239 
240  $context->setBaseClass(ilCtrlBaseClass1TestGUI::class);
241  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getCmdClass());
242 
243  $context->setCmdClass(ilCtrlCommandClass1TestGUI::class);
244  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getBaseClass());
245  $this->assertEquals(ilCtrlCommandClass1TestGUI::class, $context->getCmdClass());
246 
248  ilCtrlInterface::PARAM_CMD_CLASS => ilCtrlBaseClass1TestGUI::class,
249  ]);
250 
251  $this->assertNull($context->getCmdClass());
252  $context->adopt();
253  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getCmdClass());
254  }
255 
257  {
258  // for this test an actual instance of the path factory
259  // is required, therefore we have to creat the test ctrl
260  // structure.
261 
262  $structure_artifact = require __DIR__ . '/Data/Structure/test_ctrl_structure.php';
263  $base_class_artifact = require __DIR__ . '/Data/Structure/test_base_classes.php';
264 
265  $structure = new ilCtrlStructure(
266  $structure_artifact,
267  $base_class_artifact,
268  []
269  );
270 
271  $path_factory = new ilCtrlPathFactory($structure);
272  $context = new ilCtrlContext($path_factory, $this->request, $this->refinery);
273  $this->assertNull($context->getPath()->getCidPath());
274 
275  $context->setBaseClass(ilCtrlInvalidGuiClass::class);
276  $this->assertNull($context->getPath()->getCidPath());
277  $this->assertNull($context->getBaseClass());
278 
279  $context->setCmdClass(ilCtrlCommandClass1TestGUI::class);
280  $this->assertNull($context->getPath()->getCidPath());
281  $this->assertNull($context->getCmdClass());
282 
283  $context->setBaseClass(ilCtrlBaseClass1TestGUI::class);
284  $this->assertEquals('0', $context->getPath()->getCidPath());
285  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getBaseClass());
286  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getCmdClass());
287 
288  $context->setCmdClass(ilCtrlCommandClass1TestGUI::class);
289  $this->assertEquals('0:2', $context->getPath()->getCidPath());
290  $this->assertEquals(ilCtrlBaseClass1TestGUI::class, $context->getBaseClass());
291  $this->assertEquals(ilCtrlCommandClass1TestGUI::class, $context->getCmdClass());
292  }
293 }
Class ilCtrlContextTest.
$context
Definition: webdav.php:29
const CMD_MODE_PROCESS
different modes used for UI plugins (or in dev-mode).
ArrayBasedRequestWrapper $request
Class ilCtrlPathFactory.
Class ilCtrlContext is responsible for holding the current context information.
Class ilCtrlStructure holds the currently read control structure.
Class ilCtrlAbstractPath.
getContextWithManualAdoption(array $request_values=null)
testContextCommandClassPropertyWithBaseClass()
testContextPathProgressionWhenSettingClasses()
testContextBaseClassPropertyAdoptionByRequest()
getPath(string $cid_path=null)
testContextPropertyAdoptionWithoutCidPathAndBaseClass()
string $key
Consumer key/client ID value.
Definition: System.php:193
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
ilCtrlPathFactory $factory
testContextCommandClassPropertyWithoutBaseClass()
__construct(Container $dic, ilPlugin $plugin)
Interface ilCtrlPathInterface is responsible for holding and manipulating a valid ilCtrl class-path (...