‪TYPO3CMS  ‪main
MailerTest.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\Log\LoggerInterface;
23 use Psr\Log\NullLogger;
24 use Symfony\Component\Mailer\Transport\NullTransport;
25 use Symfony\Component\Mailer\Transport\SendmailTransport;
26 use Symfony\Component\Mailer\Transport\TransportInterface;
27 use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
35 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
36 
37 final class ‪MailerTest extends UnitTestCase
38 {
39  protected bool ‪$resetSingletonInstances = true;
40 
41  protected ‪$subject;
43  protected EventDispatcherInterface ‪$eventDispatcher;
44 
45  protected function ‪setUp(): void
46  {
47  parent::setUp();
48  $this->subject = $this->getMockBuilder(Mailer::class)
49  ->onlyMethods([])
50  ->disableOriginalConstructor()
51  ->getMock();
52  $this->logManager = new class () implements ‪LogManagerInterface {
53  public function getLogger(string $name = ''): LoggerInterface
54  {
55  return new NullLogger();
56  }
57  };
58  $this->eventDispatcher = new class () implements EventDispatcherInterface {
59  public function dispatch(object $event, string $eventName = null): object
60  {
61  return $event;
62  }
63  };
64  }
65 
66  #[Test]
68  {
69  $settings = ['transport' => 'mbox', 'transport_mbox_file' => '/path/to/file'];
70  ‪$GLOBALS['TYPO3_CONF_VARS']['MAIL'] = ['transport' => 'sendmail', 'transport_sendmail_command' => 'sendmail -bs'];
71 
72  $transportFactory = $this->createMock(TransportFactory::class);
73  $transportFactory->expects(self::atLeastOnce())->method('get')->with($settings)
74  ->willReturn($this->createMock(SendmailTransport::class));
75  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
76  $this->subject->injectMailSettings($settings);
77  $this->subject->__construct();
78  }
79 
80  #[Test]
82  {
83  $settings = (‪$GLOBALS['TYPO3_CONF_VARS']['MAIL'] = ['transport' => 'sendmail', 'transport_sendmail_command' => 'sendmail -bs']);
84 
85  $transportFactory = $this->createMock(TransportFactory::class);
86  $transportFactory->expects(self::atLeastOnce())->method('get')->with($settings)
87  ->willReturn($this->createMock(SendmailTransport::class));
88  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
89  $this->subject->injectMailSettings($settings);
90  $this->subject->__construct();
91  }
92 
93  public static function ‪wrongConfigurationProvider(): array
94  {
95  return [
96  'smtp but no host' => [['transport' => 'smtp']],
97  'mbox but no file' => [['transport' => 'mbox']],
98  'no instance of TransportInterface' => [['transport' => ErrorPageController::class]],
99  ];
100  }
101 
102  #[DataProvider('wrongConfigurationProvider')]
103  #[Test]
104  public function ‪wrongConfigurationThrowsException(array $settings): void
105  {
106  $this->expectException(Exception::class);
107  $this->expectExceptionCode(1291068569);
108 
109  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
110  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
111  $this->subject->injectMailSettings($settings);
112  $this->subject->__construct();
113  }
114 
115  #[Test]
117  {
118  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
119  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
120  $this->subject->injectMailSettings(['transport' => NullTransport::class]);
121  $this->subject->__construct();
122  }
123 
124  #[Test]
125  public function ‪noPortSettingSetsPortTo25(): void
126  {
127  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
128  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
129  $this->subject->injectMailSettings(['transport' => 'smtp', 'transport_smtp_server' => 'localhost']);
130  $this->subject->__construct();
131  $port = $this->subject->getTransport()->getStream()->getPort();
132  self::assertEquals(25, $port);
133  }
134 
135  #[Test]
136  public function ‪emptyPortSettingSetsPortTo25(): void
137  {
138  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
139  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
140  $this->subject->injectMailSettings(['transport' => 'smtp', 'transport_smtp_server' => 'localhost:']);
141  $this->subject->__construct();
142  $port = $this->subject->getTransport()->getStream()->getPort();
143  self::assertEquals(25, $port);
144  }
145 
146  #[Test]
147  public function ‪givenPortSettingIsRespected(): void
148  {
149  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
150  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
151  $this->subject->injectMailSettings(['transport' => 'smtp', 'transport_smtp_server' => 'localhost:12345']);
152  $this->subject->__construct();
153  $port = $this->subject->getTransport()->getStream()->getPort();
154  self::assertEquals(12345, $port);
155  }
156 
158  {
159  return [
160  'without spool' => [[
161  'transport' => 'sendmail',
162  'spool' => '',
163  ]],
164  'with spool' => [[
165  'transport' => 'sendmail',
166  'spool' => 'memory',
167  ]],
168  ];
169  }
170 
171  #[DataProvider('getRealTransportReturnsNoSpoolTransportProvider')]
172  #[Test]
173  public function ‪getRealTransportReturnsNoSpoolTransport($settings): void
174  {
175  $transportFactory = new ‪TransportFactory($this->eventDispatcher, $this->logManager);
176  GeneralUtility::setSingletonInstance(TransportFactory::class, $transportFactory);
177  $this->subject->injectMailSettings($settings);
178  $transport = $this->subject->getRealTransport();
179 
180  self::assertInstanceOf(TransportInterface::class, $transport);
181  self::assertNotInstanceOf(DelayedTransportInterface::class, $transport);
182  }
183 }
‪TYPO3\CMS\Core\Controller\ErrorPageController
Definition: ErrorPageController.php:30
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\$eventDispatcher
‪EventDispatcherInterface $eventDispatcher
Definition: MailerTest.php:43
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\globalSettingsAreUsedIfNoSettingsAreInjected
‪globalSettingsAreUsedIfNoSettingsAreInjected()
Definition: MailerTest.php:81
‪TYPO3\CMS\Core\Log\LogManagerInterface
Definition: LogManagerInterface.php:24
‪TYPO3\CMS\Core\Tests\Unit\Mail
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\wrongConfigurationProvider
‪static wrongConfigurationProvider()
Definition: MailerTest.php:93
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\noPortSettingSetsPortTo25
‪noPortSettingSetsPortTo25()
Definition: MailerTest.php:125
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest
Definition: MailerTest.php:38
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\$logManager
‪LogManagerInterface $logManager
Definition: MailerTest.php:42
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\emptyPortSettingSetsPortTo25
‪emptyPortSettingSetsPortTo25()
Definition: MailerTest.php:136
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\$subject
‪$subject
Definition: MailerTest.php:41
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\setUp
‪setUp()
Definition: MailerTest.php:45
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\injectedSettingsAreNotReplacedByGlobalSettings
‪injectedSettingsAreNotReplacedByGlobalSettings()
Definition: MailerTest.php:67
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\getRealTransportReturnsNoSpoolTransport
‪getRealTransportReturnsNoSpoolTransport($settings)
Definition: MailerTest.php:173
‪TYPO3\CMS\Core\Mail\Mailer
Definition: Mailer.php:39
‪TYPO3\CMS\Core\Mail\DelayedTransportInterface
Definition: DelayedTransportInterface.php:26
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\providingCorrectClassnameDoesNotThrowException
‪providingCorrectClassnameDoesNotThrowException()
Definition: MailerTest.php:116
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\getRealTransportReturnsNoSpoolTransportProvider
‪static getRealTransportReturnsNoSpoolTransportProvider()
Definition: MailerTest.php:157
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\wrongConfigurationThrowsException
‪wrongConfigurationThrowsException(array $settings)
Definition: MailerTest.php:104
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: MailerTest.php:39
‪TYPO3\CMS\Core\Mail\TransportFactory
Definition: TransportFactory.php:38
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailerTest\givenPortSettingIsRespected
‪givenPortSettingIsRespected()
Definition: MailerTest.php:147