aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Mail/MessageTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Mail/MessageTest.php')
-rw-r--r--tests/lib/Mail/MessageTest.php294
1 files changed, 294 insertions, 0 deletions
diff --git a/tests/lib/Mail/MessageTest.php b/tests/lib/Mail/MessageTest.php
new file mode 100644
index 00000000000..18ef9793b5b
--- /dev/null
+++ b/tests/lib/Mail/MessageTest.php
@@ -0,0 +1,294 @@
+<?php
+
+/**
+ * SPDX-FileCopyrightText: 2018-2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace Test\Mail;
+
+use OC\Mail\Message;
+use OCP\Mail\Headers\AutoSubmitted;
+use OCP\Mail\IEMailTemplate;
+use PHPUnit\Framework\MockObject\MockObject;
+use Symfony\Component\Mime\Address;
+use Symfony\Component\Mime\Email;
+use Symfony\Component\Mime\Exception\RfcComplianceException;
+use Symfony\Component\Mime\Header\HeaderInterface;
+use Symfony\Component\Mime\Header\Headers;
+use Test\TestCase;
+
+class MessageTest extends TestCase {
+ /** @var Email */
+ private $symfonyEmail;
+ /** @var Message */
+ private $message;
+
+ /**
+ * @return array
+ */
+ public static function mailAddressProvider(): array {
+ return [
+ [
+ ['lukas@owncloud.com' => 'Lukas Reschke'],
+ [new Address('lukas@owncloud.com', 'Lukas Reschke')]
+ ],
+ [
+ [
+ 'lukas@owncloud.com' => 'Lukas Reschke',
+ 'lukas@öwnclöüd.com',
+ 'lukäs@owncloud.örg' => 'Lükäs Réschke'
+ ],
+ [
+ new Address('lukas@owncloud.com', 'Lukas Reschke'),
+ new Address('lukas@öwnclöüd.com'),
+ new Address('lukäs@owncloud.örg', 'Lükäs Réschke')
+ ]
+ ],
+ [
+ ['lukas@öwnclöüd.com'],
+ [new Address('lukas@öwnclöüd.com')]
+ ],
+ ];
+ }
+
+ /**
+ * @return array
+ */
+ public function getMailAddressProvider() {
+ return [
+ [[], []],
+ [['lukas@owncloud.com' => 'Lukas Reschke'], ['lukas@owncloud.com' => 'Lukas Reschke']],
+ ];
+ }
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->symfonyEmail = $this->createMock(Email::class);
+
+ $this->message = new Message($this->symfonyEmail, false);
+ }
+
+ /**
+ *
+ * @param string $unconverted
+ * @param string $expected
+ */
+ #[\PHPUnit\Framework\Attributes\DataProvider('mailAddressProvider')]
+ public function testConvertAddresses($unconverted, $expected): void {
+ $this->assertEquals($expected, self::invokePrivate($this->message, 'convertAddresses', [$unconverted]));
+ }
+
+ public function testSetRecipients(): void {
+ $this->message = $this->message->setFrom(['pierres-general-store@stardewvalley.com' => 'Pierres General Store']);
+ $this->message = $this->message->setTo(['lewis-tent@stardewvalley.com' => "Lewis' Tent Life"]);
+ $this->message = $this->message->setReplyTo(['penny@stardewvalley-library.co.edu' => 'Penny']);
+ $this->message = $this->message->setCc(['gunther@stardewvalley-library.co.edu' => 'Gunther']);
+ $this->message = $this->message->setBcc(['pam@stardewvalley-bus.com' => 'Pam']);
+
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('from')
+ ->with(new Address('pierres-general-store@stardewvalley.com', 'Pierres General Store'));
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('to')
+ ->with(new Address('lewis-tent@stardewvalley.com', "Lewis' Tent Life"));
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('replyTo')
+ ->with(new Address('penny@stardewvalley-library.co.edu', 'Penny'));
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('cc')
+ ->with(new Address('gunther@stardewvalley-library.co.edu', 'Gunther'));
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('bcc')
+ ->with(new Address('pam@stardewvalley-bus.com', 'Pam'));
+
+ $this->message->setRecipients();
+ }
+
+ public function testSetTo(): void {
+ $expected = ['pierres-general-store@stardewvalley.com' => 'Pierres General Store'];
+
+ $message = $this->message->setTo(['pierres-general-store@stardewvalley.com' => 'Pierres General Store']);
+
+ $this->assertEquals($expected, $message->getTo());
+ }
+ public function testSetRecipientsException(): void {
+ $message = $this->message->setTo(['lewis-tent@~~~~.com' => "Lewis' Tent Life"]);
+
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('to')
+ ->willThrowException(new RfcComplianceException());
+
+ $this->expectException(RfcComplianceException::class);
+ $message->setRecipients();
+ }
+
+ public function testSetRecipientsEmptyValues(): void {
+ $message = $this->message->setTo([]);
+
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('to');
+
+ $message->setRecipients();
+ }
+
+ public function testSetGetFrom(): void {
+ $expected = ['pierres-general-store@stardewvalley.com' => 'Pierres General Store'];
+
+ $message = $this->message->setFrom(['pierres-general-store@stardewvalley.com' => 'Pierres General Store']);
+
+ $this->assertEquals($expected, $message->getFrom());
+ }
+
+ public function testSetGetTo(): void {
+ $expected = ['lewis-tent@stardewvalley.com' => "Lewis' Tent Life"];
+
+ $message = $this->message->setTo(['lewis-tent@stardewvalley.com' => "Lewis' Tent Life"]);
+
+ $this->assertEquals($expected, $message->getTo());
+ }
+
+ public function testSetGetReplyTo(): void {
+ $expected = ['penny@stardewvalley-library.co.edu' => 'Penny'];
+
+ $message = $this->message->setReplyTo(['penny@stardewvalley-library.co.edu' => 'Penny']);
+
+ $this->assertEquals($expected, $message->getReplyTo());
+ }
+
+ public function testSetGetCC(): void {
+ $expected = ['gunther@stardewvalley-library.co.edu' => 'Gunther'];
+
+ $message = $this->message->setCc(['gunther@stardewvalley-library.co.edu' => 'Gunther']);
+
+ $this->assertEquals($expected, $message->getCc());
+ }
+
+ public function testSetGetBCC(): void {
+ $expected = ['pam@stardewvalley-bus.com' => 'Pam'];
+
+ $message = $this->message->setBcc(['pam@stardewvalley-bus.com' => 'Pam']);
+
+ $this->assertEquals($expected, $message->getBcc());
+ }
+
+ public function testSetPlainBody(): void {
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('text')
+ ->with('Fancy Body');
+
+ $this->message->setPlainBody('Fancy Body');
+ }
+
+ public function testGetPlainBody(): void {
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('getTextBody')
+ ->willReturn('Fancy Body');
+
+ $this->assertSame('Fancy Body', $this->message->getPlainBody());
+ }
+
+ public function testSetHtmlBody(): void {
+ $this->symfonyEmail
+ ->expects($this->once())
+ ->method('html')
+ ->with('<blink>Fancy Body</blink>', 'utf-8');
+
+ $this->message->setHtmlBody('<blink>Fancy Body</blink>');
+ }
+
+ public function testPlainTextRenderOption(): void {
+ /** @var MockObject|Email $symfonyEmail */
+ $symfonyEmail = $this->getMockBuilder(Email::class)
+ ->disableOriginalConstructor()->getMock();
+ /** @var MockObject|IEMailTemplate $template */
+ $template = $this->getMockBuilder(IEMailTemplate::class)
+ ->disableOriginalConstructor()->getMock();
+
+ $message = new Message($symfonyEmail, true);
+
+ $template
+ ->expects($this->never())
+ ->method('renderHTML');
+ $template
+ ->expects($this->once())
+ ->method('renderText');
+ $template
+ ->expects($this->once())
+ ->method('renderSubject');
+
+ $message->useTemplate($template);
+ }
+
+ public function testBothRenderingOptions(): void {
+ /** @var MockObject|Email $symfonyEmail */
+ $symfonyEmail = $this->getMockBuilder(Email::class)
+ ->disableOriginalConstructor()->getMock();
+ /** @var MockObject|IEMailTemplate $template */
+ $template = $this->getMockBuilder(IEMailTemplate::class)
+ ->disableOriginalConstructor()->getMock();
+
+ $message = new Message($symfonyEmail, false);
+
+ $template
+ ->expects($this->once())
+ ->method('renderHTML');
+ $template
+ ->expects($this->once())
+ ->method('renderText');
+ $template
+ ->expects($this->once())
+ ->method('renderSubject');
+
+ $message->useTemplate($template);
+ }
+
+ public function testSetAutoSubmitted1(): void {
+ $headers = new Headers($this->createMock(HeaderInterface::class));
+ $headers->addTextHeader(AutoSubmitted::HEADER, 'yes');
+ $symfonyEmail = $this->createMock(Email::class);
+
+ $symfonyEmail->method('getHeaders')
+ ->willReturn($headers);
+
+ $message = new Message($symfonyEmail, false);
+ $message->setAutoSubmitted(AutoSubmitted::VALUE_AUTO_GENERATED);
+ $this->assertNotSame('no', $message->getAutoSubmitted());
+ }
+
+ public function testSetAutoSubmitted2(): void {
+ $headers = new Headers($this->createMock(HeaderInterface::class));
+ $headers->addTextHeader(AutoSubmitted::HEADER, 'no');
+ $symfonyEmail = $this->createMock(Email::class);
+
+ $symfonyEmail->method('getHeaders')
+ ->willReturn($headers);
+
+ $message = new Message($symfonyEmail, false);
+ $message->setAutoSubmitted(AutoSubmitted::VALUE_AUTO_GENERATED);
+ $this->assertSame('auto-generated', $message->getAutoSubmitted());
+ }
+
+ public function testGetAutoSubmitted(): void {
+ $headers = new Headers($this->createMock(HeaderInterface::class));
+ $headers->addTextHeader(AutoSubmitted::HEADER, 'no');
+ $symfonyEmail = $this->createMock(Email::class);
+
+ $symfonyEmail->method('getHeaders')
+ ->willReturn($headers);
+
+ $message = new Message($symfonyEmail, false);
+ $this->assertSame('no', $message->getAutoSubmitted());
+ }
+}