Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChristoph Wurst <christoph@winzerhof-wurst.at>2019-09-04 18:05:19 +0300
committerChristoph Wurst <christoph@winzerhof-wurst.at>2019-09-05 14:45:50 +0300
commitd18ef16578dc34ffd67e48bc5c61654e55461ce9 (patch)
tree0fb85d03cba26c56be550b2cba5072dd6aca4e91 /tests
parenteec81c6c38259c0edc843018581a1f1bd1ab280a (diff)
Move message sending and draft saving code
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'tests')
-rw-r--r--tests/Integration/Framework/ImapTest.php20
-rw-r--r--tests/Integration/Service/MailTransmissionIntegrationTest.php77
-rw-r--r--tests/Listener/AddressCollectionListenerTest.php118
-rw-r--r--tests/Listener/DeleteDraftListenerTest.php230
-rw-r--r--tests/Listener/DraftMailboxCreatorListenerTest.php150
-rw-r--r--tests/Listener/FlagRepliedMessageListenerTest.php202
-rw-r--r--tests/Listener/SaveSentMessageListenerTest.php269
-rw-r--r--tests/Listener/TrashMailboxCreatorListenerTest.php168
-rw-r--r--tests/Service/MailTransmissionTest.php244
9 files changed, 1254 insertions, 224 deletions
diff --git a/tests/Integration/Framework/ImapTest.php b/tests/Integration/Framework/ImapTest.php
index 4eac48987..3a75fb1f1 100644
--- a/tests/Integration/Framework/ImapTest.php
+++ b/tests/Integration/Framework/ImapTest.php
@@ -47,7 +47,7 @@ trait ImapTest {
* @return Horde_Imap_Client_Socket
*/
private function getTestClient() {
- if (is_null($this->client)) {
+ if ($this->client === null) {
$this->client = new Horde_Imap_Client_Socket([
'username' => 'user@domain.tld',
'password' => 'mypassword',
@@ -236,22 +236,4 @@ trait ImapTest {
$this->assertSame($content, $actualContent, 'message content does not match');
}
- public function assertMessageSubject($mailbox, $uid, $subject) {
- $client = $this->getTestClient();
-
- $query = new Horde_Imap_Client_Fetch_Query();
- $query->envelope();
- $result = $client->fetch($mailbox, $query, [
- 'ids' => new Horde_Imap_Client_Ids([$uid]),
- ]);
- $messages = iterator_to_array($result);
- $this->assertCount(1, $messages);
- /* @var $message Horde_Imap_Client_Data_Fetch */
- $message = reset($messages);
-
- $actualSubject = $message->getEnvelope()->subject;
-
- $this->assertSame($subject, $actualSubject, 'message subject does not match');
- }
-
}
diff --git a/tests/Integration/Service/MailTransmissionIntegrationTest.php b/tests/Integration/Service/MailTransmissionIntegrationTest.php
index 98c24a666..5d6be8a3c 100644
--- a/tests/Integration/Service/MailTransmissionIntegrationTest.php
+++ b/tests/Integration/Service/MailTransmissionIntegrationTest.php
@@ -27,21 +27,26 @@ use OCA\Mail\Account;
use OCA\Mail\Contracts\IAttachmentService;
use OCA\Mail\Contracts\IMailTransmission;
use OCA\Mail\Db\MailAccount;
+use OCA\Mail\Db\MailAccountMapper;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MessageMapper;
use OCA\Mail\Model\NewMessageData;
use OCA\Mail\Model\RepliedMessageData;
use OCA\Mail\Service\Attachment\UploadedFile;
-use OCA\Mail\Service\AutoCompletion\AddressCollector;
use OCA\Mail\Service\MailTransmission;
use OCA\Mail\SMTP\SmtpClientFactory;
use OCA\Mail\Tests\Integration\Framework\ImapTest;
use OCA\Mail\Tests\Integration\TestCase;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\ILogger;
use OCP\IUser;
+use OCP\Security\ICrypto;
class MailTransmissionIntegrationTest extends TestCase {
use ImapTest,
- TestUser;
+ TestUser;
/** @var Account */
private $account;
@@ -58,24 +63,41 @@ class MailTransmissionIntegrationTest extends TestCase {
protected function setUp() {
parent::setUp();
+ $this->resetImapAccount();
+
+ /** @var ICrypto $crypo */
$crypo = OC::$server->getCrypto();
- $this->account = new Account(MailAccount::fromParams([
- 'email' => 'user@domain.tld',
- 'inboundHost' => 'localhost',
- 'inboundPort' => '993',
- 'inboundSslMode' => 'ssl',
- 'inboundUser' => 'user@domain.tld',
- 'inboundPassword' => $crypo->encrypt('mypassword'),
- 'outboundHost' => 'localhost',
- 'outboundPort' => '2525',
- 'outboundSslMode' => 'none',
- 'outboundUser' => 'user@domain.tld',
- 'outboundPassword' => $crypo->encrypt('mypassword'),
- ]));
+ /** @var MailAccountMapper $mapper */
+ $mapper = OC::$server->query(MailAccountMapper::class);
+ $mailAccount = MailAccount::fromParams([
+ 'email' => 'user@domain.tld',
+ 'inboundHost' => 'localhost',
+ 'inboundPort' => '993',
+ 'inboundSslMode' => 'ssl',
+ 'inboundUser' => 'user@domain.tld',
+ 'inboundPassword' => $crypo->encrypt('mypassword'),
+ 'outboundHost' => 'localhost',
+ 'outboundPort' => '2525',
+ 'outboundSslMode' => 'none',
+ 'outboundUser' => 'user@domain.tld',
+ 'outboundPassword' => $crypo->encrypt('mypassword'),
+ ]);
+ $mapper->insert($mailAccount);
+
+ $this->account = new Account($mailAccount);
$this->attachmentService = OC::$server->query(IAttachmentService::class);
$this->user = $this->createTestUser();
$userFolder = OC::$server->getUserFolder($this->user->getUID());
- $this->transmission = new MailTransmission(OC::$server->query(AddressCollector::class), $userFolder, $this->attachmentService, OC::$server->query(SmtpClientFactory::class), OC::$server->query(ILogger::class));
+ $this->transmission = new MailTransmission(
+ $userFolder,
+ $this->attachmentService,
+ OC::$server->query(IMAPClientFactory::class),
+ OC::$server->query(SmtpClientFactory::class),
+ OC::$server->query(IEventDispatcher::class),
+ OC::$server->query(MailboxMapper::class),
+ OC::$server->query(MessageMapper::class),
+ OC::$server->query(ILogger::class)
+ );
}
public function testSendMail() {
@@ -94,10 +116,10 @@ class MailTransmissionIntegrationTest extends TestCase {
]);
$this->attachmentService->addFile('gerald', $file);
$message = NewMessageData::fromRequest($this->account, 'recipient@domain.com', null, null, 'greetings', 'hello there', [
- [
- 'isLocal' => 'true',
- 'id' => 13,
- ],
+ [
+ 'isLocal' => 'true',
+ 'id' => 13,
+ ],
]);
$reply = new RepliedMessageData($this->account, null, null);
@@ -110,10 +132,10 @@ class MailTransmissionIntegrationTest extends TestCase {
$userFolder = OC::$server->getUserFolder($this->user->getUID());
$userFolder->newFile('text.txt');
$message = NewMessageData::fromRequest($this->account, 'recipient@domain.com', null, null, 'greetings', 'hello there', [
- [
- 'isLocal' => false,
- 'fileName' => 'text.txt',
- ],
+ [
+ 'isLocal' => false,
+ 'fileName' => 'text.txt',
+ ],
]);
$reply = new RepliedMessageData($this->account, null, null);
@@ -133,11 +155,10 @@ class MailTransmissionIntegrationTest extends TestCase {
$message = NewMessageData::fromRequest($this->account, 'recipient@domain.com', null, null, 'greetings', 'hello there', []);
$reply = new RepliedMessageData($this->account, $inbox, $originalUID);
- $uid = $this->transmission->sendMessage('ferdinand', $message, $reply);
+ $this->transmission->sendMessage('ferdinand', $message, $reply);
$this->assertMailboxExists('Sent');
$this->assertMessageCount(1, 'Sent');
- $this->assertMessageSubject('Sent', $uid, 'Re: greetings');
}
public function testSendReplyWithoutSubject() {
@@ -155,7 +176,6 @@ class MailTransmissionIntegrationTest extends TestCase {
$this->assertMailboxExists('Sent');
$this->assertMessageCount(1, 'Sent');
- $this->assertMessageSubject('Sent', $uid, 'Re: reply test');
}
public function testSendReplyWithoutReplySubject() {
@@ -169,11 +189,10 @@ class MailTransmissionIntegrationTest extends TestCase {
$message = NewMessageData::fromRequest($this->account, 'recipient@domain.com', null, null, 'Re: reply test', 'hello there', []);
$reply = new RepliedMessageData($this->account, $inbox, $originalUID);
- $uid = $this->transmission->sendMessage('ferdinand', $message, $reply);
+ $this->transmission->sendMessage('ferdinand', $message, $reply);
$this->assertMailboxExists('Sent');
$this->assertMessageCount(1, 'Sent');
- $this->assertMessageSubject('Sent', $uid, 'Re: reply test');
}
public function testSaveNewDraft() {
diff --git a/tests/Listener/AddressCollectionListenerTest.php b/tests/Listener/AddressCollectionListenerTest.php
new file mode 100644
index 000000000..92dd70a0b
--- /dev/null
+++ b/tests/Listener/AddressCollectionListenerTest.php
@@ -0,0 +1,118 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Tests\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use Horde_Mime_Mail;
+use OCA\Mail\Account;
+use OCA\Mail\Address;
+use OCA\Mail\AddressList;
+use OCA\Mail\Events\MessageSentEvent;
+use OCA\Mail\Listener\AddressCollectionListener;
+use OCA\Mail\Model\IMessage;
+use OCA\Mail\Model\NewMessageData;
+use OCA\Mail\Model\RepliedMessageData;
+use OCA\Mail\Service\AutoCompletion\AddressCollector;
+use OCA\TwoFactorAdmin\Listener\IListener;
+use OCP\EventDispatcher\Event;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class AddressCollectionListenerTest extends TestCase {
+
+ /** @var AddressCollector|MockObject */
+ private $addressCollector;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var IListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->addressCollector = $this->createMock(AddressCollector::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new AddressCollectionListener(
+ $this->addressCollector,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated() {
+ $event = new Event();
+ $this->addressCollector->expects($this->never())
+ ->method('addAddresses');
+ $this->logger->expects($this->never())->method($this->anything());
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandle() {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ null,
+ $message,
+ $mail
+ );
+ $message->expects($this->once())
+ ->method('getTo')
+ ->willReturn(new AddressList([new Address('to', 'to@email')]));
+ $message->expects($this->once())
+ ->method('getCC')
+ ->willReturn(new AddressList([new Address('cc', 'cc@email')]));
+ $message->expects($this->once())
+ ->method('getBCC')
+ ->willReturn(new AddressList([new Address('bcc', 'bcc@email')]));
+ $this->addressCollector->expects($this->once())
+ ->method('addAddresses')
+ ->with($this->equalTo(new AddressList([
+ new Address('to', 'to@email'),
+ new Address('cc', 'cc@email'),
+ new Address('bcc', 'bcc@email'),
+ ])));
+ $this->logger->expects($this->never())->method($this->anything());
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+}
diff --git a/tests/Listener/DeleteDraftListenerTest.php b/tests/Listener/DeleteDraftListenerTest.php
new file mode 100644
index 000000000..7eef774d2
--- /dev/null
+++ b/tests/Listener/DeleteDraftListenerTest.php
@@ -0,0 +1,230 @@
+<?php
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Tests\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\Events\DraftSavedEvent;
+use OCA\Mail\Events\MessageSentEvent;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MailboxSync;
+use OCA\Mail\IMAP\MessageMapper;
+use OCA\Mail\Listener\DeleteDraftListener;
+use OCA\Mail\Model\IMessage;
+use OCA\Mail\Model\NewMessageData;
+use OCA\Mail\Model\RepliedMessageData;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class DeleteDraftListenerTest extends TestCase {
+
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
+
+ /** @var MessageMapper|MockObject */
+ private $messageMapper;
+
+ /** @var MailboxSync|MockObject */
+ private $mailboxSync;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var IEventListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->messageMapper = $this->createMock(MessageMapper::class);
+ $this->mailboxSync = $this->createMock(MailboxSync::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new DeleteDraftListener(
+ $this->imapClientFactory,
+ $this->mailboxMapper,
+ $this->messageMapper,
+ $this->mailboxSync,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated(): void {
+ $event = new Event();
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandleDraftSavedEventNoUid(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ $event = new DraftSavedEvent(
+ $account,
+ $newMessageData,
+ null
+ );
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleDraftSavedEventCreatesDraftsMailbox(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ $event = new DraftSavedEvent(
+ $account,
+ $newMessageData,
+ 123
+ );
+ /** @var \Horde_Imap_Client_Socket|MockObject $client */
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $mailbox = new Mailbox();
+ $mailbox->setName('Drafts');
+ $this->mailboxMapper->expects($this->at(0))
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willThrowException(new DoesNotExistException(''));
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Drafts',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_DRAFTS,
+ ],
+ ]
+ );
+ $this->mailboxSync->expects($this->once())
+ ->method('sync')
+ ->with($account, true);
+ $this->mailboxMapper->expects($this->at(1))
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willReturn($mailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with(
+ $client,
+ $mailbox,
+ 123,
+ \Horde_Imap_Client::FLAG_DELETED
+ );
+ $client->expects($this->once())
+ ->method('expunge')
+ ->with('Drafts');
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentEventNoUid(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ $event = new DraftSavedEvent(
+ $account,
+ $newMessageData,
+ null
+ );
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentEvent(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ /** @var \Horde_Imap_Client_Socket|MockObject $client */
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $mailbox = new Mailbox();
+ $mailbox->setName('Drafts');
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willReturn($mailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with(
+ $client,
+ $mailbox,
+ 123,
+ \Horde_Imap_Client::FLAG_DELETED
+ );
+ $client->expects($this->once())
+ ->method('expunge')
+ ->with('Drafts');
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+}
diff --git a/tests/Listener/DraftMailboxCreatorListenerTest.php b/tests/Listener/DraftMailboxCreatorListenerTest.php
new file mode 100644
index 000000000..7e36cbb4f
--- /dev/null
+++ b/tests/Listener/DraftMailboxCreatorListenerTest.php
@@ -0,0 +1,150 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Tests\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\Events\SaveDraftEvent;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MailboxSync;
+use OCA\Mail\Listener\DraftMailboxCreatorListener;
+use OCA\Mail\Model\NewMessageData;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\EventDispatcher\Event;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class DraftMailboxCreatorListenerTest extends TestCase {
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
+
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var MailboxSync|MockObject */
+ private $mailboxSync;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var DraftMailboxCreatorListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->mailboxSync = $this->createMock(MailboxSync::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new DraftMailboxCreatorListener(
+ $this->mailboxMapper,
+ $this->imapClientFactory,
+ $this->mailboxSync,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated() {
+ $event = new Event();
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandleSaveDraftEventMailboxExists(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ $event = new SaveDraftEvent(
+ $account,
+ $newMessageData,
+ 123
+ );
+ /** @var \Horde_Imap_Client_Socket|MockObject $client */
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $mailbox = new Mailbox();
+ $mailbox->setName('Drafts');
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willReturn($mailbox);
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleSaveDraftEventCreatesDraftsMailbox(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ $event = new SaveDraftEvent(
+ $account,
+ $newMessageData,
+ 123
+ );
+ /** @var \Horde_Imap_Client_Socket|MockObject $client */
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $mailbox = new Mailbox();
+ $mailbox->setName('Drafts');
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willThrowException(new DoesNotExistException(''));
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Drafts',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_DRAFTS,
+ ],
+ ]
+ );
+ $this->mailboxSync->expects($this->once())
+ ->method('sync')
+ ->with($account, true);
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+}
diff --git a/tests/Listener/FlagRepliedMessageListenerTest.php b/tests/Listener/FlagRepliedMessageListenerTest.php
new file mode 100644
index 000000000..73f3ca4eb
--- /dev/null
+++ b/tests/Listener/FlagRepliedMessageListenerTest.php
@@ -0,0 +1,202 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Test\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\Events\MessageSentEvent;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MessageMapper;
+use OCA\Mail\Listener\FlagRepliedMessageListener;
+use OCA\Mail\Model\IMessage;
+use OCA\Mail\Model\NewMessageData;
+use OCA\Mail\Model\RepliedMessageData;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\EventDispatcher\Event;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class FlagRepliedMessageListenerTest extends TestCase {
+
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
+
+ /** @var MessageMapper|MockObject */
+ private $messageMapper;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var FlagRepliedMessageListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->messageMapper = $this->createMock(MessageMapper::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new FlagRepliedMessageListener(
+ $this->imapClientFactory,
+ $this->mailboxMapper,
+ $this->messageMapper,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated(): void {
+ $event = new Event();
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandleMessageSentEventMailboxNotAReply(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $repliedMessageData->expects($this->once())
+ ->method('isReply')
+ ->willReturn(false);
+ $this->mailboxMapper->expects($this->never())
+ ->method('find');
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentEventMailboxDoesNotExist(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $repliedMessageData->expects($this->once())
+ ->method('isReply')
+ ->willReturn(true);
+ $repliedMessageData->expects($this->once())
+ ->method('getFolderId')
+ ->willReturn(base64_encode('INBOX'));
+ $this->mailboxMapper->expects($this->once())
+ ->method('find')
+ ->with($account, 'INBOX')
+ ->willThrowException(new DoesNotExistException(''));
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->once())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentEvent(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $repliedMessageData->expects($this->once())
+ ->method('isReply')
+ ->willReturn(true);
+ $repliedMessageData->expects($this->once())
+ ->method('getFolderId')
+ ->willReturn(base64_encode('INBOX'));
+ $repliedMessageData->expects($this->once())
+ ->method('getId')
+ ->willReturn(321);
+ $mailbox = new Mailbox();
+ $this->mailboxMapper->expects($this->once())
+ ->method('find')
+ ->with($account, 'INBOX')
+ ->willReturn($mailbox);
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with(
+ $client,
+ $mailbox,
+ 321,
+ \Horde_Imap_Client::FLAG_ANSWERED
+ );
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+}
diff --git a/tests/Listener/SaveSentMessageListenerTest.php b/tests/Listener/SaveSentMessageListenerTest.php
new file mode 100644
index 000000000..463a8fbf9
--- /dev/null
+++ b/tests/Listener/SaveSentMessageListenerTest.php
@@ -0,0 +1,269 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Tests\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\Events\MessageSentEvent;
+use OCA\Mail\Exception\ServiceException;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MailboxSync;
+use OCA\Mail\IMAP\MessageMapper;
+use OCA\Mail\Listener\SaveSentMessageListener;
+use OCA\Mail\Model\IMessage;
+use OCA\Mail\Model\NewMessageData;
+use OCA\Mail\Model\RepliedMessageData;
+use OCA\TwoFactorAdmin\Listener\IListener;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\EventDispatcher\Event;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class SaveSentMessageListenerTest extends TestCase {
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
+
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var MessageMapper|MockObject */
+ private $messageMapper;
+
+ /** @var MailboxSync|MockObject */
+ private $mailboxSync;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var IListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->messageMapper = $this->createMock(MessageMapper::class);
+ $this->mailboxSync = $this->createMock(MailboxSync::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new SaveSentMessageListener(
+ $this->mailboxMapper,
+ $this->imapClientFactory,
+ $this->messageMapper,
+ $this->mailboxSync,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated(): void {
+ $event = new Event();
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandleMessageSentMailboxDoesNotExistCantCreate(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $this->mailboxMapper->expects($this->at(0))
+ ->method('findSpecial')
+ ->with($account, 'sent')
+ ->willThrowException(new DoesNotExistException(''));
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Sent',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_SENT,
+ ],
+ ]
+ )
+ ->willThrowException(new \Horde_Imap_Client_Exception());
+ $this->logger->expects($this->once())
+ ->method('logException')
+ ->with(
+ $this->anything(),
+ $this->equalTo([
+ 'message' => 'Could not create sent mailbox',
+ 'level' => ILogger::WARN,
+ ])
+ );
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentMailboxDoesNotExist(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $this->mailboxMapper->expects($this->at(0))
+ ->method('findSpecial')
+ ->with($account, 'sent')
+ ->willThrowException(new DoesNotExistException(''));
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Sent',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_SENT,
+ ],
+ ]
+ );
+ $mailbox = new Mailbox();
+ $this->mailboxMapper->expects($this->at(1))
+ ->method('findSpecial')
+ ->with($account, 'sent')
+ ->willReturn($mailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('save')
+ ->with(
+ $this->anything(),
+ $mailbox,
+ $mail
+ );
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSentSavingError(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $mailbox = new Mailbox();
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'sent')
+ ->willReturn($mailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('save')
+ ->with(
+ $this->anything(),
+ $mailbox,
+ $mail
+ )
+ ->willThrowException(new \Horde_Imap_Client_Exception());
+ $this->expectException(ServiceException::class);
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleMessageSent(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ /** @var NewMessageData|MockObject $newMessageData */
+ $newMessageData = $this->createMock(NewMessageData::class);
+ /** @var RepliedMessageData|MockObject $repliedMessageData */
+ $repliedMessageData = $this->createMock(RepliedMessageData::class);
+ /** @var IMessage|MockObject $message */
+ $message = $this->createMock(IMessage::class);
+ /** @var \Horde_Mime_Mail|MockObject $mail */
+ $mail = $this->createMock(\Horde_Mime_Mail::class);
+ $event = new MessageSentEvent(
+ $account,
+ $newMessageData,
+ $repliedMessageData,
+ 123,
+ $message,
+ $mail
+ );
+ $mailbox = new Mailbox();
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'sent')
+ ->willReturn($mailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('save')
+ ->with(
+ $this->anything(),
+ $mailbox,
+ $mail
+ );
+
+ $this->listener->handle($event);
+ }
+
+}
diff --git a/tests/Listener/TrashMailboxCreatorListenerTest.php b/tests/Listener/TrashMailboxCreatorListenerTest.php
new file mode 100644
index 000000000..b82714ff2
--- /dev/null
+++ b/tests/Listener/TrashMailboxCreatorListenerTest.php
@@ -0,0 +1,168 @@
+<?php declare(strict_types=1);
+
+/**
+ * @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCA\Mail\Tests\Listener;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\Events\BeforeMessageDeletedEvent;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MailboxSync;
+use OCA\Mail\Listener\TrashMailboxCreatorListener;
+use OCP\AppFramework\Db\DoesNotExistException;
+use OCP\EventDispatcher\Event;
+use OCP\ILogger;
+use PHPUnit\Framework\MockObject\MockObject;
+
+class TrashMailboxCreatorListenerTest extends TestCase {
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
+
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var MailboxSync|MockObject */
+ private $mailboxSync;
+
+ /** @var ILogger|MockObject */
+ private $logger;
+
+ /** @var TrashMailboxCreatorListener */
+ private $listener;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->mailboxSync = $this->createMock(MailboxSync::class);
+ $this->logger = $this->createMock(ILogger::class);
+
+ $this->listener = new TrashMailboxCreatorListener(
+ $this->mailboxMapper,
+ $this->imapClientFactory,
+ $this->mailboxSync,
+ $this->logger
+ );
+ }
+
+ public function testHandleUnrelated(): void {
+ $event = new Event();
+
+ $this->listener->handle($event);
+
+ $this->addToAssertionCount(1);
+ }
+
+ public function testHandleDoesAlreadyExist(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ $event = new BeforeMessageDeletedEvent(
+ $account,
+ 'INBOX',
+ 123
+ );
+ $mailbox = new Mailbox();
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'trash')
+ ->willReturn($mailbox);
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleDoesNotExistCantCreate(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ $event = new BeforeMessageDeletedEvent(
+ $account,
+ 'INBOX',
+ 123
+ );
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'trash')
+ ->willThrowException(new DoesNotExistException(''));
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Trash',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_TRASH,
+ ],
+ ]
+ )
+ ->willThrowException(new \Horde_Imap_Client_Exception());
+ $this->logger->expects($this->once())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+ public function testHandleDoesNotExist(): void {
+ /** @var Account|MockObject $account */
+ $account = $this->createMock(Account::class);
+ $event = new BeforeMessageDeletedEvent(
+ $account,
+ 'INBOX',
+ 123
+ );
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'trash')
+ ->willThrowException(new DoesNotExistException(''));
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $client->expects($this->once())
+ ->method('createMailbox')
+ ->with(
+ 'Trash',
+ [
+ 'special_use' => [
+ \Horde_Imap_Client::SPECIALUSE_TRASH,
+ ],
+ ]
+ );
+ $mailbox = new Mailbox();
+ $this->mailboxSync->expects($this->once())
+ ->method('sync')
+ ->with($account, true);
+ $this->logger->expects($this->never())
+ ->method('logException');
+
+ $this->listener->handle($event);
+ }
+
+}
diff --git a/tests/Service/MailTransmissionTest.php b/tests/Service/MailTransmissionTest.php
index 5e9e46be1..6c520f8eb 100644
--- a/tests/Service/MailTransmissionTest.php
+++ b/tests/Service/MailTransmissionTest.php
@@ -1,4 +1,4 @@
-<?php
+<?php declare(strict_types=1);
/**
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
@@ -30,33 +30,46 @@ use OCA\Mail\Address;
use OCA\Mail\AddressList;
use OCA\Mail\Contracts\IAttachmentService;
use OCA\Mail\Db\Alias;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\IMAP\MessageMapper;
use OCA\Mail\Mailbox;
use OCA\Mail\Model\IMessage;
+use OCA\Mail\Model\Message;
use OCA\Mail\Model\NewMessageData;
use OCA\Mail\Model\RepliedMessageData;
use OCA\Mail\Model\ReplyMessage;
-use OCA\Mail\Service\AutoCompletion\AddressCollector;
use OCA\Mail\Service\MailTransmission;
use OCA\Mail\SMTP\SmtpClientFactory;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\Folder;
use OCP\ILogger;
-use PHPUnit_Framework_MockObject_MockObject;
+use PHPUnit\Framework\MockObject\MockObject;
class MailTransmissionTest extends TestCase {
- /** @var AddressCollector|PHPUnit_Framework_MockObject_MockObject */
- private $addressCollector;
-
- /** @var Folder|PHPUnit_Framework_MockObject_MockObject */
+ /** @var Folder|MockObject */
private $userFolder;
- /** @var IAttachmentService|PHPUnit_Framework_MockObject_MockObject */
+ /** @var IAttachmentService|MockObject */
private $attachmentService;
- /** @var SmtpClientFactory|PHPUnit_Framework_MockObject_MockObject */
- private $clientFactory;
+ /** @var IMAPClientFactory|MockObject */
+ private $imapClientFactory;
+
+ /** @var SmtpClientFactory|MockObject */
+ private $smtpClientFactory;
+
+ /** @var IEventDispatcher|MockObject */
+ private $eventDispatcher;
+
+ /** @var MailboxMapper|MockObject */
+ private $mailboxMapper;
- /** @var ILogger|PHPUnit_Framework_MockObject_MockObject */
+ /** @var MessageMapper|MockObject */
+ private $messageMapper;
+
+ /** @var ILogger|MockObject */
private $logger;
/** @var MailTransmission */
@@ -65,156 +78,73 @@ class MailTransmissionTest extends TestCase {
protected function setUp() {
parent::setUp();
- $this->addressCollector = $this->createMock(AddressCollector::class);
$this->userFolder = $this->createMock(Folder::class);
$this->attachmentService = $this->createMock(IAttachmentService::class);
- $this->clientFactory = $this->createMock(SmtpClientFactory::class);
+ $this->imapClientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->smtpClientFactory = $this->createMock(SmtpClientFactory::class);
+ $this->eventDispatcher = $this->createMock(IEventDispatcher::class);
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->messageMapper = $this->createMock(MessageMapper::class);
$this->logger = $this->createMock(ILogger::class);
- $this->transmission = new MailTransmission($this->addressCollector, $this->userFolder, $this->attachmentService, $this->clientFactory, $this->logger);
+ $this->transmission = new MailTransmission(
+ $this->userFolder,
+ $this->attachmentService,
+ $this->imapClientFactory,
+ $this->smtpClientFactory,
+ $this->eventDispatcher,
+ $this->mailboxMapper,
+ $this->messageMapper,
+ $this->logger
+ );
}
public function testSendNewMessage() {
+ /** @var Account|MockObject $account */
$account = $this->createMock(Account::class);
$messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
$replyData = new RepliedMessageData($account, null, null);
- $message = $this->createMock(IMessage::class);
+ $message = new Message();
$account->expects($this->once())
->method('newMessage')
->willReturn($message);
$transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
- ->method('create')
- ->with($account)
- ->willReturn($transport);
- $account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, null);
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList());
-
- $this->transmission->sendMessage('garfield', $messageData, $replyData);
- }
-
- public function testSendNewMessageAndCollectAddresses() {
- $account = $this->createMock(Account::class);
- $messageData = NewMessageData::fromRequest($account, 'to@domain.tld', 'cc@domain.tld', 'bcc@domain.tld', 'sub', 'bod');
- $replyData = new RepliedMessageData($account, null, null);
- $message = $this->createMock(IMessage::class);
- $transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
+ $this->smtpClientFactory->expects($this->once())
->method('create')
->with($account)
->willReturn($transport);
- $account->expects($this->once())
- ->method('newMessage')
- ->willReturn($message);
- $account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, null);
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList([
- new Address('To', 'to@domain.tld'),
- ]));
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList([
- new Address('Cc', 'cc@domain.tld'),
- ]));
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList([
- new Address('Bcc', 'bcc@domain.tld'),
- ]));
- $this->addressCollector->expects($this->once())
- ->method('addAddresses')
- ->with($this->equalTo(new AddressList([
- new Address('To', 'to@domain.tld'),
- new Address('Cc', 'cc@domain.tld'),
- new Address('Bcc', 'bcc@domain.tld'),
- ])));
$this->transmission->sendMessage('garfield', $messageData, $replyData);
}
- public function testSendMessageAndDeleteDraft() {
- $account = $this->createMock(Account::class);
- $messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
- $replyData = new RepliedMessageData($account, null, null);
- $message = $this->createMock(IMessage::class);
- $account->expects($this->once())
- ->method('newMessage')
- ->willReturn($message);
- $transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
- ->method('create')
- ->with($account)
- ->willReturn($transport);
- $account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, 123);
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList());
-
- $this->transmission->sendMessage('garfield', $messageData, $replyData, null, 123);
- }
-
public function testSendMessageFromAlias() {
+ /** @var Account|MockObject $account */
$account = $this->createMock(Account::class);
$alias = new Alias();
$alias->setAlias('a@d.com');
$messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
$replyData = new RepliedMessageData($account, null, null);
- $message = $this->createMock(IMessage::class);
+ $message = new Message();
$account->expects($this->once())
->method('newMessage')
->willReturn($message);
$transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
+ $this->smtpClientFactory->expects($this->once())
->method('create')
->with($account)
->willReturn($transport);
$account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, null);
- $account->expects($this->once())
->method('getName')
->willReturn('User');
$account->expects($this->once())
->method('setAlias')
->with($alias);
- $message->expects($this->once())
- ->method('setFrom')
- ->with($this->equalTo(new AddressList([new Address('User', 'a@d.com')])));
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList());
$this->transmission->sendMessage('garfield', $messageData, $replyData, $alias);
}
public function testSendNewMessageWithCloudAttachments() {
+ /** @var Account|MockObject $account */
$account = $this->createMock(Account::class);
$attachmenst = [
[
@@ -227,18 +157,15 @@ class MailTransmissionTest extends TestCase {
];
$messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod', $attachmenst);
$replyData = new RepliedMessageData($account, null, null);
- $message = $this->createMock(IMessage::class);
+ $message = new Message();
$account->expects($this->once())
->method('newMessage')
->willReturn($message);
$transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
+ $this->smtpClientFactory->expects($this->once())
->method('create')
->with($account)
->willReturn($transport);
- $account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, null);
$this->userFolder->expects($this->exactly(2))
->method('nodeExists')
->willReturnMap([
@@ -250,35 +177,24 @@ class MailTransmissionTest extends TestCase {
->method('get')
->with('cat.jpg')
->willReturn($node);
- $message->expects($this->once())
- ->method('addAttachmentFromFiles')
- ->with($node);
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList());
$this->transmission->sendMessage('garfield', $messageData, $replyData);
}
public function testReplyToAnExistingMessage() {
+ /** @var Account|MockObject $account */
$account = $this->createMock(Account::class);
$messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
$folderId = base64_encode('INBOX');
$repliedMessageId = 321;
$replyData = new RepliedMessageData($account, $folderId, $repliedMessageId);
- $message = $this->createMock(ReplyMessage::class);
+ $message = new ReplyMessage();
$account->expects($this->once())
->method('newReplyMessage')
->willReturn($message);
$mailbox = $this->createMock(Mailbox::class);
- $account->expects($this->exactly(2))// once to get the orignal message and once to flag it
- ->method('getMailbox')
+ $account->expects($this->once())
+ ->method('getMailbox')
->with(base64_decode($folderId))
->willReturn($mailbox);
$repliedMessage = $this->createMock(IMessage::class);
@@ -286,43 +202,36 @@ class MailTransmissionTest extends TestCase {
->method('getMessage')
->with($repliedMessageId)
->willReturn($repliedMessage);
- $message->expects($this->once())
- ->method('setRepliedMessage')
- ->with($repliedMessage);
$transport = $this->createMock(Horde_Mail_Transport::class);
- $this->clientFactory->expects($this->once())
+ $this->smtpClientFactory->expects($this->once())
->method('create')
->with($account)
->willReturn($transport);
- $account->expects($this->once())
- ->method('sendMessage')
- ->with($message, $transport, null);
- $mailbox->expects($this->once())
- ->method('setMessageFlag')
- ->with($repliedMessageId, Horde_Imap_Client::FLAG_ANSWERED, true);
- $message->expects($this->once())
- ->method('getTo')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getCc')
- ->willReturn(new AddressList());
- $message->expects($this->once())
- ->method('getBcc')
- ->willReturn(new AddressList());
$this->transmission->sendMessage('garfield', $messageData, $replyData);
}
public function testSaveDraft() {
+ /** @var Account|MockObject $account */
$account = $this->createMock(Account::class);
$messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
- $message = $this->createMock(IMessage::class);
+ $message = new Message();
$account->expects($this->once())
->method('newMessage')
->willReturn($message);
- $account->expects($this->once())
- ->method('saveDraft')
- ->with($message, null)
+ $client = $this->createMock(\Horde_Imap_Client_Socket::class);
+ $this->imapClientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($client);
+ $draftsMailbox = new \OCA\Mail\Db\Mailbox();
+ $this->mailboxMapper->expects($this->once())
+ ->method('findSpecial')
+ ->with($account, 'drafts')
+ ->willReturn($draftsMailbox);
+ $this->messageMapper->expects($this->once())
+ ->method('save')
+ ->with($client, $draftsMailbox, $this->anything())
->willReturn(13);
$newId = $this->transmission->saveDraft($messageData);
@@ -330,21 +239,4 @@ class MailTransmissionTest extends TestCase {
$this->assertEquals(13, $newId);
}
- public function testSaveDraftAndReplaceOldOne() {
- $account = $this->createMock(Account::class);
- $messageData = NewMessageData::fromRequest($account, 'to@d.com', '', '', 'sub', 'bod');
- $message = $this->createMock(IMessage::class);
- $account->expects($this->once())
- ->method('newMessage')
- ->willReturn($message);
- $account->expects($this->once())
- ->method('saveDraft')
- ->with($message, 123)
- ->willReturn(14);
-
- $newId = $this->transmission->saveDraft($messageData, 123);
-
- $this->assertEquals(14, $newId);
- }
-
}