‪TYPO3CMS  ‪main
MailMessageTest.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 Symfony\Component\Mime\Address;
23 use Symfony\Component\Mime\Header\MailboxHeader;
25 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
26 
27 final class ‪MailMessageTest extends UnitTestCase
28 {
29  protected bool ‪$resetSingletonInstances = true;
30 
32 
33  protected function ‪setUp(): void
34  {
35  parent::setUp();
36  $this->subject = new ‪MailMessage();
37  }
38 
39  #[Test]
40  public function ‪isSentReturnsFalseIfMailWasNotSent(): void
41  {
42  self::assertFalse($this->subject->isSent());
43  }
44 
45  #[Test]
46  public function ‪setSubjectWorksAsExpected(): void
47  {
48  $this->subject->setSubject('Test');
49  self::assertSame('Test', $this->subject->getSubject());
50  $this->subject->setSubject('Test2');
51  self::assertSame('Test2', $this->subject->getSubject());
52  }
53 
54  #[Test]
55  public function ‪setDateWorksAsExpected(): void
56  {
57  $time = time();
58  $this->subject->setDate($time);
59  self::assertSame($time, (int)$this->subject->getDate()->format('U'));
60  $time++;
61  $this->subject->setDate($time);
62  self::assertSame($time, (int)$this->subject->getDate()->format('U'));
63  }
64 
65  #[Test]
66  public function ‪setReturnPathWorksAsExpected(): void
67  {
68  $this->subject->setReturnPath('noreply@typo3.com');
69  self::assertInstanceOf(Address::class, $this->subject->getReturnPath());
70  self::assertSame('noreply@typo3.com', $this->subject->getReturnPath()->getAddress());
71  $this->subject->setReturnPath('no-reply@typo3.com');
72  self::assertInstanceOf(Address::class, $this->subject->getReturnPath());
73  self::assertSame('no-reply@typo3.com', $this->subject->getReturnPath()->getAddress());
74  }
75 
76  public static function ‪setSenderAddressDataProvider(): array
77  {
78  return [
79  'address without name' => [
80  'admin@typo3.com', null, [
81  ['admin@typo3.com'],
82  ],
83  ],
84  'address with name' => [
85  'admin@typo3.com', 'Admin', [
86  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
87  ],
88  ],
89  ];
90  }
91 
92  #[DataProvider('setSenderAddressDataProvider')]
93  #[Test]
94  public function ‪setSenderWorksAsExpected(string $address, ?string $name, array $expectedAddresses): void
95  {
96  $this->subject->setSender($address, $name);
97  self::assertInstanceOf(Address::class, $this->subject->getSender());
98  self::assertSame($address, $this->subject->getSender()->getAddress());
99  $this->‪assertCorrectAddresses([$this->subject->getSender()], $expectedAddresses);
100  }
101 
102  public static function ‪globalSetAddressDataProvider(): array
103  {
104  return [
105  'address without name' => [
106  'admin@typo3.com', null, [
107  ['admin@typo3.com'],
108  ],
109  ],
110  'address with name' => [
111  'admin@typo3.com', 'Admin', [
112  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
113  ],
114  ],
115  'address with name enclosed in quotes' => [
116  'admin@typo3.com', '"Admin"', [
117  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
118  ],
119  ],
120  'multiple addresses without name' => [
121  [
122  'admin@typo3.com',
123  'system@typo3.com',
124  ], null, [
125  ['admin@typo3.com'],
126  ['system@typo3.com'],
127  ],
128  ],
129  'address as array' => [
130  ['admin@typo3.com' => 'Admin'], null, [
131  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
132  ],
133  ],
134  'multiple addresses as array' => [
135  [
136  'admin@typo3.com' => 'Admin',
137  'system@typo3.com' => 'System',
138  ], null, [
139  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
140  ['system@typo3.com', 'System', '<system@typo3.com>'],
141  ],
142  ],
143  'multiple addresses as array mixed' => [
144  [
145  'admin@typo3.com' => 'Admin',
146  'it@typo3.com',
147  'system@typo3.com' => 'System',
148  ], null, [
149  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
150  ['it@typo3.com'],
151  ['system@typo3.com', 'System', '<system@typo3.com>'],
152  ],
153  ],
154  ];
155  }
156 
157  #[DataProvider('globalSetAddressDataProvider')]
158  #[Test]
159  public function ‪setFromWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
160  {
161  // We first add one address, because set should override / remove existing addresses
162  $this->subject->addFrom('foo@bar.com', 'Foo');
163  $this->subject->setFrom($address, $name);
164  $this->‪assertCorrectAddresses($this->subject->getFrom(), $expectedAddresses);
165  }
166 
167  #[DataProvider('globalSetAddressDataProvider')]
168  #[Test]
169  public function ‪setReplyToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
170  {
171  // We first add one address, because set should override / remove existing addresses
172  $this->subject->addReplyTo('foo@bar.com', 'Foo');
173  $this->subject->setReplyTo($address, $name);
174  $this->‪assertCorrectAddresses($this->subject->getReplyTo(), $expectedAddresses);
175  }
176 
177  #[DataProvider('globalSetAddressDataProvider')]
178  #[Test]
179  public function ‪setToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
180  {
181  // We first add one address, because set should override / remove existing addresses
182  $this->subject->addTo('foo@bar.com', 'Foo');
183  $this->subject->setTo($address, $name);
184  $this->‪assertCorrectAddresses($this->subject->getTo(), $expectedAddresses);
185  }
186 
187  #[DataProvider('globalSetAddressDataProvider')]
188  #[Test]
189  public function ‪setCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
190  {
191  // We first add one address, because set should override / remove existing addresses
192  $this->subject->addCc('foo@bar.com', 'Foo');
193  $this->subject->setCc($address, $name);
194  $this->‪assertCorrectAddresses($this->subject->getCc(), $expectedAddresses);
195  }
196 
197  #[DataProvider('globalSetAddressDataProvider')]
198  #[Test]
199  public function ‪setBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
200  {
201  // We first add one address, because set should override / remove existing addresses
202  $this->subject->addBcc('foo@bar.com', 'Foo');
203  $this->subject->setBcc($address, $name);
204  $this->‪assertCorrectAddresses($this->subject->getBcc(), $expectedAddresses);
205  }
206 
207  public static function ‪globalAddAddressDataProvider(): array
208  {
209  return [
210  'address without name' => [
211  'admin@typo3.com', null, [
212  ['admin@typo3.com'],
213  ],
214  ],
215  'address with name' => [
216  'admin@typo3.com', 'Admin', [
217  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
218  ],
219  ],
220  'address as array' => [
221  ['admin@typo3.com' => 'Admin'], null, [
222  ['admin@typo3.com', 'Admin', '<admin@typo3.com>'],
223  ],
224  ],
225  ];
226  }
227 
228  #[DataProvider('globalAddAddressDataProvider')]
229  #[Test]
230  public function ‪addFromToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
231  {
232  $this->subject->addFrom($address, $name);
233  $this->‪assertCorrectAddresses($this->subject->getFrom(), $expectedAddresses);
234  }
235 
236  #[DataProvider('globalAddAddressDataProvider')]
237  #[Test]
238  public function ‪addReplyToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
239  {
240  $this->subject->addReplyTo($address, $name);
241  $this->‪assertCorrectAddresses($this->subject->getReplyTo(), $expectedAddresses);
242  }
243 
244  #[DataProvider('globalAddAddressDataProvider')]
245  #[Test]
246  public function ‪addToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
247  {
248  $this->subject->addTo($address, $name);
249  $this->‪assertCorrectAddresses($this->subject->getTo(), $expectedAddresses);
250  }
251 
252  #[DataProvider('globalAddAddressDataProvider')]
253  #[Test]
254  public function ‪addCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
255  {
256  $this->subject->addCc($address, $name);
257  $this->‪assertCorrectAddresses($this->subject->getCc(), $expectedAddresses);
258  }
259 
260  #[DataProvider('globalAddAddressDataProvider')]
261  #[Test]
262  public function ‪addBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses): void
263  {
264  $this->subject->addBcc($address, $name);
265  $this->‪assertCorrectAddresses($this->subject->getBcc(), $expectedAddresses);
266  }
267 
268  #[Test]
269  public function ‪setReadReceiptToToWorksAsExpected(): void
270  {
271  $this->subject->setReadReceiptTo('foo@example.com');
273  $header = $this->subject->getHeaders()->get('Disposition-Notification-To');
274  self::assertSame('foo@example.com', $header->getAddress()->getAddress());
275  }
276 
278  {
279  return [
280  'setFrom' => ['setFrom'],
281  'setReplyTo' => ['setReplyTo'],
282  'setTo' => ['setTo'],
283  'setCc' => ['setCc'],
284  'setBcc' => ['setBcc'],
285  ];
286  }
287 
288  #[DataProvider('exceptionIsThrownForInvalidArgumentCombinationsDataProvider')]
289  #[Test]
290  public function ‪exceptionIsThrownForInvalidArgumentCombinations(string $method): void
291  {
292  $this->expectException(\InvalidArgumentException::class);
293  $this->expectExceptionCode(1570543657);
294  $this->subject->{$method}(['foo@example.com'], 'A name');
295  }
296 
301  protected function ‪assertCorrectAddresses(array $dataToCheck, array $expectedAddresses): void
302  {
303  self::assertIsArray($dataToCheck);
304  self::assertCount(count($expectedAddresses), $dataToCheck);
305  foreach ($expectedAddresses as $key => $expectedAddress) {
306  self::assertIsArray($expectedAddress);
307  self::assertSame($expectedAddress[0], $dataToCheck[$key]->getAddress());
308  foreach ($expectedAddress as $expectedAddressPart) {
309  self::assertStringContainsString($expectedAddressPart, $dataToCheck[$key]->toString());
310  }
311  }
312  }
313 }
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\globalSetAddressDataProvider
‪static globalSetAddressDataProvider()
Definition: MailMessageTest.php:102
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\$resetSingletonInstances
‪bool $resetSingletonInstances
Definition: MailMessageTest.php:29
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\globalAddAddressDataProvider
‪static globalAddAddressDataProvider()
Definition: MailMessageTest.php:207
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\$subject
‪MailMessage $subject
Definition: MailMessageTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\exceptionIsThrownForInvalidArgumentCombinationsDataProvider
‪static exceptionIsThrownForInvalidArgumentCombinationsDataProvider()
Definition: MailMessageTest.php:277
‪TYPO3\CMS\Core\Tests\Unit\Mail
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\addFromToWorksAsExpected
‪addFromToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:230
‪TYPO3\CMS\Core\Mail\MailMessage
Definition: MailMessage.php:28
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setReplyToWorksAsExpected
‪setReplyToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:169
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\addReplyToToWorksAsExpected
‪addReplyToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:238
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\addToToWorksAsExpected
‪addToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:246
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setToToWorksAsExpected
‪setToToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:179
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setDateWorksAsExpected
‪setDateWorksAsExpected()
Definition: MailMessageTest.php:55
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setUp
‪setUp()
Definition: MailMessageTest.php:33
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setSubjectWorksAsExpected
‪setSubjectWorksAsExpected()
Definition: MailMessageTest.php:46
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setBccToWorksAsExpected
‪setBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:199
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\addCcToWorksAsExpected
‪addCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:254
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setReturnPathWorksAsExpected
‪setReturnPathWorksAsExpected()
Definition: MailMessageTest.php:66
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setReadReceiptToToWorksAsExpected
‪setReadReceiptToToWorksAsExpected()
Definition: MailMessageTest.php:269
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\isSentReturnsFalseIfMailWasNotSent
‪isSentReturnsFalseIfMailWasNotSent()
Definition: MailMessageTest.php:40
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setFromWorksAsExpected
‪setFromWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:159
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest
Definition: MailMessageTest.php:28
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\addBccToWorksAsExpected
‪addBccToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:262
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setCcToWorksAsExpected
‪setCcToWorksAsExpected(string|array $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:189
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\assertCorrectAddresses
‪assertCorrectAddresses(array $dataToCheck, array $expectedAddresses)
Definition: MailMessageTest.php:301
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\exceptionIsThrownForInvalidArgumentCombinations
‪exceptionIsThrownForInvalidArgumentCombinations(string $method)
Definition: MailMessageTest.php:290
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setSenderWorksAsExpected
‪setSenderWorksAsExpected(string $address, ?string $name, array $expectedAddresses)
Definition: MailMessageTest.php:94
‪TYPO3\CMS\Core\Tests\Unit\Mail\MailMessageTest\setSenderAddressDataProvider
‪static setSenderAddressDataProvider()
Definition: MailMessageTest.php:76