‪TYPO3CMS  ‪main
FormViewHelperTest.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\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use Psr\Http\Message\ServerRequestInterface;
35 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
36 use TYPO3Fluid\Fluid\View\TemplateView;
37 
38 final class ‪FormViewHelperTest extends FunctionalTestCase
39 {
41 
42  protected const ‪LANGUAGE_PRESETS = [
43  'EN' => ['id' => 0, 'title' => 'English', 'locale' => 'en_US.UTF8'],
44  ];
45 
46  public static function ‪isRenderedDataProvider(): array
47  {
48  return [
49  '#1' => [
50  '<f:form action="{action}" method="{method}" fieldNamePrefix="{fieldNamePrefix}" />',
51  [
52  'action' => 'fieldNamePrefix<>&"\'',
53  'method' => 'fieldNamePrefix<>&"\'',
54  'fieldNamePrefix' => 'fieldNamePrefix<>&"\'',
55  ],
56  // first element having "@extension" in name attribute
57  '<input type="hidden" name="fieldNamePrefix&lt;&gt;&amp;&quot;&#039;[__referrer][@extension]" value="" />',
58  ],
59  '#2' => [
60  '{f:form(action:action, method:method, fieldNamePrefix:fieldNamePrefix)}',
61  [
62  'action' => 'fieldNamePrefix<>&"\'',
63  'method' => 'fieldNamePrefix<>&"\'',
64  'fieldNamePrefix' => 'fieldNamePrefix<>&"\'',
65  ],
66  // first element having "@extension" in name attribute
67  '<input type="hidden" name="fieldNamePrefix&lt;&gt;&amp;&quot;&#039;[__referrer][@extension]" value="" />',
68  ],
69  ];
70  }
71 
72  #[DataProvider('isRenderedDataProvider')]
73  #[Test]
74  public function ‪isRendered(string $source, array $variables, string $expectation): void
75  {
76  $context = $this->get(RenderingContextFactory::class)->create();
77  $context->getTemplatePaths()->setTemplateSource($source);
78  $request = $this->‪createRequest();
79  $context->setRequest($request);
80  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
81  $view = new TemplateView($context);
82  $view->assignMultiple($variables);
83  $body = $view->render();
84  $actual = null;
85  if (preg_match('#<input[^>]+name=".+\[@extension\]"[^>]+>#m', $body, $matches)) {
86  $actual = $matches[0];
87  }
88  self::assertSame($expectation, $actual);
89  }
90 
91  #[Test]
93  {
94  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
95  $extendsAbstractEntity->_setProperty('uid', 123);
96  $context = $this->get(RenderingContextFactory::class)->create();
97  $context->getTemplatePaths()->setTemplateSource('<f:form fieldNamePrefix="prefix" objectName="myObjectName" object="{object}" />');
98  $request = $this->‪createRequest();
99  $context->setRequest($request);
100  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
101  $view = new TemplateView($context);
102  $view->assign('object', $extendsAbstractEntity);
103  $expected = '<input type="hidden" name="prefix[myObjectName][__identity]" value="123" />';
104  self::assertStringContainsString($expected, $view->render());
105  }
106 
107  #[Test]
108  public function ‪setFormActionUriRespectsOverriddenArgument(): void
109  {
110  $context = $this->get(RenderingContextFactory::class)->create();
111  $context->getTemplatePaths()->setTemplateSource('<f:form actionUri="foobar" />');
112  $request = $this->‪createRequest();
113  $context->setRequest($request);
114  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
115  $expected = '<form method="post" action="foobar">';
116  self::assertStringContainsString($expected, (new TemplateView($context))->render());
117  }
118 
119  #[Test]
120  public function ‪nameArgumentIsUsedFormHiddenIdentityName(): void
121  {
122  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
123  $extendsAbstractEntity->_setProperty('uid', 123);
124  $context = $this->get(RenderingContextFactory::class)->create();
125  $context->getTemplatePaths()->setTemplateSource('<f:form name="formName" fieldNamePrefix="prefix" object="{object}" />');
126  $request = $this->‪createRequest();
127  $context->setRequest($request);
128  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
129  $view = new TemplateView($context);
130  $view->assign('object', $extendsAbstractEntity);
131  $expected = '<input type="hidden" name="prefix[formName][__identity]" value="123" />';
132  self::assertStringContainsString($expected, $view->render());
133  }
134 
135  #[Test]
136  public function ‪objectNameArgumentOverrulesNameArgument(): void
137  {
138  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
139  $extendsAbstractEntity->_setProperty('uid', 123);
140  $context = $this->get(RenderingContextFactory::class)->create();
141  $context->getTemplatePaths()->setTemplateSource('<f:form name="formName" fieldNamePrefix="prefix" objectName="myObjectName" object="{object}" />');
142  $request = $this->‪createRequest();
143  $context->setRequest($request);
144  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
145  $view = new TemplateView($context);
146  $view->assign('object', $extendsAbstractEntity);
147  $expected = '<input type="hidden" name="prefix[myObjectName][__identity]" value="123" />';
148  self::assertStringContainsString($expected, $view->render());
149  }
150 
151  #[Test]
153  {
154  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
155  $extendsAbstractEntity->_setProperty('uid', 123);
156  $context = $this->get(RenderingContextFactory::class)->create();
157  $context->getTemplatePaths()->setTemplateSource('<f:form fieldNamePrefix="prefix" objectName="myObjectName" object="{object}" />');
158  $request = $this->‪createRequest();
159  $context->setRequest($request);
160  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
161  $view = new TemplateView($context);
162  $view->assign('object', $extendsAbstractEntity);
163  $expected = '<form method="post" action="">' . chr(10) . '<div>';
164  self::assertStringContainsString($expected, $view->render());
165  }
166 
167  #[Test]
169  {
170  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
171  $extendsAbstractEntity->_setProperty('uid', 123);
172  $context = $this->get(RenderingContextFactory::class)->create();
173  $context->getTemplatePaths()->setTemplateSource('<f:form hiddenFieldClassName="hidden" fieldNamePrefix="prefix" objectName="myObjectName" object="{object}" />');
174  $request = $this->‪createRequest();
175  $context->setRequest($request);
176  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
177  $view = new TemplateView($context);
178  $view->assign('object', $extendsAbstractEntity);
179  $expected = '<form method="post" action="">' . chr(10) . '<div class="hidden">';
180  self::assertStringContainsString($expected, $view->render());
181  }
182 
183  #[Test]
185  {
186  $extbaseRequestParameters = new ‪ExtbaseRequestParameters();
187  $extbaseRequestParameters->setControllerActionName('controllerActionName');
188  $extbaseRequestParameters->setControllerName('controllerName');
189  $extbaseRequestParameters->setControllerExtensionName('extensionName');
190  $psr7Request = $this->‪createRequest()->withAttribute('extbase', $extbaseRequestParameters);
191  ‪$GLOBALS['TYPO3_REQUEST'] = $psr7Request;
192  $extbaseRequest = new ‪Request($psr7Request);
193  $extendsAbstractEntity = new ‪ExtendsAbstractEntity();
194  $extendsAbstractEntity->_setProperty('uid', 123);
195  $context = $this->get(RenderingContextFactory::class)->create();
196  $context->getTemplatePaths()->setTemplateSource('<f:form fieldNamePrefix="prefix" objectName="myObjectName" object="{object}" />');
197  $context->setRequest($extbaseRequest);
198  $view = new TemplateView($context);
199  $view->assign('object', $extendsAbstractEntity);
200  $expected = '<form method="post" action="">
201 <div>
202 <input type="hidden" name="prefix[myObjectName][__identity]" value="123" />
203 
204 <input type="hidden" name="prefix[__referrer][@extension]" value="extensionName" />
205 <input type="hidden" name="prefix[__referrer][@controller]" value="controllerName" />
206 <input type="hidden" name="prefix[__referrer][@action]" value="controllerActionName" />
207 <input type="hidden" name="prefix[__referrer][arguments]" value="YTowOnt99e84bd507db45be875f9238be42d954813180d05" />
208 <input type="hidden" name="prefix[__referrer][@request]" value="{&quot;@extension&quot;:&quot;extensionName&quot;,&quot;@controller&quot;:&quot;controllerName&quot;,&quot;@action&quot;:&quot;controllerActionName&quot;}d5e7bc06c14881c8fe6f373c2236c4b62d13465c" />
209 <input type="hidden" name="prefix[__trustedProperties]" value="{&quot;myObjectName&quot;:{&quot;__identity&quot;:1}}9e6686e8fe21e9b4d3f5a89a66fed4193f4758b4" />
210 </div>
211 </form>';
212  self::assertSame($expected, $view->render());
213  }
214 
215  #[Test]
217  {
218  $this->importCSVDataSet(__DIR__ . '/../Fixtures/pages.csv');
220  'test',
221  $this->‪buildSiteConfiguration(1, '/'),
222  );
223  $pageInformation = new ‪PageInformation();
224  $pageInformation->setId(1);
225  $request = $this->‪createRequest()
226  ->withAttribute(
227  'extbase',
229  ->setPluginName('pluginName')
230  ->setControllerActionName('controllerActionName')
231  ->setControllerName('controllerName')
232  ->setControllerExtensionName('extensionName')
233  )
234  ->withAttribute('routing', new ‪PageArguments(1, '0', ['untrusted' => 123]))
235  ->withAttribute('frontend.page.information', $pageInformation);
236  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
237  $context = $this->get(RenderingContextFactory::class)->create();
238  $context->getTemplatePaths()->setTemplateSource('<f:form addQueryString="untrusted" />');
239  $context->setRequest(new ‪Request($request));
240  $view = new TemplateView($context);
241  $expected = '<form method="post" action="/?tx_extensionname_pluginname%5Bcontroller%5D=controllerName&amp;untrusted=123';
242  self::assertStringStartsWith($expected, $view->render());
243  }
244 
245  protected function ‪createRequest(): ServerRequestInterface
246  {
247  $frontendTypoScript = new ‪FrontendTypoScript(new ‪RootNode(), [], [], []);
248  $frontendTypoScript->setSetupTree(new ‪RootNode());
249  $frontendTypoScript->setSetupArray([]);
250  $frontendTypoScript->setConfigArray([]);
251  $serverRequest = (new ‪ServerRequest())
252  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE)
253  ->withAttribute('frontend.typoscript', $frontendTypoScript)
254  ->withAttribute('extbase', new ‪ExtbaseRequestParameters())
255  ->withAttribute('currentContentObject', $this->get(ContentObjectRenderer::class));
256  return new ‪Request($serverRequest);
257  }
258 }
‪TYPO3\CMS\Core\Routing\PageArguments
Definition: PageArguments.php:26
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\renderWrapsHiddenFieldsWithDivForXhtmlCompatibilityWithRewrittenPropertyMapper
‪renderWrapsHiddenFieldsWithDivForXhtmlCompatibilityWithRewrittenPropertyMapper()
Definition: FormViewHelperTest.php:151
‪TYPO3\CMS\Fluid\Tests\Functional\Fixtures\ViewHelpers\ExtendsAbstractEntity
Definition: ExtendsAbstractEntity.php:22
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait
Definition: SiteBasedTestTrait.php:37
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\writeSiteConfiguration
‪writeSiteConfiguration(string $identifier, array $site=[], array $languages=[], array $errorHandling=[])
Definition: SiteBasedTestTrait.php:50
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildSiteConfiguration
‪buildSiteConfiguration(int $rootPageId, string $base='')
Definition: SiteBasedTestTrait.php:88
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\LANGUAGE_PRESETS
‪const LANGUAGE_PRESETS
Definition: FormViewHelperTest.php:41
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\renderHiddenIdentityFieldReturnsAHiddenInputFieldContainingTheObjectsUID
‪renderHiddenIdentityFieldReturnsAHiddenInputFieldContainingTheObjectsUID()
Definition: FormViewHelperTest.php:91
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\renderWrapsHiddenFieldsWithDivAndAnAdditionalClassForXhtmlCompatibilityWithRewrittenPropertyMapper
‪renderWrapsHiddenFieldsWithDivAndAnAdditionalClassForXhtmlCompatibilityWithRewrittenPropertyMapper()
Definition: FormViewHelperTest.php:167
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\nameArgumentIsUsedFormHiddenIdentityName
‪nameArgumentIsUsedFormHiddenIdentityName()
Definition: FormViewHelperTest.php:119
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\renderHiddenReferrerFieldsAddCurrentControllerAndActionAsHiddenFields111
‪renderHiddenReferrerFieldsAddCurrentControllerAndActionAsHiddenFields111()
Definition: FormViewHelperTest.php:215
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\objectNameArgumentOverrulesNameArgument
‪objectNameArgumentOverrulesNameArgument()
Definition: FormViewHelperTest.php:135
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\createRequest
‪createRequest()
Definition: FormViewHelperTest.php:244
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\setFormActionUriRespectsOverriddenArgument
‪setFormActionUriRespectsOverriddenArgument()
Definition: FormViewHelperTest.php:107
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\TypoScript\AST\Node\RootNode
Definition: RootNode.php:26
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest
Definition: FormViewHelperTest.php:39
‪TYPO3\CMS\Fluid\Core\Rendering\RenderingContextFactory
Definition: RenderingContextFactory.php:51
‪TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer
Definition: ContentObjectRenderer.php:102
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\isRenderedDataProvider
‪static isRenderedDataProvider()
Definition: FormViewHelperTest.php:45
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:35
‪TYPO3\CMS\Core\TypoScript\FrontendTypoScript
Definition: FrontendTypoScript.php:30
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder\REQUESTTYPE_FE
‪const REQUESTTYPE_FE
Definition: SystemEnvironmentBuilder.php:43
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\isRendered
‪isRendered(string $source, array $variables, string $expectation)
Definition: FormViewHelperTest.php:73
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:35
‪TYPO3\CMS\Frontend\Page\PageInformation
Definition: PageInformation.php:28
‪TYPO3\CMS\Fluid\Tests\Functional\ViewHelpers\FormViewHelperTest\renderHiddenReferrerFieldsAddCurrentControllerAndActionAsHiddenFields
‪renderHiddenReferrerFieldsAddCurrentControllerAndActionAsHiddenFields()
Definition: FormViewHelperTest.php:183