‪TYPO3CMS  ‪main
FluidTemplateContentObjectTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\MockObject\MockObject;
21 use Prophecy\Argument;
22 use Prophecy\Doubler\Generator\Node\ReturnTypeNode;
23 use Prophecy\PhpUnit\ProphecyTrait;
24 use Prophecy\Prophecy\ObjectProphecy;
25 use Psr\Container\ContainerInterface;
30 use TYPO3\CMS\Core\Page\PageRenderer;
39 use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
43 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
44 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
45 use TYPO3Fluid\Fluid\View\AbstractTemplateView;
46 
53 class ‪FluidTemplateContentObjectTest extends UnitTestCase
54 {
55  use ProphecyTrait;
57 
58  protected bool ‪$resetSingletonInstances = true;
59 
63  protected MockObject ‪$subject;
64 
66  protected ObjectProphecy ‪$contentObjectRendererProphecy;
67 
68  protected ContentObjectRenderer ‪$contentObjectRenderer;
69 
74 
78  protected MockObject ‪$standaloneView;
79 
83  protected MockObject ‪$request;
84 
88  protected function ‪setUp(): void
89  {
90  parent::setUp();
91  $importMapProphecy = $this->prophesize(ImportMap::class);
92  $importMapProphecy->render(Argument::type('string'), Argument::type('string'))->willReturn('');
93  $importMapFactoryProphecy = $this->prophesize(ImportMapFactory::class);
94  $importMapFactoryProphecy->create()->willReturn($importMapProphecy->reveal());
95  GeneralUtility::setSingletonInstance(ImportMapFactory::class, $importMapFactoryProphecy->reveal());
96  $this->contentDataProcessor = new ‪ContentDataProcessor(
97  $this->prophesize(ContainerInterface::class)->reveal(),
98  $this->prophesize(DataProcessorRegistry::class)->reveal()
99  );
100  $this->contentObjectRendererProphecy = $this->prophesize(ContentObjectRenderer::class);
101  $this->contentObjectRenderer = $this->contentObjectRendererProphecy->reveal();
102  $this->subject = $this->getAccessibleMock(
103  FluidTemplateContentObject::class,
104  ['initializeStandaloneViewInstance'],
105  [$this->contentDataProcessor]
106  );
107  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters());
108  $this->request = $this->getMockBuilder(Request::class)->setConstructorArgs([$serverRequest])->getMock();
109  $this->subject->setRequest($this->request);
110  $this->subject->setContentObjectRenderer($this->contentObjectRenderer);
111  $tsfe = $this->createMock(TypoScriptFrontendController::class);
112  ‪$GLOBALS['TSFE'] = $tsfe;
113  }
114 
118  protected function ‪addMockViewToSubject(): void
119  {
120  $this->standaloneView = $this->createMock(StandaloneView::class);
121  $this->standaloneView->method('getRequest')->willReturn($this->request);
122  $this->standaloneView->method('renderSection')->willReturn('');
123  $this->subject->_set('view', $this->standaloneView);
124  }
125 
129  public function ‪constructSetsContentObjectRenderer(): void
130  {
131  ‪$contentObjectRenderer = new ContentObjectRenderer();
132  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
133  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer);
134  self::assertEquals(‪$contentObjectRenderer, ‪$subject->getContentObjectRenderer());
135  }
136 
140  public function ‪renderCallsInitializeStandaloneViewInstance(): void
141  {
142  GeneralUtility::setSingletonInstance(
143  PageRenderer::class,
144  new PageRenderer(...$this->getPageRendererConstructorArgs()),
145  );
146  $this->‪addMockViewToSubject();
147  $this->subject->expects(self::once())->method('initializeStandaloneViewInstance');
148  $this->subject->render([]);
149  }
150 
155  {
156  $configuration = [
157  'templateName' => 'foobar',
158  'templateRootPaths.' => [
159  10 => 'dummyPath',
160  '10.' => [
161  'wrap' => '|5/',
162  ],
163  15 => 'dummyPath6/',
164  '25.' => [
165  'field' => 'someField',
166  ],
167  ],
168  ];
169  GeneralUtility::setSingletonInstance(
170  PageRenderer::class,
171  new PageRenderer(...$this->getPageRendererConstructorArgs()),
172  );
173  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
174 
175  $standAloneView = $this->prophesize(StandaloneView::class);
176  $standAloneView->setRequest(Argument::cetera());
177  $standAloneView->setTemplateRootPaths(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
178  $standAloneView->setTemplate(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
179  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
180  $standAloneView->render(Argument::cetera())->willReturn('');
181  $standAloneView->renderSection(Argument::cetera())->willReturn('');
182  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
183  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
184  ‪$subject->setRequest($this->request);
185  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
186 
187  ‪$subject->render($configuration);
188 
189  ‪$contentObjectRenderer->stdWrap('dummyPath', ['wrap' => '|5/'])->shouldHaveBeenCalled();
190  ‪$contentObjectRenderer->stdWrap('', ['field' => 'someField'])->shouldHaveBeenCalled();
191  }
192 
196  public function ‪renderSetsTemplateFileInView(): void
197  {
198  $configuration = ['file' => 'EXT:core/bar.html'];
199 
200  GeneralUtility::setSingletonInstance(
201  PageRenderer::class,
202  new PageRenderer(...$this->getPageRendererConstructorArgs()),
203  );
204  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
205  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
206  ‪$contentObjectRenderer->stdWrapValue('file', $configuration)->willReturn('EXT:core/bar.html');
207  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
208  ‪$subject->setRequest($this->request);
209  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
210 
211  $standAloneView = $this->prophesize(StandaloneView::class);
212  $standAloneView->setRequest(Argument::cetera());
213  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
214  $standAloneView->render(Argument::cetera())->willReturn('');
215  $standAloneView->renderSection(Argument::cetera())->willReturn('');
216  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
217 
218  ‪$subject->render($configuration);
219 
220  $standAloneView->setTemplatePathAndFilename(GeneralUtility::getFileAbsFileName('EXT:core/bar.html'))->shouldHaveBeenCalled();
221  }
222 
226  public function ‪renderSetsTemplateFileByTemplateInView(): void
227  {
228  $configuration = [
229  'template' => 'FILE',
230  'template.' => [
231  'file' => ‪Environment::getPublicPath() . '/foo/bar.html',
232  ],
233  ];
234 
235  GeneralUtility::setSingletonInstance(
236  PageRenderer::class,
237  new PageRenderer(...$this->getPageRendererConstructorArgs()),
238  );
239  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
240  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(7);
241  ‪$contentObjectRenderer->cObjGetSingle('FILE', ['file' => ‪Environment::getPublicPath() . '/foo/bar.html'], 'template')->willReturn('baz');
242 
243  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
244  ‪$subject->setRequest($this->request);
245  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
246  $standAloneView = $this->prophesize(StandaloneView::class);
247  $standAloneView->setRequest(Argument::cetera());
248  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
249  $standAloneView->render(Argument::cetera())->willReturn('');
250  $standAloneView->renderSection(Argument::cetera())->willReturn('');
251  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
252 
253  ‪$subject->render($configuration);
254 
255  $standAloneView->setTemplateSource('baz')->shouldHaveBeenCalled();
256  }
257 
261  public function ‪renderSetsTemplateFileByTemplateNameInView(): void
262  {
263  $configuration = [
264  'templateName' => 'foo',
265  'templateRootPaths.' => [
266  0 => 'dummyPath1/',
267  1 => 'dummyPath2/',
268  ],
269  ];
270  GeneralUtility::setSingletonInstance(
271  PageRenderer::class,
272  new PageRenderer(...$this->getPageRendererConstructorArgs()),
273  );
274  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
275  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
276  ‪$contentObjectRenderer->stdWrapValue('templateName', $configuration)->willReturn('foo');
277 
278  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
279  ‪$subject->setRequest($this->request);
280  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
281 
282  $standAloneView = $this->prophesize(StandaloneView::class);
283  $standAloneView->setRequest(Argument::cetera());
284  $standAloneView->setTemplateRootPaths(Argument::cetera())->shouldBeCalled();
285  $standAloneView->assignMultiple(Argument::cetera())->shouldBeCalled();
286  $standAloneView->renderSection(Argument::cetera())->willReturn('');
287  $standAloneView->render()->willReturn('');
288  $standAloneView->getFormat()->willReturn('html');
289  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
290 
291  ‪$subject->render($configuration);
292 
293  $standAloneView->setTemplate('foo')->shouldHaveBeenCalled();
294  }
295 
300  {
301  $configuration = [
302  'templateName' => 'TEXT',
303  'templateName.' => ['value' => 'bar'],
304  'templateRootPaths.' => [
305  0 => 'dummyPath1/',
306  1 => 'dummyPath2/',
307  ],
308  ];
309 
310  GeneralUtility::setSingletonInstance(
311  PageRenderer::class,
312  new PageRenderer(...$this->getPageRendererConstructorArgs()),
313  );
314  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
315  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
316  ‪$contentObjectRenderer->stdWrapValue('templateName', $configuration)->willReturn('bar');
317 
318  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
319  ‪$subject->setRequest($this->request);
320  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
321 
322  $standAloneView = $this->prophesize(StandaloneView::class);
323  $standAloneView->setRequest(Argument::cetera());
324  $standAloneView->setTemplateRootPaths(Argument::cetera())->shouldBeCalled();
325  $standAloneView->assignMultiple(Argument::cetera())->shouldBeCalled();
326  $standAloneView->renderSection(Argument::cetera())->willReturn('');
327  $standAloneView->render()->willReturn('');
328  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
329 
330  ‪$subject->render($configuration);
331 
332  $standAloneView->setTemplate('bar')->shouldHaveBeenCalled();
333  }
334 
338  public function ‪renderSetsLayoutRootPathInView(): void
339  {
340  $configuration = ['layoutRootPath' => 'foo/bar.html'];
341 
342  GeneralUtility::setSingletonInstance(
343  PageRenderer::class,
344  new PageRenderer(...$this->getPageRendererConstructorArgs()),
345  );
346  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
347  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
348  ‪$contentObjectRenderer->stdWrapValue('layoutRootPath', $configuration)->willReturn('foo/bar.html');
349 
350  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
351  ‪$subject->setRequest($this->request);
352  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
353  $standAloneView = $this->prophesize(StandaloneView::class);
354  $standAloneView->setRequest(Argument::cetera());
355  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
356  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
357  $standAloneView->render(Argument::cetera())->willReturn('');
358  $standAloneView->renderSection(Argument::cetera())->willReturn('');
359  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
360 
361  ‪$subject->render($configuration);
362 
363  $standAloneView->setLayoutRootPaths([‪Environment::getPublicPath() . '/foo/bar.html'])->shouldHaveBeenCalled();
364  }
365 
370  {
371  $configuration = [
372  'layoutRootPath' => 'foo',
373  'layoutRootPath.' => [
374  'bar' => 'baz',
375  ],
376  ];
377 
378  GeneralUtility::setSingletonInstance(
379  PageRenderer::class,
380  new PageRenderer(...$this->getPageRendererConstructorArgs()),
381  );
382  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
383  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
384 
385  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
386  ‪$subject->setRequest($this->request);
387  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
388  $standAloneView = $this->prophesize(StandaloneView::class);
389  $standAloneView->setRequest(Argument::cetera());
390  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
391  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
392  $standAloneView->render(Argument::cetera())->willReturn('');
393  $standAloneView->renderSection(Argument::cetera())->willReturn('');
394  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
395 
396  ‪$subject->render($configuration);
397 
398  ‪$contentObjectRenderer->stdWrapValue('layoutRootPath', $configuration)->shouldHaveBeenCalled();
399  }
400 
404  public function ‪layoutRootPathsHasStdWrapSupport(): void
405  {
406  $configuration = [
407  'layoutRootPaths.' => [
408  10 => 'FILE',
409  '10.' => [
410  'file' => 'foo/bar.html',
411  ],
412  20 => 'foo/bar2.html',
413  ],
414  ];
415 
416  GeneralUtility::setSingletonInstance(
417  PageRenderer::class,
418  new PageRenderer(...$this->getPageRendererConstructorArgs()),
419  );
420  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
421  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
422  ‪$contentObjectRenderer->stdWrap('FILE', ['file' => 'foo/bar.html'])->shouldBeCalled();
423 
424  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
425  ‪$subject->setRequest($this->request);
426  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
427  $standAloneView = $this->prophesize(StandaloneView::class);
428  $standAloneView->setRequest(Argument::cetera());
429  $standAloneView->setLayoutRootPaths(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
430  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
431  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
432  $standAloneView->render(Argument::cetera())->willReturn('');
433  $standAloneView->renderSection(Argument::cetera())->willReturn('');
434  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
435 
436  ‪$subject->render($configuration);
437 
438  ‪$contentObjectRenderer->stdWrap('FILE', ['file' => 'foo/bar.html'])->shouldHaveBeenCalled();
439  }
440 
444  public function ‪fallbacksForLayoutRootPathAreSet(): void
445  {
446  GeneralUtility::setSingletonInstance(
447  PageRenderer::class,
448  new PageRenderer(...$this->getPageRendererConstructorArgs()),
449  );
450  $this->‪addMockViewToSubject();
451  $this->standaloneView
452  ->expects(self::once())
453  ->method('setLayoutRootPaths')
454  ->with([
455  10 => ‪Environment::getPublicPath() . '/foo/bar.html',
456  20 => ‪Environment::getPublicPath() . '/foo/bar2.html',
457  ]);
458  $this->subject->render(['layoutRootPaths.' => [10 => 'foo/bar.html', 20 => 'foo/bar2.html']]);
459  }
460 
465  {
466  $configuration = [
467  'layoutRootPath' => 'foo/main.html',
468  'layoutRootPaths.' => [10 => 'foo/bar.html', 20 => 'foo/bar2.html'],
469  ];
470 
471  GeneralUtility::setSingletonInstance(
472  PageRenderer::class,
473  new PageRenderer(...$this->getPageRendererConstructorArgs()),
474  );
475  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
476  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
477  ‪$contentObjectRenderer->stdWrapValue('layoutRootPath', $configuration)->willReturn('foo/main.html');
478 
479  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
480  ‪$subject->setRequest($this->request);
481  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
482  $standAloneView = $this->prophesize(StandaloneView::class);
483  $standAloneView->setRequest(Argument::cetera());
484  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
485  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
486  $standAloneView->render(Argument::cetera())->willReturn('');
487  $standAloneView->renderSection(Argument::cetera())->willReturn('');
488  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
489 
490  ‪$subject->render($configuration);
491 
492  $standAloneView->setLayoutRootPaths([
493  0 => ‪Environment::getPublicPath() . '/foo/main.html',
494  10 => ‪Environment::getPublicPath() . '/foo/bar.html',
495  20 => ‪Environment::getPublicPath() . '/foo/bar2.html',
496  ])->shouldHaveBeenCalled();
497  }
498 
502  public function ‪renderSetsPartialRootPathInView(): void
503  {
504  $configuration = ['partialRootPath' => 'foo/bar.html'];
505 
506  GeneralUtility::setSingletonInstance(
507  PageRenderer::class,
508  new PageRenderer(...$this->getPageRendererConstructorArgs()),
509  );
510  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
511  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
512  ‪$contentObjectRenderer->stdWrapValue('partialRootPath', $configuration)->willReturn('foo/bar.html');
513 
514  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
515  ‪$subject->setRequest($this->request);
516  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
517  $standAloneView = $this->prophesize(StandaloneView::class);
518  $standAloneView->setRequest(Argument::cetera());
519  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
520  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
521  $standAloneView->render(Argument::cetera())->willReturn('');
522  $standAloneView->renderSection(Argument::cetera())->willReturn('');
523  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
524 
525  ‪$subject->render($configuration);
526 
527  $standAloneView->setPartialRootPaths([‪Environment::getPublicPath() . '/foo/bar.html'])->shouldHaveBeenCalled();
528  }
529 
533  public function ‪partialRootPathsHasStdWrapSupport(): void
534  {
535  $configuration = [
536  'partialRootPaths.' => [
537  10 => 'FILE',
538  '10.' => [
539  'file' => 'foo/bar.html',
540  ],
541  20 => 'foo/bar2.html',
542  ],
543  ];
544 
545  GeneralUtility::setSingletonInstance(
546  PageRenderer::class,
547  new PageRenderer(...$this->getPageRendererConstructorArgs()),
548  );
549  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
550 
551  $standAloneView = $this->prophesize(StandaloneView::class);
552  $standAloneView->setRequest(Argument::cetera());
553  $standAloneView->setPartialRootPaths(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
554  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
555  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
556  $standAloneView->render(Argument::cetera())->willReturn('');
557  $standAloneView->renderSection(Argument::cetera())->willReturn('');
558  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
559  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
560  ‪$subject->setRequest($this->request);
561  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
562 
563  ‪$subject->render($configuration);
564 
565  ‪$contentObjectRenderer->stdWrap('FILE', ['file' => 'foo/bar.html'])->shouldHaveBeenCalled();
566  }
567 
572  {
573  $configuration = [
574  'partialRootPath' => 'foo',
575  'partialRootPath.' => ['bar' => 'baz'],
576  ];
577 
578  GeneralUtility::setSingletonInstance(
579  PageRenderer::class,
580  new PageRenderer(...$this->getPageRendererConstructorArgs()),
581  );
582  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
583  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
584  ‪$subject->setRequest($this->request);
585  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
586 
587  $standAloneView = $this->prophesize(StandaloneView::class);
588  $standAloneView->setRequest(Argument::cetera());
589  $standAloneView->setPartialRootPaths(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
590  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
591  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
592  $standAloneView->render(Argument::cetera())->willReturn('');
593  $standAloneView->renderSection(Argument::cetera())->willReturn('');
594  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
595 
596  ‪$subject->render($configuration);
597 
598  ‪$contentObjectRenderer->stdWrapValue('partialRootPath', $configuration)->shouldHaveBeenCalled();
599  }
600 
604  public function ‪fallbacksForPartialRootPathAreSet(): void
605  {
606  GeneralUtility::setSingletonInstance(
607  PageRenderer::class,
608  new PageRenderer(...$this->getPageRendererConstructorArgs()),
609  );
610  $this->‪addMockViewToSubject();
611  $this->standaloneView
612  ->expects(self::once())
613  ->method('setPartialRootPaths')
614  ->with([10 => ‪Environment::getPublicPath() . '/foo', 20 => ‪Environment::getPublicPath() . '/bar']);
615  $this->subject->render(['partialRootPaths.' => [10 => 'foo', 20 => 'bar']]);
616  }
617 
622  {
623  $configuration = [
624  'partialRootPath' => 'main',
625  'partialRootPaths.' => [10 => 'foo', 20 => 'bar'],
626  ];
627 
628  GeneralUtility::setSingletonInstance(
629  PageRenderer::class,
630  new PageRenderer(...$this->getPageRendererConstructorArgs()),
631  );
632  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
633  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
634  ‪$contentObjectRenderer->stdWrapValue('partialRootPath', $configuration)->willReturn(‪Environment::getPublicPath() . '/main');
635 
636  $standAloneView = $this->prophesize(StandaloneView::class);
637  $standAloneView->setRequest(Argument::cetera());
638  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
639  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
640  $standAloneView->render(Argument::cetera())->willReturn('');
641  $standAloneView->renderSection(Argument::cetera())->willReturn('');
642  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
643  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
644  ‪$subject->setRequest($this->request);
645  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
646 
647  ‪$subject->render($configuration);
648 
649  $standAloneView->setPartialRootPaths([
650  0 => ‪Environment::getPublicPath() . '/main',
651  10 => ‪Environment::getPublicPath() . '/foo',
652  20 => ‪Environment::getPublicPath() . '/bar',
653  ])
654  ->willReturn(new ReturnTypeNode('void'))
655  ->shouldHaveBeenCalled();
656  }
657 
661  public function ‪renderSetsFormatInView(): void
662  {
663  $configuration = [
664  'format' => 'xml',
665  ];
666 
667  GeneralUtility::setSingletonInstance(
668  PageRenderer::class,
669  new PageRenderer(...$this->getPageRendererConstructorArgs()),
670  );
671  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
672  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
673  ‪$contentObjectRenderer->stdWrapValue('format', $configuration)->willReturn('xml');
674 
675  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
676  ‪$subject->setRequest($this->request);
677  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
678  $standAloneView = $this->prophesize(StandaloneView::class);
679  $standAloneView->setRequest(Argument::cetera());
680  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
681  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
682  $standAloneView->render(Argument::cetera())->willReturn('');
683  $standAloneView->renderSection(Argument::cetera())->willReturn('');
684  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
685 
686  ‪$subject->render($configuration);
687 
688  $standAloneView->setFormat('xml')->shouldHaveBeenCalled();
689  }
690 
694  public function ‪renderCallsStandardWrapValueForFormat(): void
695  {
696  $configuration = [
697  'format' => 'foo',
698  'format.' => ['bar' => 'baz'],
699  ];
700 
701  GeneralUtility::setSingletonInstance(
702  PageRenderer::class,
703  new PageRenderer(...$this->getPageRendererConstructorArgs()),
704  );
705  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
706 
707  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
708  ‪$subject->setRequest($this->request);
709  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
710  $standAloneView = $this->prophesize(StandaloneView::class);
711  $standAloneView->setRequest(Argument::cetera());
712  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
713  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
714  $standAloneView->render(Argument::cetera())->willReturn('');
715  $standAloneView->renderSection(Argument::cetera())->willReturn('');
716  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
717 
718  ‪$subject->render($configuration);
719 
720  ‪$contentObjectRenderer->stdWrapValue('format', $configuration)->shouldHaveBeenCalled();
721  }
722 
726  public function ‪renderSetsExtbasePluginNameInRequest(): void
727  {
728  $configuration = [
729  'extbase.' => [
730  'pluginName' => 'foo',
731  ],
732  ];
733 
734  GeneralUtility::setSingletonInstance(
735  PageRenderer::class,
736  new PageRenderer(...$this->getPageRendererConstructorArgs()),
737  );
738  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
739  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
740  ‪$contentObjectRenderer->stdWrapValue('pluginName', ['pluginName' => 'foo'])->willReturn('foo');
741 
742  ‪$request = $this->prophesize(RequestInterface::class);
743  ‪$request->withPluginName('foo')->willReturn(‪$request);
744 
745  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
746  ‪$subject->setRequest(‪$request->reveal());
747  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
748 
749  $standAloneView = $this->prophesize(StandaloneView::class);
750  $standAloneView->setRequest(Argument::cetera());
751  $standAloneView->setTemplatePathAndFilename('')->shouldBeCalled();
752  $standAloneView->assignMultiple(['data' => [], 'current' => null])->shouldBeCalled();
753  $standAloneView->renderSection(Argument::cetera())->willReturn('');
754  $standAloneView->render(Argument::cetera())->shouldBeCalled();
755  $standAloneView->setRequest(‪$request->reveal())->shouldBeCalled();
756 
757  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
758 
759  ‪$subject->render($configuration);
760  ‪$request->withPluginName('foo')->shouldHaveBeenCalled();
761  }
762 
767  {
768  $configuration = [
769  'pluginName' => 'foo',
770  'pluginName.' => [
771  'bar' => 'baz',
772  ],
773  ];
774 
775  GeneralUtility::setSingletonInstance(
776  PageRenderer::class,
777  new PageRenderer(...$this->getPageRendererConstructorArgs()),
778  );
779  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
780 
781  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
782  ‪$subject->setRequest($this->request);
783  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
784  $standAloneView = $this->prophesize(StandaloneView::class);
785  $standAloneView->setRequest(Argument::cetera());
786  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
787  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
788  $standAloneView->render(Argument::cetera())->willReturn('');
789  $standAloneView->renderSection(Argument::cetera())->willReturn('');
790  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
791 
792  ‪$subject->render(['extbase.' => $configuration]);
793 
794  ‪$contentObjectRenderer->stdWrapValue('pluginName', $configuration)->shouldHaveBeenCalled();
795  }
796 
801  {
802  $configuration = [
803  'extbase.' => [
804  'controllerExtensionName' => 'foo',
805  ],
806  ];
807 
808  GeneralUtility::setSingletonInstance(
809  PageRenderer::class,
810  new PageRenderer(...$this->getPageRendererConstructorArgs()),
811  );
812  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
813  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
814  ‪$contentObjectRenderer->stdWrapValue('controllerExtensionName', ['controllerExtensionName' => 'foo'])->willReturn('foo');
815 
816  ‪$request = $this->prophesize(RequestInterface::class);
817  ‪$request->withControllerExtensionName('foo')->willReturn(‪$request);
818 
819  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
820  ‪$subject->setRequest(‪$request->reveal());
821  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
822 
823  $standAloneView = $this->prophesize(StandaloneView::class);
824  $standAloneView->setRequest(Argument::cetera());
825  $standAloneView->setTemplatePathAndFilename('')->shouldBeCalled();
826  $standAloneView->assignMultiple(['data' => [], 'current' => null])->shouldBeCalled();
827  $standAloneView->renderSection(Argument::cetera())->willReturn('');
828  $standAloneView->render(Argument::cetera())->shouldBeCalled();
829  $standAloneView->setRequest(‪$request->reveal())->shouldBeCalled();
830 
831  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
832 
833  ‪$subject->render($configuration);
834 
835  ‪$request->withControllerExtensionName('foo')->shouldHaveBeenCalled();
836  }
837 
842  {
843  $configuration = [
844  'controllerExtensionName' => 'foo',
845  'controllerExtensionName.' => [
846  'bar' => 'baz',
847  ],
848  ];
849 
850  GeneralUtility::setSingletonInstance(
851  PageRenderer::class,
852  new PageRenderer(...$this->getPageRendererConstructorArgs()),
853  );
854  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
855 
856  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
857  ‪$subject->setRequest($this->request);
858  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
859 
860  $standAloneView = $this->prophesize(StandaloneView::class);
861  $standAloneView->setRequest(Argument::cetera());
862  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
863  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
864  $standAloneView->render(Argument::cetera())->willReturn('');
865  $standAloneView->renderSection(Argument::cetera())->willReturn('');
866  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
867  ‪$subject->render(['extbase.' => $configuration]);
868 
869  ‪$contentObjectRenderer->stdWrapValue('controllerExtensionName', $configuration)->shouldHaveBeenCalled();
870  }
871 
875  public function ‪renderSetsExtbaseControllerNameInRequest(): void
876  {
877  $configuration = [
878  'extbase.' => [
879  'controllerName' => 'foo',
880  ],
881  ];
882 
883  GeneralUtility::setSingletonInstance(
884  PageRenderer::class,
885  new PageRenderer(...$this->getPageRendererConstructorArgs()),
886  );
887  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
888  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
889  ‪$contentObjectRenderer->stdWrapValue('controllerName', ['controllerName' => 'foo'])->willReturn('foo');
890 
891  ‪$request = $this->prophesize(RequestInterface::class);
892  ‪$request->withControllerName('foo')->willReturn(‪$request);
893 
894  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
895  ‪$subject->setRequest(‪$request->reveal());
896  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
897 
898  $standAloneView = $this->prophesize(StandaloneView::class);
899  $standAloneView->setRequest(Argument::cetera());
900  $standAloneView->setTemplatePathAndFilename('')->shouldBeCalled();
901  $standAloneView->assignMultiple(['data' => [], 'current' => null])->shouldBeCalled();
902  $standAloneView->renderSection(Argument::cetera())->willReturn('');
903  $standAloneView->render(Argument::cetera())->shouldBeCalled();
904  $standAloneView->setRequest(‪$request->reveal())->shouldBeCalled();
905 
906  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
907 
908  ‪$subject->render($configuration);
909 
910  ‪$request->withControllerName('foo')->shouldHaveBeenCalled();
911  }
912 
917  {
918  $configuration = [
919  'controllerName' => 'foo',
920  'controllerName.' => [
921  'bar' => 'baz',
922  ],
923  ];
924 
925  GeneralUtility::setSingletonInstance(
926  PageRenderer::class,
927  new PageRenderer(...$this->getPageRendererConstructorArgs()),
928  );
929  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
930 
931  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
932  ‪$subject->setRequest($this->request);
933  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
934  $standAloneView = $this->prophesize(StandaloneView::class);
935  $standAloneView->setRequest(Argument::cetera());
936  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
937  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
938  $standAloneView->render(Argument::cetera())->willReturn('');
939  $standAloneView->renderSection(Argument::cetera())->willReturn('');
940  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
941 
942  ‪$subject->render(['extbase.' => $configuration]);
943 
944  ‪$contentObjectRenderer->stdWrapValue('controllerName', $configuration)->shouldHaveBeenCalled();
945  }
946 
951  {
952  $configuration = [
953  'extbase.' => [
954  'controllerActionName' => 'foo',
955  ],
956  ];
957 
958  GeneralUtility::setSingletonInstance(
959  PageRenderer::class,
960  new PageRenderer(...$this->getPageRendererConstructorArgs()),
961  );
962  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
963  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
964  ‪$contentObjectRenderer->stdWrapValue('controllerActionName', ['controllerActionName' => 'foo'])->willReturn('foo');
965 
966  ‪$request = $this->prophesize(RequestInterface::class);
967  ‪$request->withControllerActionName('foo')->willReturn(‪$request);
968 
969  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
970  ‪$subject->setRequest(‪$request->reveal());
971  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
972  $standAloneView = $this->prophesize(StandaloneView::class);
973  $standAloneView->setRequest(Argument::cetera());
974  $standAloneView->setTemplatePathAndFilename('')->shouldBeCalled();
975  $standAloneView->assignMultiple(['data' => [], 'current' => null])->shouldBeCalled();
976  $standAloneView->renderSection(Argument::cetera())->willReturn('');
977  $standAloneView->render(Argument::cetera())->shouldBeCalled();
978  $standAloneView->setRequest(‪$request->reveal())->shouldBeCalled();
979 
980  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
981 
982  ‪$subject->render($configuration);
983 
984  ‪$request->withControllerActionName('foo')->shouldHaveBeenCalled();
985  }
986 
991  {
992  $configuration = [
993  'controllerActionName' => 'foo',
994  'controllerActionName.' => [
995  'bar' => 'baz',
996  ],
997  ];
998 
999  GeneralUtility::setSingletonInstance(
1000  PageRenderer::class,
1001  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1002  );
1003 
1004  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
1005 
1006  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
1007  ‪$subject->setRequest($this->request);
1008  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
1009  $standAloneView = $this->prophesize(StandaloneView::class);
1010  $standAloneView->setRequest(Argument::cetera());
1011  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1012  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1013  $standAloneView->render(Argument::cetera())->willReturn('');
1014  $standAloneView->renderSection(Argument::cetera())->willReturn('');
1015  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
1016 
1017  ‪$subject->render(['extbase.' => $configuration]);
1018 
1019  ‪$contentObjectRenderer->stdWrapValue('controllerActionName', $configuration)->shouldHaveBeenCalled();
1020  }
1021 
1025  public function ‪renderAssignsSettingsArrayToView(): void
1026  {
1027  $configuration = [
1028  'settings.' => [
1029  'foo' => 'value',
1030  'bar.' => [
1031  'baz' => 'value2',
1032  ],
1033  ],
1034  ];
1035 
1036  $expectedSettingsToBeSet = [
1037  'foo' => 'value',
1038  'bar' => [
1039  'baz' => 'value2',
1040  ],
1041  ];
1042 
1043  GeneralUtility::setSingletonInstance(
1044  PageRenderer::class,
1045  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1046  );
1047 
1048  $typoScriptServiceMock = $this->getMockBuilder(TypoScriptService::class)->getMock();
1049  $typoScriptServiceMock
1050  ->expects(self::once())
1051  ->method('convertTypoScriptArrayToPlainArray')
1052  ->with($configuration['settings.'])
1053  ->willReturn($expectedSettingsToBeSet);
1054  GeneralUtility::addInstance(TypoScriptService::class, $typoScriptServiceMock);
1055 
1056  $standAloneView = $this->prophesize(StandaloneView::class);
1057  $standAloneView->setRequest(Argument::cetera());
1058  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1059  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1060  $standAloneView->render(Argument::cetera())->willReturn('');
1061  $standAloneView->renderSection(Argument::cetera())->willReturn('');
1062  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
1063  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
1064  ‪$subject->setRequest($this->request);
1065  ‪$subject->setContentObjectRenderer($this->prophesize(ContentObjectRenderer::class)->reveal());
1066 
1067  ‪$subject->render($configuration);
1068 
1069  $standAloneView->assign('settings', $expectedSettingsToBeSet)->shouldHaveBeenCalled();
1070  }
1071 
1076  {
1077  $this->‪addMockViewToSubject();
1078  $configuration = [
1079  'variables.' => [
1080  'data' => 'foo',
1081  'data.' => [
1082  'bar' => 'baz',
1083  ],
1084  ],
1085  ];
1086  $this->expectException(\InvalidArgumentException::class);
1087  $this->expectExceptionCode(1288095720);
1088  $this->subject->render($configuration);
1089  }
1090 
1095  {
1096  $this->‪addMockViewToSubject();
1097  $configuration = [
1098  'variables.' => [
1099  'current' => 'foo',
1100  'current.' => [
1101  'bar' => 'baz',
1102  ],
1103  ],
1104  ];
1105  $this->expectException(\InvalidArgumentException::class);
1106  $this->expectExceptionCode(1288095720);
1107  $this->subject->render($configuration);
1108  }
1109 
1113  public function ‪renderCallsCObjGetSingleForAllowedVariable(): void
1114  {
1115  GeneralUtility::setSingletonInstance(
1116  PageRenderer::class,
1117  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1118  );
1119 
1120  $configuration = [
1121  'variables.' => [
1122  'aVar' => 'TEXT',
1123  'aVar.' => [
1124  'value' => 'foo',
1125  ],
1126  ],
1127  ];
1128 
1129  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
1130 
1131  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
1132  ‪$subject->setRequest($this->request);
1133  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
1134  $standAloneView = $this->prophesize(StandaloneView::class);
1135  $standAloneView->setRequest(Argument::cetera());
1136  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1137  $standAloneView->assignMultiple(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1138  $standAloneView->render(Argument::cetera())->willReturn('');
1139  $standAloneView->renderSection(Argument::cetera())->willReturn('');
1140  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
1141 
1142  ‪$subject->render($configuration);
1143 
1144  ‪$contentObjectRenderer->cObjGetSingle('TEXT', ['value' => 'foo'], Argument::any())->shouldHaveBeenCalled();
1145  }
1146 
1151  {
1152  GeneralUtility::setSingletonInstance(
1153  PageRenderer::class,
1154  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1155  );
1156 
1157  $configuration = [
1158  'variables.' => [
1159  'aVar' => 'TEXT',
1160  'aVar.' => [
1161  'value' => 'foo',
1162  ],
1163  ],
1164  ];
1165 
1166  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
1167  ‪$contentObjectRenderer->stdWrapValue(Argument::cetera())->shouldBeCalledTimes(8);
1168  ‪$contentObjectRenderer->cObjGetSingle(Argument::cetera())->willReturn('foo');
1169 
1170  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
1171  ‪$subject->setRequest($this->request);
1172  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
1173 
1174  $standAloneView = $this->prophesize(StandaloneView::class);
1175  $standAloneView->setRequest(Argument::cetera());
1176  $standAloneView->setTemplatePathAndFilename(Argument::cetera())->willReturn(new ReturnTypeNode('void'));
1177  $standAloneView->render(Argument::cetera())->willReturn('');
1178  $standAloneView->renderSection(Argument::cetera())->willReturn('');
1179  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
1180 
1181  ‪$subject->render($configuration);
1182 
1183  $standAloneView->assignMultiple(['aVar' => 'foo', 'data' => [], 'current' => null])
1184  ->willReturn(new ReturnTypeNode('void'))
1185  ->shouldHaveBeenCalled();
1186  }
1187 
1191  public function ‪renderAssignsContentObjectRendererDataToView(): void
1192  {
1193  GeneralUtility::setSingletonInstance(
1194  PageRenderer::class,
1195  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1196  );
1197 
1198  $this->‪addMockViewToSubject();
1199  $this->contentObjectRenderer->data = ['foo'];
1200  $this->standaloneView
1201  ->expects(self::once())
1202  ->method('assignMultiple')
1203  ->with(['data' => ['foo'], 'current' => null]);
1204  $this->subject->render([]);
1205  }
1206 
1211  {
1212  GeneralUtility::setSingletonInstance(
1213  PageRenderer::class,
1214  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1215  );
1216 
1217  $this->‪addMockViewToSubject();
1218  $this->contentObjectRenderer->data = ['currentKey' => 'currentValue'];
1219  $this->contentObjectRenderer->currentValKey = 'currentKey';
1220  $this->standaloneView
1221  ->expects(self::once())
1222  ->method('assignMultiple')
1223  ->with(['data' => ['currentKey' => 'currentValue'], 'current' => 'currentValue']);
1224  $this->subject->render([]);
1225  }
1226 
1230  public function ‪renderCallsRenderOnStandaloneView(): void
1231  {
1232  GeneralUtility::setSingletonInstance(
1233  PageRenderer::class,
1234  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1235  );
1236 
1237  $this->‪addMockViewToSubject();
1238  $this->standaloneView
1239  ->expects(self::once())
1240  ->method('render');
1241  $this->subject->render([]);
1242  }
1243 
1248  {
1249  $configuration = [
1250  'stdWrap.' => [
1251  'foo' => 'bar',
1252  ],
1253  ];
1254 
1255  GeneralUtility::setSingletonInstance(
1256  PageRenderer::class,
1257  new PageRenderer(...$this->getPageRendererConstructorArgs()),
1258  );
1259 
1260  ‪$contentObjectRenderer = $this->prophesize(ContentObjectRenderer::class);
1261 
1262  ‪$subject = new FluidTemplateContentObject($this->contentDataProcessor);
1263  ‪$subject->setRequest($this->request);
1264  ‪$subject->setContentObjectRenderer(‪$contentObjectRenderer->reveal());
1265 
1266  $standAloneView = $this->prophesize(StandaloneView::class);
1267  $standAloneView->setRequest(Argument::cetera());
1268  $standAloneView->setTemplatePathAndFilename('')->shouldBeCalled();
1269  $standAloneView->assignMultiple(['data' => [], 'current' => null])->shouldbeCalled();
1270  $standAloneView->renderSection(Argument::cetera())->willReturn('');
1271  $standAloneView->render()->willReturn('baz');
1272  GeneralUtility::addInstance(StandaloneView::class, $standAloneView->reveal());
1273 
1274  ‪$subject->render($configuration);
1275 
1276  ‪$contentObjectRenderer->stdWrap('baz', ['foo' => 'bar'])->shouldHaveBeenCalled();
1277  }
1278 
1287  AbstractTemplateView $viewMock,
1288  ?string $expectedHeader,
1289  ?string $expectedFooter
1290  ): void {
1291  $pageRendererMock = $this->getMockBuilder(PageRenderer::class)
1292  ->setConstructorArgs($this->getPageRendererConstructorArgs())
1293  ->onlyMethods([
1294  'addHeaderData',
1295  'addFooterData',
1296  ])
1297  ->getMock();
1298  if ($expectedHeader !== null && !empty(trim($expectedHeader))) {
1299  $pageRendererMock->expects(self::once())->method('addHeaderData')->with($expectedHeader);
1300  } else {
1301  $pageRendererMock->expects(self::never())->method('addHeaderData');
1302  }
1303  if ($expectedFooter !== null && !empty(trim($expectedFooter))) {
1304  $pageRendererMock->expects(self::once())->method('addFooterData')->with($expectedFooter);
1305  } else {
1306  $pageRendererMock->expects(self::never())->method('addFooterData');
1307  }
1308 
1309  ‪$subject = $this->getMockBuilder(FluidTemplateContentObject::class)->onlyMethods(['getPageRenderer'])->disableOriginalConstructor()->getMock();
1310  ‪$subject->expects(self::once())->method('getPageRenderer')->willReturn($pageRendererMock);
1311  $viewProperty = new \ReflectionProperty(‪$subject, 'view');
1312  $viewProperty->setAccessible(true);
1313  $viewProperty->setValue(‪$subject, $viewMock);
1314 
1315  $method = new \ReflectionMethod(‪$subject, 'renderFluidTemplateAssetsIntoPageRenderer');
1316  $method->setAccessible(true);
1317  $method->invoke(‪$subject);
1318  }
1319 
1323  public function ‪headerAssetDataProvider(): array
1324  {
1325  $viewWithHeaderData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock();
1326  $viewWithHeaderData->expects(self::exactly(2))->method('renderSection')
1327  ->withConsecutive(
1328  [
1329  'HeaderAssets',
1330  self::anything(),
1331  true,
1332  ],
1333  [
1334  'FooterAssets',
1335  self::anything(),
1336  true,
1337  ]
1338  )->willReturnOnConsecutiveCalls('custom-header-data', '');
1339  $viewWithFooterData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock();
1340  $viewWithFooterData->expects(self::exactly(2))->method('renderSection')
1341  ->withConsecutive(
1342  [
1343  'HeaderAssets',
1344  self::anything(),
1345  true,
1346  ],
1347  [
1348  'FooterAssets',
1349  self::anything(),
1350  true,
1351  ]
1352  )->willReturn('', 'custom-footer-data');
1353  $viewWithBothData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock();
1354  $viewWithBothData->expects(self::exactly(2))->method('renderSection')
1355  ->withConsecutive(
1356  [
1357  'HeaderAssets',
1358  self::anything(),
1359  true,
1360  ],
1361  [
1362  'FooterAssets',
1363  self::anything(),
1364  true,
1365  ]
1366  )->willReturnOnConsecutiveCalls('custom-header-data', 'custom-footer-data');
1367  return [
1368  [$viewWithHeaderData, 'custom-header-data', ''],
1369  [$viewWithFooterData, '', 'custom-footer-data'],
1370  [$viewWithBothData, 'custom-header-data', 'custom-footer-data'],
1371  ];
1372  }
1373 }
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderFluidTemplateAssetsIntoPageRendererRendersAndAttachesAssets
‪renderFluidTemplateAssetsIntoPageRendererRendersAndAttachesAssets(AbstractTemplateView $viewMock, ?string $expectedHeader, ?string $expectedFooter)
Definition: FluidTemplateContentObjectTest.php:1285
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderThrowsExceptionForNotAllowedVariableCurrent
‪renderThrowsExceptionForNotAllowedVariableCurrent()
Definition: FluidTemplateContentObjectTest.php:1093
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForExtbaseControllerName
‪renderCallsStandardWrapValueForExtbaseControllerName()
Definition: FluidTemplateContentObjectTest.php:915
‪TYPO3\CMS\Core\Core\Environment\getPublicPath
‪static string getPublicPath()
Definition: Environment.php:204
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsExtbaseControllerExtensionNameInRequest
‪renderSetsExtbaseControllerExtensionNameInRequest()
Definition: FluidTemplateContentObjectTest.php:799
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$contentObjectRendererProphecy
‪ObjectProphecy $contentObjectRendererProphecy
Definition: FluidTemplateContentObjectTest.php:65
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsTemplateFileInView
‪renderSetsTemplateFileInView()
Definition: FluidTemplateContentObjectTest.php:195
‪TYPO3\CMS\Frontend\ContentObject\ContentDataProcessor
Definition: ContentDataProcessor.php:27
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForFormat
‪renderCallsStandardWrapValueForFormat()
Definition: FluidTemplateContentObjectTest.php:693
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsTemplateFileByTemplateNameStdWrapInView
‪renderSetsTemplateFileByTemplateNameStdWrapInView()
Definition: FluidTemplateContentObjectTest.php:298
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$request
‪MockObject $request
Definition: FluidTemplateContentObjectTest.php:82
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\fallbacksForPartialRootPathAreAppendedToPartialRootPath
‪fallbacksForPartialRootPathAreAppendedToPartialRootPath()
Definition: FluidTemplateContentObjectTest.php:620
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsExtbaseControllerActionNameInRequest
‪renderSetsExtbaseControllerActionNameInRequest()
Definition: FluidTemplateContentObjectTest.php:949
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsFormatInView
‪renderSetsFormatInView()
Definition: FluidTemplateContentObjectTest.php:660
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForExtbaseControllerExtensionName
‪renderCallsStandardWrapValueForExtbaseControllerExtensionName()
Definition: FluidTemplateContentObjectTest.php:840
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\fallbacksForLayoutRootPathAreAppendedToLayoutRootPath
‪fallbacksForLayoutRootPathAreAppendedToLayoutRootPath()
Definition: FluidTemplateContentObjectTest.php:463
‪TYPO3\CMS\Core\Page\ImportMapFactory
Definition: ImportMapFactory.php:26
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\fallbacksForLayoutRootPathAreSet
‪fallbacksForLayoutRootPathAreSet()
Definition: FluidTemplateContentObjectTest.php:443
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForPartialRootPath
‪renderCallsStandardWrapValueForPartialRootPath()
Definition: FluidTemplateContentObjectTest.php:570
‪TYPO3\CMS\Core\Page\ImportMap
Definition: ImportMap.php:33
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsExtbaseControllerNameInRequest
‪renderSetsExtbaseControllerNameInRequest()
Definition: FluidTemplateContentObjectTest.php:874
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapForGivenTemplateRootPathsWithStandardWrap
‪renderCallsStandardWrapForGivenTemplateRootPathsWithStandardWrap()
Definition: FluidTemplateContentObjectTest.php:153
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$subject
‪MockObject $subject
Definition: FluidTemplateContentObjectTest.php:62
‪TYPO3\CMS\Core\Tests\Unit\Page\PageRendererFactoryTrait
Definition: PageRendererFactoryTrait.php:42
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\headerAssetDataProvider
‪array headerAssetDataProvider()
Definition: FluidTemplateContentObjectTest.php:1322
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderAssignsContentObjectRendererCurrentValueToView
‪renderAssignsContentObjectRendererCurrentValueToView()
Definition: FluidTemplateContentObjectTest.php:1209
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsCObjGetSingleForAllowedVariable
‪renderCallsCObjGetSingleForAllowedVariable()
Definition: FluidTemplateContentObjectTest.php:1112
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderAssignsContentObjectRendererDataToView
‪renderAssignsContentObjectRendererDataToView()
Definition: FluidTemplateContentObjectTest.php:1190
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\fallbacksForPartialRootPathAreSet
‪fallbacksForPartialRootPathAreSet()
Definition: FluidTemplateContentObjectTest.php:603
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderAssignsRenderedContentObjectVariableToView
‪renderAssignsRenderedContentObjectVariableToView()
Definition: FluidTemplateContentObjectTest.php:1149
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest
Definition: FluidTemplateContentObjectTest.php:54
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject
Definition: CaseContentObjectTest.php:18
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\setUp
‪setUp()
Definition: FluidTemplateContentObjectTest.php:87
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\layoutRootPathsHasStdWrapSupport
‪layoutRootPathsHasStdWrapSupport()
Definition: FluidTemplateContentObjectTest.php:403
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: FluidTemplateContentObjectTest.php:57
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:37
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapForExtbaseControllerActionName
‪renderCallsStandardWrapForExtbaseControllerActionName()
Definition: FluidTemplateContentObjectTest.php:989
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\partialRootPathsHasStdWrapSupport
‪partialRootPathsHasStdWrapSupport()
Definition: FluidTemplateContentObjectTest.php:532
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForLayoutRootPath
‪renderCallsStandardWrapValueForLayoutRootPath()
Definition: FluidTemplateContentObjectTest.php:368
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$contentObjectRenderer
‪ContentObjectRenderer $contentObjectRenderer
Definition: FluidTemplateContentObjectTest.php:67
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsExtbasePluginNameInRequest
‪renderSetsExtbasePluginNameInRequest()
Definition: FluidTemplateContentObjectTest.php:725
‪TYPO3\CMS\Core\TypoScript\TypoScriptService
Definition: TypoScriptService.php:25
‪TYPO3\CMS\Frontend\ContentObject\FluidTemplateContentObject
Definition: FluidTemplateContentObject.php:30
‪TYPO3\CMS\Extbase\Mvc\RequestInterface
Definition: RequestInterface.php:24
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapValueForExtbasePluginName
‪renderCallsStandardWrapValueForExtbasePluginName()
Definition: FluidTemplateContentObjectTest.php:765
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsPartialRootPathInView
‪renderSetsPartialRootPathInView()
Definition: FluidTemplateContentObjectTest.php:501
‪TYPO3\CMS\Fluid\View\StandaloneView
Definition: StandaloneView.php:30
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:110
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsTemplateFileByTemplateInView
‪renderSetsTemplateFileByTemplateInView()
Definition: FluidTemplateContentObjectTest.php:225
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsInitializeStandaloneViewInstance
‪renderCallsInitializeStandaloneViewInstance()
Definition: FluidTemplateContentObjectTest.php:139
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsStandardWrapOnResultStringIfGivenInConfiguration
‪renderCallsStandardWrapOnResultStringIfGivenInConfiguration()
Definition: FluidTemplateContentObjectTest.php:1246
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderThrowsExceptionForNotAllowedVariableData
‪renderThrowsExceptionForNotAllowedVariableData()
Definition: FluidTemplateContentObjectTest.php:1074
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$standaloneView
‪MockObject $standaloneView
Definition: FluidTemplateContentObjectTest.php:77
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:35
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderCallsRenderOnStandaloneView
‪renderCallsRenderOnStandaloneView()
Definition: FluidTemplateContentObjectTest.php:1229
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\$contentDataProcessor
‪ContentDataProcessor $contentDataProcessor
Definition: FluidTemplateContentObjectTest.php:72
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsLayoutRootPathInView
‪renderSetsLayoutRootPathInView()
Definition: FluidTemplateContentObjectTest.php:337
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:35
‪TYPO3\CMS\Frontend\DataProcessing\DataProcessorRegistry
Definition: DataProcessorRegistry.php:28
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\addMockViewToSubject
‪addMockViewToSubject()
Definition: FluidTemplateContentObjectTest.php:117
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\constructSetsContentObjectRenderer
‪constructSetsContentObjectRenderer()
Definition: FluidTemplateContentObjectTest.php:128
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderAssignsSettingsArrayToView
‪renderAssignsSettingsArrayToView()
Definition: FluidTemplateContentObjectTest.php:1024
‪TYPO3\CMS\Frontend\Tests\Unit\ContentObject\FluidTemplateContentObjectTest\renderSetsTemplateFileByTemplateNameInView
‪renderSetsTemplateFileByTemplateNameInView()
Definition: FluidTemplateContentObjectTest.php:260