‪TYPO3CMS  ‪main
ActionControllerValidationTest.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;
35 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
37 
41 final class ‪ActionControllerValidationTest extends FunctionalTestCase
42 {
43  protected array ‪$testExtensionsToLoad = [
44  'typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example',
45  ];
46 
47  public function ‪setUp(): void
48  {
49  parent::setUp();
50  $this->importCSVDataSet(__DIR__ . '/Fixtures/ActionControllerValidationTestImport.csv');
51  }
52 
54  {
55  return [
56  'new blog post' => [
57  ['title' => '12'],
58  ['blogPost[title]'],
59  [1428504122],
60  ],
61  'existing blog post' => [
62  ['__identity' => 1, 'title' => '12'],
63  ['blogPost[__identity]', 'blogPost[title]'],
64  [1428504122],
65  ],
66  ];
67  }
68 
69  #[DataProvider('forwardedActionValidatesPreviouslyIgnoredArgumentDataProvider')]
70  #[Test]
71  public function ‪forwardedActionValidatesPreviouslyIgnoredArgument(array $blogPostArgument, array $trustedProperties, array $expectedErrorCodes): void
72  {
73  ‪$GLOBALS['LANG'] = $this->get(LanguageServiceFactory::class)->create('default');
74  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'testkey';
75 
76  $response = new ‪Response();
77  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_BE);
78  ‪$GLOBALS['TYPO3_REQUEST'] = $serverRequest;
79  $request = new ‪Request($serverRequest);
80 
81  $request = $request->withControllerActionName('testForward');
82  $request = $request->withArgument('blogPost', $blogPostArgument);
83  $request = $request->withArgument('__trustedProperties', $this->‪generateTrustedPropertiesToken($trustedProperties));
84 
85  $referrerRequest = [];
86  $referrerRequest['@action'] = 'testForm';
87  $request = $request->withArgument(
88  '__referrer',
89  ['@request' => (new ‪HashService())->appendHmac(json_encode($referrerRequest), HashScope::ReferringRequest->‪prefix())]
90  );
91 
92  $titleMappingResults = new ‪Result();
93  $isDispatched = false;
94  while (!$isDispatched) {
95  $blogController = $this->get(BlogController::class);
96  $response = $blogController->processRequest($request);
97  if ($response instanceof ‪ForwardResponse) {
98  $titleMappingResults = $response->getArgumentsValidationResult()->forProperty('blogPost.title');
100  } else {
101  $isDispatched = true;
102  }
103  }
104 
105  $titleErrors = $titleMappingResults->getFlattenedErrors();
106  self::assertCount(count($expectedErrorCodes), $titleErrors['']);
107 
108  $titleErrors = $titleErrors[''];
110  foreach ($titleErrors as $titleError) {
111  self::assertContains($titleError->getCode(), $expectedErrorCodes);
112  }
113  $response->getBody()->rewind();
114  self::assertEquals('testFormAction', $response->getBody()->getContents());
115  }
116 
117  #[Test]
119  {
120  ‪$GLOBALS['LANG'] = $this->get(LanguageServiceFactory::class)->create('default');
121  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'testkey';
122 
123  $response = new ‪Response();
124  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_BE);
125  ‪$GLOBALS['TYPO3_REQUEST'] = $serverRequest;
126  $request = new ‪Request($serverRequest);
127 
128  $request = $request->withControllerActionName('testRelatedObject');
129  $request = $request->withArgument('blog', ['__identity' => 1, 'description' => str_repeat('test', 40)]);
130  $request = $request->withArgument(
131  'blogPost',
132  ['__identity' => 1, 'title' => '77', 'blog' => ['__identity' => 1, 'title' => str_repeat('test', 21)]]
133  );
134  $request = $request->withArgument(
135  '__trustedProperties',
137  [
138  'blog[__identity]',
139  'blog[description]',
140  'blogPost[__identity]',
141  'blogPost[title]',
142  'blogPost[blog][__identity]',
143  'blogPost[blog][title]',
144  ]
145  )
146  );
147 
148  $referrerRequest = [];
149  $referrerRequest['@action'] = 'testForm';
150  $request = $request->withArgument(
151  '__referrer',
152  ['@request' => (new ‪HashService())->appendHmac(json_encode($referrerRequest), HashScope::ReferringRequest->‪prefix())]
153  );
154 
155  $isDispatched = false;
156  while (!$isDispatched) {
157  $blogController = $this->get(BlogController::class);
158  $response = $blogController->processRequest($request);
159  if ($response instanceof ‪ForwardResponse) {
161  $validationResult = $response->getArgumentsValidationResult();
162 
163  self::assertInstanceOf(ForwardResponse::class, $response);
164  self::assertCount(1, $validationResult->forProperty('blog.title')->getErrors());
165  self::assertCount(1, $validationResult->forProperty('blog.description')->getErrors());
166  self::assertCount(1, $validationResult->forProperty('blogPost.title')->getErrors());
167 
169  } else {
170  $isDispatched = true;
171  }
172  }
173 
174  $response->getBody()->rewind();
175  self::assertEquals('testFormAction', $response->getBody()->getContents());
176  }
177 
178  #[Test]
180  {
181  ‪$GLOBALS['LANG'] = $this->get(LanguageServiceFactory::class)->create('default');
182  ‪$GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey'] = 'testkey';
183 
184  $response = new ‪Response();
185  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
186  ->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_BE);
187  $request = new ‪Request($serverRequest);
188 
189  $request = $request->withControllerActionName('testRelatedObject');
190  $request = $request->withArgument('blog', ['__identity' => 1, 'description' => str_repeat('test', 40)]);
191  $request = $request->withArgument(
192  'blogPost',
193  ['__identity' => 1, 'title' => '77', 'blog' => ['__identity' => 1, 'title' => str_repeat('test', 21)]]
194  );
195  $request = $request->withArgument(
196  '__trustedProperties',
198  [
199  'blog[__identity]',
200  'blog[description]',
201  'blogPost[__identity]',
202  'blogPost[title]',
203  'blogPost[blog][__identity]',
204  'blogPost[blog][title]',
205  ]
206  )
207  );
208 
209  $referrerRequest = [];
210  $referrerRequest['@action'] = 'testForm';
211  $request = $request->withArgument(
212  '__referrer',
213  ['@request' => (new ‪HashService())->appendHmac(json_encode($referrerRequest), HashScope::ReferringRequest->‪prefix())]
214  );
215  ‪$GLOBALS['TYPO3_REQUEST'] = $request;
216 
217  $originalArguments = $request->getArguments();
218  $isDispatched = false;
219  while (!$isDispatched) {
220  $blogController = $this->get(BlogController::class);
221  $response = $blogController->processRequest($request);
222  if ($response instanceof ‪ForwardResponse) {
224  self::assertEquals($originalArguments, $request->getAttribute('extbase')->getOriginalRequest()->getAttribute('extbase')->getArguments());
225  } else {
226  $isDispatched = true;
227  }
228  }
229 
230  $response->getBody()->rewind();
231  self::assertEquals('testFormAction', $response->getBody()->getContents());
232  }
233 
234  protected function ‪generateTrustedPropertiesToken(array $formFieldNames): string
235  {
236  $mvcPropertyMappingConfigurationService = $this->get(
237  MvcPropertyMappingConfigurationService::class
238  );
239  return $mvcPropertyMappingConfigurationService->generateTrustedPropertiesToken($formFieldNames, '');
240  }
241 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation
Definition: ActionControllerValidationTest.php:18
‪TYPO3Tests\BlogExample\Controller\BlogController
Definition: BlogController.php:34
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\validationResultsAreProvidedForTheSameObjectInDifferentArguments
‪validationResultsAreProvidedForTheSameObjectInDifferentArguments()
Definition: ActionControllerValidationTest.php:118
‪TYPO3\CMS\Extbase\Mvc\Dispatcher
Definition: Dispatcher.php:36
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\argumentsOfOriginalRequestRemainOnValidationErrors
‪argumentsOfOriginalRequestRemainOnValidationErrors()
Definition: ActionControllerValidationTest.php:179
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder\REQUESTTYPE_BE
‪const REQUESTTYPE_BE
Definition: SystemEnvironmentBuilder.php:45
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\generateTrustedPropertiesToken
‪generateTrustedPropertiesToken(array $formFieldNames)
Definition: ActionControllerValidationTest.php:234
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Extbase\Error\Result
Definition: Result.php:24
‪TYPO3\CMS\Extbase\Mvc\Dispatcher\buildRequestFromCurrentRequestAndForwardResponse
‪static buildRequestFromCurrentRequestAndForwardResponse(RequestInterface $currentRequest, ForwardResponse $forwardResponse)
Definition: Dispatcher.php:108
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\setUp
‪setUp()
Definition: ActionControllerValidationTest.php:47
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\$testExtensionsToLoad
‪array $testExtensionsToLoad
Definition: ActionControllerValidationTest.php:43
‪TYPO3\CMS\Core\Http\Response
Definition: Response.php:32
‪TYPO3\CMS\Extbase\Error\Error
Definition: Error.php:25
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest
Definition: ActionControllerValidationTest.php:42
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\forwardedActionValidatesPreviouslyIgnoredArgumentDataProvider
‪static forwardedActionValidatesPreviouslyIgnoredArgumentDataProvider()
Definition: ActionControllerValidationTest.php:53
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Extbase\Security\HashScope
‪HashScope
Definition: HashScope.php:25
‪TYPO3\CMS\Extbase\Mvc\Controller\MvcPropertyMappingConfigurationService
Definition: MvcPropertyMappingConfigurationService.php:51
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:35
‪TYPO3\CMS\Extbase\Security\prefix
‪@ prefix
Definition: HashScope.php:30
‪TYPO3\CMS\Core\Crypto\HashService
Definition: HashService.php:27
‪TYPO3\CMS\Extbase\Tests\Functional\Mvc\Validation\ActionControllerValidationTest\forwardedActionValidatesPreviouslyIgnoredArgument
‪forwardedActionValidatesPreviouslyIgnoredArgument(array $blogPostArgument, array $trustedProperties, array $expectedErrorCodes)
Definition: ActionControllerValidationTest.php:71
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:35