‪TYPO3CMS  ‪main
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 PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use PHPUnit\Framework\MockObject\MockObject;
23 use Psr\Http\Message\ServerRequestInterface;
36 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
37 
38 final class ‪RedirectHandlerTest extends UnitTestCase
39 {
40  protected bool ‪$resetSingletonInstances = true;
42  protected ServerRequestInterface ‪$typo3Request;
45 
46  protected function ‪setUp(): void
47  {
48  parent::setUp();
49 
50  $this->redirectModeHandler = $this->createMock(RedirectModeHandler::class);
51  $this->redirectUrlValidator = $this->createMock(RedirectUrlValidator::class);
52 
53  ‪$GLOBALS['TSFE'] = $this->getMockBuilder(TypoScriptFrontendController::class)->disableOriginalConstructor()->getMock();
54 
55  $this->subject = new ‪RedirectHandler(
56  $this->redirectModeHandler,
57  $this->redirectUrlValidator,
58  new ‪Context()
59  );
60  }
61 
62  public static function ‪loginTypeLogoutDataProvider(): \Generator
63  {
64  yield 'empty string on empty redirect mode' => ['', ''];
65  yield 'empty string on redirect mode logout' => ['', 'logout'];
66  }
67 
68  #[DataProvider('loginTypeLogoutDataProvider')]
69  #[Test]
70  public function ‪processShouldReturnStringForLoginTypeLogout(string $expect, string $redirectMode): void
71  {
72  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters());
73  $request = new ‪Request($serverRequest);
74 
75  $this->redirectModeHandler->method('redirectModeLogout')->with($request, 0)->willReturn('');
76 
77  $result = $this->subject->processRedirect($request, 'logout', new ‪RedirectConfiguration($redirectMode, '', 0, '', 0, 0), '');
78  self::assertEquals($expect, $result);
79  }
80 
81  public static function ‪getLogoutRedirectUrlDataProvider(): \Generator
82  {
83  yield 'empty redirect mode should return empty returnUrl' => ['', [], [], false];
84  yield 'redirect mode getpost should return param return_url' => [
85  'https://dummy.url',
86  ['getpost'],
87  ['return_url' => 'https://dummy.url'],
88  false,
89  ];
90  yield 'redirect mode getpost, logout should return param return_url on not logged in user' => [
91  'https://dummy.url/3',
92  ['getpost', 'logout'],
93  ['return_url' => 'https://dummy.url/3'],
94  false,
95  ];
96  }
97 
98  #[DataProvider('getLogoutRedirectUrlDataProvider')]
99  #[Test]
101  string $expected,
102  array $redirectModes,
103  array $body,
104  bool $userLoggedIn
105  ): void {
106  $this->subject = new ‪RedirectHandler(
107  $this->redirectModeHandler,
108  $this->redirectUrlValidator,
109  $this->‪getContextMockWithUserLoggedIn($userLoggedIn)
110  );
111 
112  $serverRequest = (new ‪ServerRequest())->withParsedBody($body)->withAttribute('extbase', new ‪ExtbaseRequestParameters());
113  $request = new ‪Request($serverRequest);
114 
115  if ($expected !== '') {
116  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $body['return_url'])->willReturn(true);
117  }
118 
119  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => $redirectModes]);
120  self::assertEquals($expected, $this->subject->getLogoutFormRedirectUrl($request, $configuration, 13, false));
121  }
122 
123  #[Test]
125  {
126  $this->subject = new ‪RedirectHandler(
127  $this->redirectModeHandler,
128  $this->redirectUrlValidator,
130  );
131 
132  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters());
133  $request = new ‪Request($serverRequest);
134 
135  $this->redirectModeHandler->method('redirectModeLogout')->with($request, 3)->willReturn('https://logout.url');
136 
137  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => ['logout']]);
138  self::assertEquals('https://logout.url', $this->subject->getLogoutFormRedirectUrl($request, $configuration, 3, false));
139  }
140 
141  protected function ‪getContextMockWithUserLoggedIn(bool $userLoggedIn = true): ‪Context
142  {
143  $mockUserAuthentication = $this->getMockBuilder(FrontendUserAuthentication::class)->disableOriginalConstructor()->getMock();
144  $mockUserAuthentication->user['uid'] = $userLoggedIn ? 1 : 0;
145  $context = new ‪Context();
146  $context->setAspect('frontend.user', new ‪UserAspect($mockUserAuthentication));
147  return $context;
148  }
149 
150  public static function ‪getLoginFormRedirectUrlDataProvider(): array
151  {
152  return [
153  'redirect disabled' => [
154  'no url',
155  'getpost',
156  true,
157  '',
158  ],
159  'redirect enabled, GET/POST redirect mode not configured' => [
160  'https://redirect.url',
161  'login',
162  false,
163  '',
164  ],
165  'redirect enabled, GET/POST redirect mode configured, invalid URL' => [
166  'https://invalid-redirect.url',
167  'login,getpost',
168  false,
169  '',
170  ],
171  'redirect enabled, GET/POST redirect mode configured, valid URL' => [
172  'https://redirect.url',
173  'login,getpost',
174  false,
175  'https://redirect.url',
176  ],
177  ];
178  }
179 
180  #[DataProvider('getLoginFormRedirectUrlDataProvider')]
181  #[Test]
183  string $redirectUrl,
184  string $redirectMode,
185  bool $redirectDisabled,
186  string $expected
187  ): void {
188  $this->subject = new ‪RedirectHandler(
189  $this->redirectModeHandler,
190  $this->redirectUrlValidator,
191  new ‪Context()
192  );
193 
194  $serverRequest = (new ‪ServerRequest())->withQueryParams(['redirect_url' => $redirectUrl])->withAttribute('extbase', new ‪ExtbaseRequestParameters());
195  $request = new ‪Request($serverRequest);
196 
197  if ($redirectUrl === $expected) {
198  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $redirectUrl)->willReturn(true);
199  }
200 
201  $configuration = ‪RedirectConfiguration::fromSettings(['redirectMode' => $redirectMode]);
202  self::assertEquals($expected, $this->subject->getLoginFormRedirectUrl($request, $configuration, $redirectDisabled));
203  }
204 
205  #[Test]
207  {
208  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters());
209  $request = new ‪Request($serverRequest);
210  $settings = ['redirectMode' => ‪RedirectMode::LOGIN];
211  self::assertEquals('', $this->subject->getReferrerForLoginForm($request, $settings));
212  }
213 
214  #[Test]
216  {
217  $expectedReferrer = 'https://example.com/page-referrer';
218  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
219  ->withQueryParams(['referer' => $expectedReferrer]);
220  $request = new ‪Request($serverRequest);
221  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $expectedReferrer)->willReturn(true);
222  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
223  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
224  }
225 
226  #[Test]
228  {
229  $expectedReferrer = 'https://example.com/page-referrer';
230  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
231  ->withParsedBody(['referer' => $expectedReferrer]);
232  $request = new ‪Request($serverRequest);
233  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $expectedReferrer)->willReturn(true);
234  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
235  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
236  }
237 
238  #[Test]
240  {
241  $expectedReferrer = 'https://example.com/page-referrer';
242  $serverRequest = (new ‪ServerRequest('/login', 'GET', 'php://input', [], ['HTTP_REFERER' => $expectedReferrer]))
243  ->withAttribute('extbase', new ‪ExtbaseRequestParameters());
244  $request = new ‪Request($serverRequest);
245  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $expectedReferrer)->willReturn(true);
246  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
247  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
248  }
249 
250  #[Test]
252  {
253  $expectedReferrer = 'https://example.com/original-page';
254  $serverRequest = (new ‪ServerRequest())->withAttribute('extbase', new ‪ExtbaseRequestParameters())
255  ->withAttribute('originalRequest', new ‪ServerRequest($expectedReferrer));
256  $request = new ‪Request($serverRequest);
257  $this->redirectUrlValidator->expects(self::once())->method('isValid')->with($request, $expectedReferrer)->willReturn(true);
258  $settings = ['redirectMode' => ‪RedirectMode::REFERRER];
259  self::assertEquals($expectedReferrer, $this->subject->getReferrerForLoginForm($request, $settings));
260  }
261 }
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: RedirectHandlerTest.php:40
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectModeHandler
Definition: RedirectModeHandler.php:33
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\REFERRER
‪const REFERRER
Definition: RedirectMode.php:33
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\loginTypeLogoutDataProvider
‪static loginTypeLogoutDataProvider()
Definition: RedirectHandlerTest.php:62
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlShouldReturnAlternativeRedirectUrl
‪getLogoutRedirectUrlShouldReturnAlternativeRedirectUrl(string $expected, array $redirectModes, array $body, bool $userLoggedIn)
Definition: RedirectHandlerTest.php:100
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsEmptyStringIfRedirectModeReferrerDisabled
‪getReferrerForLoginFormReturnsEmptyStringIfRedirectModeReferrerDisabled()
Definition: RedirectHandlerTest.php:206
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsOriginalRequestUrlIfCalledBySubRequest
‪getReferrerForLoginFormReturnsOriginalRequestUrlIfCalledBySubRequest()
Definition: RedirectHandlerTest.php:251
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLoginFormRedirectUrlReturnsExpectedValue
‪getLoginFormRedirectUrlReturnsExpectedValue(string $redirectUrl, string $redirectMode, bool $redirectDisabled, string $expected)
Definition: RedirectHandlerTest.php:182
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$subject
‪RedirectHandler $subject
Definition: RedirectHandlerTest.php:41
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest
Definition: RedirectHandlerTest.php:39
‪TYPO3\CMS\Core\Context\Context
Definition: Context.php:54
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsReferrerGetParameter
‪getReferrerForLoginFormReturnsReferrerGetParameter()
Definition: RedirectHandlerTest.php:215
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlShouldReturnAlternativeRedirectUrlForLoggedInUserAndRedirectPageLogoutSet
‪getLogoutRedirectUrlShouldReturnAlternativeRedirectUrlForLoggedInUserAndRedirectPageLogoutSet()
Definition: RedirectHandlerTest.php:124
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\setUp
‪setUp()
Definition: RedirectHandlerTest.php:46
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$typo3Request
‪ServerRequestInterface $typo3Request
Definition: RedirectHandlerTest.php:42
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$redirectModeHandler
‪MockObject &RedirectModeHandler $redirectModeHandler
Definition: RedirectHandlerTest.php:43
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\FrontendLogin\Redirect\RedirectMode\LOGIN
‪const LOGIN
Definition: RedirectMode.php:27
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\$redirectUrlValidator
‪MockObject &RedirectUrlValidator $redirectUrlValidator
Definition: RedirectHandlerTest.php:44
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:58
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect
Definition: RedirectHandlerTest.php:18
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getContextMockWithUserLoggedIn
‪getContextMockWithUserLoggedIn(bool $userLoggedIn=true)
Definition: RedirectHandlerTest.php:141
‪$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:70
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration\fromSettings
‪static fromSettings(array $settings)
Definition: RedirectConfiguration.php:75
‪TYPO3\CMS\FrontendLogin\Configuration\RedirectConfiguration
Definition: RedirectConfiguration.php:28
‪TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication
Definition: FrontendUserAuthentication.php:33
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:35
‪TYPO3\CMS\FrontendLogin\Validation\RedirectUrlValidator
Definition: RedirectUrlValidator.php:33
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLoginFormRedirectUrlDataProvider
‪static getLoginFormRedirectUrlDataProvider()
Definition: RedirectHandlerTest.php:150
‪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:239
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getReferrerForLoginFormReturnsReferrerPostParameter
‪getReferrerForLoginFormReturnsReferrerPostParameter()
Definition: RedirectHandlerTest.php:227
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:35
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Redirect\RedirectHandlerTest\getLogoutRedirectUrlDataProvider
‪static getLogoutRedirectUrlDataProvider()
Definition: RedirectHandlerTest.php:81
‪TYPO3\CMS\Core\Context\UserAspect
Definition: UserAspect.php:37