‪TYPO3CMS  ‪main
RecoveryServiceTest.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\EventDispatcher\EventDispatcherInterface;
24 use Symfony\Component\Mime\Address;
40 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
41 
42 final class ‪RecoveryServiceTest extends UnitTestCase
43 {
44  protected bool ‪$resetSingletonInstances = true;
45 
48  protected MockObject&‪TemplatePaths ‪$templatePaths;
50 
51  protected function ‪setUp(): void
52  {
53  parent::setUp();
54  $this->userRepository = $this->createMock(FrontendUserRepository::class);
55  $this->recoveryConfiguration = $this->createMock(RecoveryConfiguration::class);
56  $this->templatePaths = $this->createMock(TemplatePaths::class);
57 
58  $request = new ‪ServerRequest();
59  $request = $request->withAttribute('applicationType', ‪SystemEnvironmentBuilder::REQUESTTYPE_FE);
60  $normalizedParams = ‪NormalizedParams::createFromRequest($request);
61  $request = $request->withAttribute('normalizedParams', $normalizedParams)->withAttribute('extbase', new ‪ExtbaseRequestParameters());
62  $this->extbaseRequest = new ‪Request($request);
63  }
64 
65  public static function ‪configurationDataProvider(): \Generator
66  {
67  yield 'minimal configuration' => [
68  'uid' => 1,
69  'recoveryConfiguration' => [
70  'lifeTimeTimestamp' => 1234567899,
71  'forgotHash' => '0123456789|some hash',
72  'sender' => new Address('typo3@typo3.typo3', 'TYPO3 Installation'),
73  'mailTemplateName' => 'MailTemplateName',
74  'replyTo' => null,
75  ],
76  'userInformation' => [
77  'uid' => 1,
78  'email' => 'max@mustermann.de',
79  'first_name' => '',
80  'middle_name' => '',
81  'last_name' => '',
82  'username' => 'm.mustermann',
83  ],
84  'receiver' => new Address('max@mustermann.de', 'm.mustermann'),
85  'settings' => ['dateFormat' => 'Y-m-d H:i'],
86  ];
87  yield 'minimal configuration add replyTo Address' => [
88  'uid' => 1,
89  'recoveryConfiguration' => [
90  'lifeTimeTimestamp' => 1234567899,
91  'forgotHash' => '0123456789|some hash',
92  'sender' => new Address('typo3@typo3.typo3', 'TYPO3 Installation'),
93  'mailTemplateName' => 'MailTemplateName',
94  'replyTo' => new Address('reply_to@typo3.typo3', 'reply to TYPO3 Installation'),
95  ],
96  'userInformation' => [
97  'uid' => 1,
98  'email' => 'max@mustermann.de',
99  'first_name' => '',
100  'middle_name' => '',
101  'last_name' => '',
102  'username' => 'm.mustermann',
103  ],
104  'receiver' => new Address('max@mustermann.de', 'm.mustermann'),
105  'settings' => ['dateFormat' => 'Y-m-d H:i'],
106  ];
107  yield 'html mail provided' => [
108  'uid' => 1,
109  'recoveryConfiguration' => [
110  'lifeTimeTimestamp' => 123456789,
111  'forgotHash' => '0123456789|some hash',
112  'sender' => new Address('typo3@typo3.typo3', 'TYPO3 Installation'),
113  'mailTemplateName' => 'MailTemplateName',
114  'replyTo' => null,
115  ],
116  'userInformation' => [
117  'uid' => 1,
118  'email' => 'max@mustermann.de',
119  'first_name' => '',
120  'middle_name' => '',
121  'last_name' => '',
122  'username' => 'm.mustermann',
123  ],
124  'receiver' => new Address('max@mustermann.de', 'm.mustermann'),
125  'settings' => ['dateFormat' => 'Y-m-d H:i'],
126  ];
127  yield 'complex display name instead of username' => [
128  'uid' => 1,
129  'recoveryConfiguration' => [
130  'lifeTimeTimestamp' => 123456789,
131  'forgotHash' => '0123456789|some hash',
132  'sender' => new Address('typo3@typo3.typo3', 'TYPO3 Installation'),
133  'mailTemplateName' => 'MailTemplateName',
134  'replyTo' => null,
135  ],
136  'userInformation' => [
137  'uid' => 1,
138  'email' => 'max@mustermann.de',
139  'first_name' => 'Max',
140  'middle_name' => 'Maximus',
141  'last_name' => 'Mustermann',
142  'username' => 'm.mustermann',
143  ],
144  'receiver' => new Address('max@mustermann.de', 'Max Maximus Mustermann (m.mustermann)'),
145  'settings' => ['dateFormat' => 'Y-m-d H:i'],
146  ];
147  yield 'custom dateFormat and no middle name' => [
148  'uid' => 1,
149  'recoveryConfiguration' => [
150  'lifeTimeTimestamp' => 987654321,
151  'forgotHash' => '0123456789|some hash',
152  'sender' => new Address('typo3@typo3.typo3', 'TYPO3 Installation'),
153  'mailTemplateName' => 'MailTemplateName',
154  'replyTo' => null,
155  ],
156  'userInformation' => [
157  'uid' => 1,
158  'email' => 'max@mustermann.de',
159  'first_name' => 'Max',
160  'middle_name' => '',
161  'last_name' => 'Mustermann',
162  'username' => 'm.mustermann',
163  ],
164  'receiver' => new Address('max@mustermann.de', 'Max Mustermann (m.mustermann)'),
165  'settings' => ['dateFormat' => 'Y-m-d'],
166  ];
167  }
168 
169  #[DataProvider('configurationDataProvider')]
170  #[Test]
172  int ‪$uid,
174  array $userInformation,
175  Address $receiver,
176  array $settings
177  ): void {
179  $uid,
181  $userInformation
182  );
183 
184  $expectedViewVariables = [
185  'receiverName' => $receiver->getName(),
186  'userData' => $userInformation,
187  'url' => 'some uri',
188  'validUntil' => date($settings['dateFormat'], ‪$recoveryConfiguration['lifeTimeTimestamp']),
189  ];
190 
191  $configurationManager = $this->getMockBuilder(ConfigurationManager::class)->disableOriginalConstructor()
192  ->getMock();
193  $configurationManager->method('getConfiguration')->with(‪ConfigurationManager::CONFIGURATION_TYPE_SETTINGS)
194  ->willReturn($settings);
195 
196  $uriBuilder = $this->getMockBuilder(UriBuilder::class)->disableOriginalConstructor()->getMock();
197  $uriBuilder->expects(self::once())->method('reset')->willReturn($uriBuilder);
198  $uriBuilder->expects(self::once())->method('setRequest')->with($this->extbaseRequest)->willReturn($uriBuilder);
199  $uriBuilder->expects(self::once())->method('setCreateAbsoluteUri')->with(true)->willReturn($uriBuilder);
200  $uriBuilder->expects(self::once())->method('uriFor')->with(
201  'showChangePassword',
202  ['hash' => ‪$recoveryConfiguration['forgotHash']],
203  'PasswordRecovery',
204  'felogin',
205  'Login'
206  )->willReturn('some uri');
207 
208  $fluidEmailMock = $this->‪setupFluidEmailMock($receiver, $expectedViewVariables, ‪$recoveryConfiguration);
209 
210  $mailer = $this->getMockBuilder(MailerInterface::class)->disableOriginalConstructor()->getMock();
211  $mailer->expects(self::once())->method('send')->with($fluidEmailMock);
212 
213  $eventDispatcherMock = $this->getMockBuilder(EventDispatcherInterface::class)->getMock();
214  $subject = $this->getMockBuilder(RecoveryService::class)
215  ->onlyMethods(['getEmailSubject'])
216  ->setConstructorArgs(
217  [
218  $mailer,
219  $eventDispatcherMock,
220  $configurationManager,
221  $this->recoveryConfiguration,
222  $uriBuilder,
223  $this->userRepository,
224  ]
225  )->getMock();
226  $subject->method('getEmailSubject')->willReturn('translation');
227 
228  $subject->sendRecoveryEmail($this->extbaseRequest, $userInformation, ‪$recoveryConfiguration['forgotHash']);
229  }
230 
232  int ‪$uid,
234  array $userInformation
235  ): void {
236  $this->recoveryConfiguration->method('getForgotHash')->willReturn(‪$recoveryConfiguration['forgotHash']);
237  $this->recoveryConfiguration->method('getLifeTimeTimestamp')->willReturn(‪$recoveryConfiguration['lifeTimeTimestamp']);
238  $this->recoveryConfiguration->method('getSender')->willReturn(‪$recoveryConfiguration['sender']);
239  $this->recoveryConfiguration->method('getMailTemplateName')->willReturn(‪$recoveryConfiguration['mailTemplateName']);
240  $this->recoveryConfiguration->method('getReplyTo')->willReturn(‪$recoveryConfiguration['replyTo']);
241  $this->recoveryConfiguration->method('getMailTemplatePaths')->willReturn($this->templatePaths);
242 
243  $this->userRepository->method('findUserByUsernameOrEmailOnPages')->with(‪$uid, [])->willReturn($userInformation);
244  }
245 
246  private function ‪setupFluidEmailMock(
247  Address $receiver,
248  array $expectedViewVariables,
250  ): MockObject&‪FluidEmail {
251  $fluidEmailMock = $this->getMockBuilder(FluidEmail::class)->disableOriginalConstructor()->getMock();
252  GeneralUtility::addInstance(FluidEmail::class, $fluidEmailMock);
253  $fluidEmailMock->method('subject')->with('translation')->willReturn($fluidEmailMock);
254  $fluidEmailMock->method('from')->with(‪$recoveryConfiguration['sender'])->willReturn($fluidEmailMock);
255  $fluidEmailMock->method('to')->with($receiver)->willReturn($fluidEmailMock);
256  $fluidEmailMock->method('assignMultiple')->with($expectedViewVariables)->willReturn($fluidEmailMock);
257  $fluidEmailMock->method('setTemplate')->with(‪$recoveryConfiguration['mailTemplateName'])
258  ->willReturn($fluidEmailMock);
259 
260  if (!empty(‪$recoveryConfiguration['replyTo'])) {
261  $fluidEmailMock->method('addReplyTo')->with(‪$recoveryConfiguration['replyTo'])->willReturn($fluidEmailMock);
262  }
263 
264  return $fluidEmailMock;
265  }
266 }
‪TYPO3\CMS\Fluid\View\TemplatePaths
Definition: TemplatePaths.php:39
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\$userRepository
‪MockObject &FrontendUserRepository $userRepository
Definition: RecoveryServiceTest.php:46
‪TYPO3\CMS\FrontendLogin\Domain\Repository\FrontendUserRepository
Definition: FrontendUserRepository.php:28
‪TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder
Definition: UriBuilder.php:38
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\sendRecoveryEmailShouldGenerateMailFromConfiguration
‪sendRecoveryEmailShouldGenerateMailFromConfiguration(int $uid, array $recoveryConfiguration, array $userInformation, Address $receiver, array $settings)
Definition: RecoveryServiceTest.php:171
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\mockRecoveryConfigurationAndUserRepository
‪mockRecoveryConfigurationAndUserRepository(int $uid, array $recoveryConfiguration, array $userInformation)
Definition: RecoveryServiceTest.php:231
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder
Definition: SystemEnvironmentBuilder.php:41
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\configurationDataProvider
‪static configurationDataProvider()
Definition: RecoveryServiceTest.php:65
‪TYPO3\CMS\Core\Mail\MailerInterface
Definition: MailerInterface.php:28
‪TYPO3\CMS\FrontendLogin\Service\RecoveryService
Definition: RecoveryService.php:37
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\$recoveryConfiguration
‪MockObject &RecoveryConfiguration $recoveryConfiguration
Definition: RecoveryServiceTest.php:47
‪TYPO3\CMS\Extbase\Configuration\ConfigurationManager
Definition: ConfigurationManager.php:32
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\setupFluidEmailMock
‪setupFluidEmailMock(Address $receiver, array $expectedViewVariables, array $recoveryConfiguration)
Definition: RecoveryServiceTest.php:246
‪TYPO3\CMS\Core\Mail\FluidEmail
Definition: FluidEmail.php:35
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\$extbaseRequest
‪RequestInterface $extbaseRequest
Definition: RecoveryServiceTest.php:49
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: RecoveryServiceTest.php:44
‪TYPO3\CMS\FrontendLogin\Configuration\RecoveryConfiguration
Definition: RecoveryConfiguration.php:33
‪TYPO3\CMS\Core\Http\ServerRequest
Definition: ServerRequest.php:39
‪TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface\CONFIGURATION_TYPE_SETTINGS
‪const CONFIGURATION_TYPE_SETTINGS
Definition: ConfigurationManagerInterface.php:30
‪TYPO3\CMS\Extbase\Mvc\RequestInterface
Definition: RequestInterface.php:24
‪TYPO3\CMS\Webhooks\Message\$uid
‪identifier readonly int $uid
Definition: PageModificationMessage.php:35
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service
Definition: RecoveryServiceTest.php:18
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest
Definition: RecoveryServiceTest.php:43
‪TYPO3\CMS\Extbase\Mvc\ExtbaseRequestParameters
Definition: ExtbaseRequestParameters.php:35
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\setUp
‪setUp()
Definition: RecoveryServiceTest.php:51
‪TYPO3\CMS\FrontendLogin\Tests\Unit\Service\RecoveryServiceTest\$templatePaths
‪MockObject &TemplatePaths $templatePaths
Definition: RecoveryServiceTest.php:48
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Core\SystemEnvironmentBuilder\REQUESTTYPE_FE
‪const REQUESTTYPE_FE
Definition: SystemEnvironmentBuilder.php:43
‪TYPO3\CMS\Core\Http\NormalizedParams\createFromRequest
‪static static createFromRequest(ServerRequestInterface $request, array $systemConfiguration=null)
Definition: NormalizedParams.php:840
‪TYPO3\CMS\Extbase\Mvc\Request
Definition: Request.php:35
‪TYPO3\CMS\Core\Http\NormalizedParams
Definition: NormalizedParams.php:38