diff options
author | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-09-04 18:05:19 +0300 |
---|---|---|
committer | Christoph Wurst <christoph@winzerhof-wurst.at> | 2019-09-05 14:45:50 +0300 |
commit | d18ef16578dc34ffd67e48bc5c61654e55461ce9 (patch) | |
tree | 0fb85d03cba26c56be550b2cba5072dd6aca4e91 /tests | |
parent | eec81c6c38259c0edc843018581a1f1bd1ab280a (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.php | 20 | ||||
-rw-r--r-- | tests/Integration/Service/MailTransmissionIntegrationTest.php | 77 | ||||
-rw-r--r-- | tests/Listener/AddressCollectionListenerTest.php | 118 | ||||
-rw-r--r-- | tests/Listener/DeleteDraftListenerTest.php | 230 | ||||
-rw-r--r-- | tests/Listener/DraftMailboxCreatorListenerTest.php | 150 | ||||
-rw-r--r-- | tests/Listener/FlagRepliedMessageListenerTest.php | 202 | ||||
-rw-r--r-- | tests/Listener/SaveSentMessageListenerTest.php | 269 | ||||
-rw-r--r-- | tests/Listener/TrashMailboxCreatorListenerTest.php | 168 | ||||
-rw-r--r-- | tests/Service/MailTransmissionTest.php | 244 |
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); - } - } |