‪TYPO3CMS  11.5
RedirectHandlerTest.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 Generator;
21 use Prophecy\Prophecy\ObjectProphecy;
22 use Psr\Http\Message\ServerRequestInterface;
34 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
35 
39 class ‪RedirectHandlerTest extends UnitTestCase
40 {
41  use \Prophecy\PhpUnit\ProphecyTrait;
47  protected ‪$resetSingletonInstances = true;
48 
52  protected ‪$subject;
53 
57  protected ‪$typo3Request;
58 
60  protected ObjectProphecy ‪$serverRequestHandler;
61 
63  protected ObjectProphecy ‪$redirectModeHandler;
64 
66  protected ObjectProphecy ‪$context;
67 
69  protected ObjectProphecy ‪$redirectUrlValidator;
70 
71  protected function ‪setUp(): void
72  {
73  parent::setUp();
74 
75  $this->serverRequestHandler = $this->prophesize(ServerRequestHandler::class);
76  $this->redirectModeHandler = $this->prophesize(RedirectModeHandler::class);
77  $this->context = $this->prophesize(Context::class);
78  $this->redirectUrlValidator = $this->prophesize(RedirectUrlValidator::class);
79 
80  ‪$GLOBALS['TSFE'] = $this->prophesize(TypoScriptFrontendController::class)->reveal();
81 
82  $this->subject = new ‪RedirectHandler(
83  $this->serverRequestHandler->reveal(),
84  $this->redirectModeHandler->reveal(),
85  $this->context->reveal(),
86  $this->redirectUrlValidator->reveal()
87  );
88  }
89 
94  public function ‪processShouldReturnStringForLoginTypeLogout(string $expect, string $redirectMode): void
95  {
96  $this->redirectModeHandler->redirectModeLogout(0)->willReturn('');
97 
98  self::assertEquals($expect, $this->subject->processRedirect('logout', new ‪RedirectConfiguration($redirectMode, '', 0, '', 0, 0), ''));
99  }
100 
101  public function ‪loginTypeLogoutDataProvider(): Generator
102  {
103  yield 'empty string on empty redirect mode' => ['', ''];
104  yield 'empty string on redirect mode logout' => ['', 'logout'];
105  }
106 
112  string $expected,
113  array $redirectModes,
114  array $body,
115  bool $userLoggedIn
116  ): void {
117  $this->‪setUserLoggedIn($userLoggedIn);
118 
119  $this->serverRequestHandler
120  ->getRedirectUrlRequestParam()
121  ->willReturn($body['return_url'] ?? '');
122 
123  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => $redirectModes]);
124  self::assertEquals($expected, $this->subject->getLogoutFormRedirectUrl($configuration, 13, false));
125  }
126 
127  public function ‪getLogoutRedirectUrlDataProvider(): Generator
128  {
129  yield 'empty redirect mode should return empty returnUrl' => ['', [], [], false];
130  yield 'redirect mode getpost should return param return_url' => [
131  'https://dummy.url',
132  ['getpost'],
133  ['return_url' => 'https://dummy.url'],
134  false,
135  ];
136  yield 'redirect mode getpost,logout should return param return_url on not logged in user' => [
137  'https://dummy.url/3',
138  ['getpost', 'logout'],
139  ['return_url' => 'https://dummy.url/3'],
140  false,
141  ];
142  }
143 
148  {
149  $this->‪setUserLoggedIn(true);
150 
151  $this->subject = new ‪RedirectHandler(
152  $this->serverRequestHandler->reveal(),
153  $this->redirectModeHandler->reveal(),
154  $this->context->reveal(),
155  $this->redirectUrlValidator->reveal()
156  );
157 
158  $this->serverRequestHandler
159  ->getRedirectUrlRequestParam()
160  ->willReturn([]);
161 
162  $this->redirectModeHandler
163  ->redirectModeLogout(3)
164  ->willReturn('https://logout.url');
165 
166  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => ['logout']]);
167  self::assertEquals('https://logout.url', $this->subject->getLogoutFormRedirectUrl($configuration, 3, false));
168  }
169 
170  protected function ‪setUserLoggedIn(bool $userLoggedIn): void
171  {
172  $this->context
173  ->getPropertyFromAspect('frontend.user', 'isLoggedIn')
174  ->willReturn($userLoggedIn);
175  }
176 
177  public function ‪getLoginFormRedirectUrlDataProvider(): array
178  {
179  return [
180  'redirect disabled' => [
181  'no url',
182  'getpost',
183  true,
184  '',
185  ],
186  'redirect enabled, GET/POST redirect mode not configured' => [
187  'https://redirect.url',
188  'login',
189  false,
190  '',
191  ],
192  'redirect enabled, GET/POST redirect mode configured' => [
193  'https://redirect.url',
194  'login,getpost',
195  false,
196  'https://redirect.url',
197  ],
198  ];
199  }
200 
206  string $redirectUrl,
207  string $redirectMode,
208  bool $redirectDisabled,
209  string $expected
210  ) {
211  $this->subject = new RedirectHandler(
212  $this->serverRequestHandler->reveal(),
213  $this->redirectModeHandler->reveal(),
214  $this->context->reveal(),
215  $this->redirectUrlValidator->reveal()
216  );
217 
218  $this->serverRequestHandler->getRedirectUrlRequestParam()->willReturn($redirectUrl);
219  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => $redirectMode]);
220  self::assertEquals($expected, $this->subject->getLoginFormRedirectUrl($configuration, $redirectDisabled));
221  }
222 
227  {
228  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters());
229  $request = new ‪Request($serverRequest);
230  $settings = ['redirectMode' => ‪RedirectMode::LOGIN];
231  self::assertEquals('', $this->subject->getReferrerForLoginForm($request, $settings));
232  }
233 
238  {
239  $expectedReferrer = 'https://example.com/page-referrer';
240  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
241  ->withQueryParams(['referer' => $expectedReferrer]);
242  $request = new ‪Request($serverRequest);
243  $this->redirectUrlValidator->isValid($expectedReferrer)->willReturn(true);
244  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
245  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
246  }
247 
252  {
253  $expectedReferrer = 'https://example.com/page-referrer';
254  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
255  ->withParsedBody(['referer' => $expectedReferrer]);
256  $request = new ‪Request($serverRequest);
257  $this->redirectUrlValidator->isValid($expectedReferrer)->willReturn(true);
258  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
259  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
260  }
261 
266  {
267  $expectedReferrer = 'https://example.com/page-referrer';
268  $serverRequest = (new ‪ServerRequest('/login', 'GET', 'php://input', [], ['HTTP_REFERER' => $expectedReferrer]))
269  ->withAttribute('extbase', new ‪ExtbaseRequestParameters());
270  $request = new ‪Request($serverRequest);
271  $this->redirectUrlValidator->isValid($expectedReferrer)->willReturn(true);
272  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
273  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
274  }
275 
280  {
281  $expectedReferrer = 'https://example.com/original-page';
282  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
283  ->withAttribute('originalRequest', new ‪ServerRequest($expectedReferrer));
284  $request = new ‪Request($serverRequest);
285  $this->redirectUrlValidator->isValid($expectedReferrer)->willReturn(true);
286  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
287  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
288  }
289 }
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: RedirectHandlerTest.php:45
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler
Definition: RedirectModeHandler.php:34
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\REFERRER
‪const REFERRER
Definition: RedirectMode.php:33
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$serverRequestHandler
‪ObjectProphecy $serverRequestHandler
Definition: RedirectHandlerTest.php:56
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlShouldReturnAlternativeRedirectUrl
‪getLogoutRedirectUrlShouldReturnAlternativeRedirectUrl(string $expected, array $redirectModes, array $body, bool $userLoggedIn)
Definition: RedirectHandlerTest.php:107
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLoginFormRedirectUrlDataProvider
‪getLoginFormRedirectUrlDataProvider()
Definition: RedirectHandlerTest.php:173
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsEmptyStringIfRedirectModeReferrerDisabled
‪getReferrerForLoginFormReturnsEmptyStringIfRedirectModeReferrerDisabled()
Definition: RedirectHandlerTest.php:222
‪TYPO3\CMS\FrontendLogin\Redirect\ServerRequestHandler
Definition: ServerRequestHandler.php:29
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsOriginalRequestUrlIfCalledBySubRequest
‪getReferrerForLoginFormReturnsOriginalRequestUrlIfCalledBySubRequest()
Definition: RedirectHandlerTest.php:275
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\loginTypeLogoutDataProvider
‪loginTypeLogoutDataProvider()
Definition: RedirectHandlerTest.php:97
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLoginFormRedirectUrlReturnsExpectedValue
‪getLoginFormRedirectUrlReturnsExpectedValue(string $redirectUrl, string $redirectMode, bool $redirectDisabled, string $expected)
Definition: RedirectHandlerTest.php:201
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$subject
‪RedirectHandler $subject
Definition: RedirectHandlerTest.php:49
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest
Definition: RedirectHandlerTest.php:40
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:53
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlDataProvider
‪getLogoutRedirectUrlDataProvider()
Definition: RedirectHandlerTest.php:123
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\setUserLoggedIn
‪setUserLoggedIn(bool $userLoggedIn)
Definition: RedirectHandlerTest.php:166
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsReferrerGetParameter
‪getReferrerForLoginFormReturnsReferrerGetParameter()
Definition: RedirectHandlerTest.php:233
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$redirectModeHandler
‪ObjectProphecy $redirectModeHandler
Definition: RedirectHandlerTest.php:59
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlShouldReturnAlternativeRedirectUrlForLoggedInUserAndRedirectPageLogoutSet
‪getLogoutRedirectUrlShouldReturnAlternativeRedirectUrlForLoggedInUserAndRedirectPageLogoutSet()
Definition: RedirectHandlerTest.php:143
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\setUp
‪setUp()
Definition: RedirectHandlerTest.php:67
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$context
‪ObjectProphecy $context
Definition: RedirectHandlerTest.php:62
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$typo3Request
‪ServerRequestInterface $typo3Request
Definition: RedirectHandlerTest.php:53
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:37
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\LOGIN
‪const LOGIN
Definition: RedirectMode.php:27
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:104
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect
Definition: RedirectHandlerTest.php:18
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\processShouldReturnStringForLoginTypeLogout
‪processShouldReturnStringForLoginTypeLogout(string $expect, string $redirectMode)
Definition: RedirectHandlerTest.php:90
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\fromSettings
‪static fromSettings(array $settings)
Definition: RedirectConfiguration.php:96
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration
Definition: RedirectConfiguration.php:28
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:33
‪TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator
Definition: RedirectUrlValidator.php:32
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode
Definition: RedirectMode.php:26
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectHandler
Definition: RedirectHandler.php:33
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsHttpReferrerParameter
‪getReferrerForLoginFormReturnsHttpReferrerParameter()
Definition: RedirectHandlerTest.php:261
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsReferrerPostParameter
‪getReferrerForLoginFormReturnsReferrerPostParameter()
Definition: RedirectHandlerTest.php:247
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:39
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$redirectUrlValidator
‪ObjectProphecy $redirectUrlValidator
Definition: RedirectHandlerTest.php:65