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
diff options
context:
space:
mode:
authorAnna Larch <anna@nextcloud.com>2021-05-06 23:36:20 +0300
committerAnna Larch <anna@nextcloud.com>2021-05-26 16:38:18 +0300
commit540ca4b1ef164f1a05e8c4f457ed8aca7ccebabd (patch)
tree20a536d98ca52f81010478c620208a2cbe5e6b90 /tests/Integration
parent4f5692a41c64d7878c9e6a167c72665cf70b8a33 (diff)
Add bg job for label sync
Signed-off-by: Anna Larch <anna@nextcloud.com>
Diffstat (limited to 'tests/Integration')
-rw-r--r--tests/Integration/Framework/ImapTest.php2
-rw-r--r--tests/Integration/IMAP/MessageMapperTest.php203
-rw-r--r--tests/Integration/Migration/MigrateImportantFromImapAndDbTest.php239
3 files changed, 444 insertions, 0 deletions
diff --git a/tests/Integration/Framework/ImapTest.php b/tests/Integration/Framework/ImapTest.php
index c0b252fb1..1a68ad415 100644
--- a/tests/Integration/Framework/ImapTest.php
+++ b/tests/Integration/Framework/ImapTest.php
@@ -27,6 +27,7 @@ use Horde_Imap_Client_Fetch_Query;
use Horde_Imap_Client_Ids;
use Horde_Imap_Client_Socket;
use Horde_Mail_Rfc822_Address;
+use Horde_Mime_Headers_MessageId;
use Horde_Mime_Mail;
use Horde_Mime_Part;
use OCA\Mail\Account;
@@ -145,6 +146,7 @@ trait ImapTest {
$mail = new Horde_Mime_Mail();
$mail->addHeaders($headers);
+ $mail->addHeaderOb(Horde_Mime_Headers_MessageId::create());
$body = new Horde_Mime_Part();
$body->setType('text/plain');
$body->setContents($message->getBody());
diff --git a/tests/Integration/IMAP/MessageMapperTest.php b/tests/Integration/IMAP/MessageMapperTest.php
new file mode 100644
index 000000000..c1faa022c
--- /dev/null
+++ b/tests/Integration/IMAP/MessageMapperTest.php
@@ -0,0 +1,203 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @author Anna Larch <anna.larch@nextcloud.com>
+ *
+ * Mail
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Mail\Tests\Integration\IMAP;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use Horde_Imap_Client;
+use Horde_Imap_Client_Exception;
+use OC;
+use OCA\Mail\Account;
+use OCA\Mail\Contracts\IMailManager;
+use OCA\Mail\IMAP\MessageMapper as ImapMessageMapper;
+use OCA\Mail\Db\MessageMapper;
+use OCA\Mail\Service\Sync\SyncService;
+use OCA\Mail\Tests\Integration\Framework\ImapTest;
+use OCA\Mail\Tests\Integration\Framework\ImapTestAccount;
+
+class MessageMapperTest extends TestCase {
+ use ImapTest,
+ ImapTestAccount;
+
+ public function setUp():void {
+ parent::setUp();
+ }
+
+ public function testTagging() {
+ // First, set up account and retrieve sync token
+ $this->resetImapAccount();
+
+ $account = $this->createTestAccount();
+ /** @var SyncService $syncService */
+ $syncService = OC::$server->query(SyncService::class);
+ /** @var ImapMessageMapper $messageMapper */
+ $imapMessageMapper = OC::$server->query(ImapMessageMapper::class);
+ /** @var MessageMapper $messageMapper */
+ $messageMapper = OC::$server->query(MessageMapper::class);
+ /** @var IMailManager $mailManager */
+ $mailManager = OC::$server->query(IMailManager::class);
+ $mailBoxes = $mailManager->getMailboxes(new Account($account));
+ $inbox = null;
+ foreach ($mailBoxes as $mailBox) {
+ if ($mailBox->getName() === 'INBOX') {
+ $inbox = $mailBox;
+ break;
+ }
+ }
+
+ // Second, put a new message into the mailbox
+ $message = $this->getMessageBuilder()
+ ->from('buffington@domain.tld')
+ ->to('user@domain.tld')
+ ->finish();
+ $newUid = $this->saveMessage($inbox->getName(), $message, $account);
+
+ // now we tag this message!
+ try {
+ $imapMessageMapper->addFlag($this->getClient($account), $mailBox, [$newUid], '$label1');
+ } catch (Horde_Imap_Client_Exception $e) {
+ $this->fail('Could not tag message');
+ }
+
+ // sync
+ $syncService->syncMailbox(
+ new Account($account),
+ $inbox,
+ Horde_Imap_Client::SYNC_NEWMSGSUIDS | Horde_Imap_Client::SYNC_FLAGSUIDS | Horde_Imap_Client::SYNC_VANISHEDUIDS,
+ null,
+ false
+ );
+
+ // Let's retrieve the DB to see if we have this tag!
+ $messages = $messageMapper->findByUids($mailBox, [$newUid]);
+ $related = $messageMapper->findRelatedData($messages, $account->getUserId());
+ foreach ($related as $message) {
+ $tags = $message->getTags();
+ $this->assertEquals('$label1', $tags[0]->getImapLabel());
+ }
+
+
+ // now we untag this message!
+ try {
+ $imapMessageMapper->removeFlag($this->getClient($account), $mailBox, [$newUid], '$label1');
+ } catch (Horde_Imap_Client_Exception $e) {
+ $this->fail('Could not untag message');
+ }
+
+ // sync again
+ $syncService->syncMailbox(
+ new Account($account),
+ $inbox,
+ Horde_Imap_Client::SYNC_NEWMSGSUIDS | Horde_Imap_Client::SYNC_FLAGSUIDS | Horde_Imap_Client::SYNC_VANISHEDUIDS,
+ null,
+ true
+ );
+
+ $messages = $messageMapper->findByUids($mailBox, [$newUid]);
+ $related = $messageMapper->findRelatedData($messages, $account->getUserId());
+ foreach ($related as $message) {
+ $tags = $message->getTags();
+ $this->assertEmpty($tags);
+ }
+ }
+
+ public function testGetFlagged() {
+ // First, set up account and retrieve sync token
+ $this->resetImapAccount();
+
+ $account = $this->createTestAccount();
+ /** @var ImapMessageMapper $messageMapper */
+ $imapMessageMapper = OC::$server->query(ImapMessageMapper::class);
+ /** @var IMailManager $mailManager */
+ $mailManager = OC::$server->query(IMailManager::class);
+ $mailBoxes = $mailManager->getMailboxes(new Account($account));
+ $inbox = null;
+ foreach ($mailBoxes as $mailBox) {
+ if ($mailBox->getName() === 'INBOX') {
+ $inbox = $mailBox;
+ break;
+ }
+ }
+
+ // Put a second new message into the mailbox
+ $message = $this->getMessageBuilder()
+ ->from('buffington@domain.tld')
+ ->to('user@domain.tld')
+ ->finish();
+ $newUid = $this->saveMessage($inbox->getName(), $message, $account);
+
+
+ // Put another new message into the mailbox
+ $message = $this->getMessageBuilder()
+ ->from('fluffington@domain.tld')
+ ->to('user@domain.tld')
+ ->finish();
+ $newUid2 = $this->saveMessage($inbox->getName(), $message, $account);
+
+ // Thirdly, create a message that will not be tagged
+ $message = $this->getMessageBuilder()
+ ->from('scruffington@domain.tld')
+ ->to('user@domain.tld')
+ ->finish();
+ $this->saveMessage($inbox->getName(), $message, $account);
+
+ // now we tag this message with $label1
+ try {
+ $imapMessageMapper->addFlag($this->getClient($account), $mailBox, [$newUid], '$label1');
+ } catch (Horde_Imap_Client_Exception $e) {
+ $this->fail('Could not tag message');
+ }
+
+
+ // now we tag this and the previous message with $label2
+ try {
+ $imapMessageMapper->addFlag($this->getClient($account), $mailBox, [$newUid, $newUid2], '$label2');
+ } catch (Horde_Imap_Client_Exception $e) {
+ $this->fail('Could not tag message');
+ }
+
+ // test for labels
+ $tagged = $imapMessageMapper->getFlagged($this->getClient($account), $mailBox, '$label1');
+ $this->assertNotEmpty($tagged);
+ // are the counts correct?
+ $this->assertCount(1, $tagged);
+
+ $tagged = $imapMessageMapper->getFlagged($this->getClient($account), $mailBox, '$label2');
+ $this->assertNotEmpty($tagged);
+ $this->assertCount(2, $tagged);
+
+ // test for labels that wasn't set
+ $tagged = $imapMessageMapper->getFlagged($this->getClient($account), $mailBox, '$notAvailable');
+ $this->assertEmpty($tagged);
+
+ // test for regular flag - recent
+ $tagged = $imapMessageMapper->getFlagged($this->getClient($account), $mailBox, Horde_Imap_Client::FLAG_RECENT);
+ $this->assertNotEmpty($tagged);
+ // should return all messages
+ $this->assertCount(3, $tagged);
+ }
+
+ public function tearDown(): void {
+ $this->resetImapAccount();
+ }
+}
diff --git a/tests/Integration/Migration/MigrateImportantFromImapAndDbTest.php b/tests/Integration/Migration/MigrateImportantFromImapAndDbTest.php
new file mode 100644
index 000000000..548d63cef
--- /dev/null
+++ b/tests/Integration/Migration/MigrateImportantFromImapAndDbTest.php
@@ -0,0 +1,239 @@
+<?php
+
+/**
+ * @copyright 2021 Anna Larch <anna.larch@nextcloud.com>
+ *
+ * @author 2021 Anna Larch <anna.larch@nextcloud.com>
+ *
+ * @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\Integration\Service;
+
+use ChristophWurst\Nextcloud\Testing\TestCase;
+use Horde_Imap_Client_Exception;
+use Horde_Imap_Client_Socket;
+use OCA\Mail\Account;
+use OCA\Mail\Db\Mailbox;
+use OCA\Mail\Db\MailboxMapper;
+use OCA\Mail\IMAP\MessageMapper;
+use OCA\Mail\Db\Tag;
+use OCA\Mail\Exception\ServiceException;
+use OCA\Mail\IMAP\IMAPClientFactory;
+use OCA\Mail\Migration\MigrateImportantFromImapAndDb;
+use Psr\Log\LoggerInterface;
+
+class MigrateImportantFromImapAndDbTest extends TestCase {
+
+ /** @var MockObject */
+ private $clientFactory;
+
+ /** @var MockObject */
+ private $client;
+
+ /** @var MockObject */
+ private $messageMapper;
+
+ /** @var MockObject */
+ private $mailboxMapper;
+
+ /** @var MockObject */
+ private $logger;
+
+ /** @var MigrateImportantFromImapAndDb */
+ private $migration;
+
+ protected function setUp(): void {
+ $this->clientFactory = $this->createMock(IMAPClientFactory::class);
+ $this->client = $this->createMock(Horde_Imap_Client_Socket::class);
+ $this->messageMapper = $this->createMock(MessageMapper::class);
+ $this->mailboxMapper = $this->createMock(MailboxMapper::class);
+ $this->logger = $this->createMock(LoggerInterface::class);
+ $this->migration = new MigrateImportantFromImapAndDb(
+ $this->clientFactory,
+ $this->messageMapper,
+ $this->mailboxMapper,
+ $this->logger
+ );
+ parent::setUp();
+ }
+
+ public function testMigrateImportantOnImap() {
+ $account = $this->createMock(Account::class);
+ $mailbox = $this->createMock(Mailbox::class);
+ $uids = [1,2,3];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->messageMapper->expects($this->once())
+ ->method('getFlagged')
+ ->with($this->client, $mailbox, '$important')
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with($this->client, $mailbox, $uids, Tag::LABEL_IMPORTANT);
+ $this->logger->expects($this->never())
+ ->method('debug');
+
+ $this->migration->migrateImportantOnImap($account, $mailbox);
+ }
+
+ public function testMigrateImportantOnImapNoUids() {
+ $account = $this->createMock(Account::class);
+ $mailbox = $this->createMock(Mailbox::class);
+ $uids = [];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->messageMapper->expects($this->once())
+ ->method('getFlagged')
+ ->with($this->client, $mailbox, '$important')
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->never())
+ ->method('debug');
+
+ $this->migration->migrateImportantOnImap($account, $mailbox);
+ }
+
+ public function testMigrateImportantOnImapExceptionGetFlagged() {
+ $account = $this->createMock(Account::class);
+ $mailbox = $this->createMock(Mailbox::class);
+ $e = new Horde_Imap_Client_Exception('');
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->messageMapper->expects($this->once())
+ ->method('getFlagged')
+ ->with($this->client, $mailbox, '$important')
+ ->willThrowException($e);
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->never())
+ ->method('debug');
+ $this->expectException(ServiceException::class);
+
+ $this->migration->migrateImportantOnImap($account, $mailbox);
+ }
+
+ public function testMigrateImportantOnImapExceptionOnFlag() {
+ $account = $this->createMock(Account::class);
+ $mailbox = new Mailbox();
+ $mailbox->setName('INBOX');
+ $e = new Horde_Imap_Client_Exception('');
+ $uids = [1,2,3,4];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->messageMapper->expects($this->once())
+ ->method('getFlagged')
+ ->with($this->client, $mailbox, '$important')
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with($this->client, $mailbox, $uids, Tag::LABEL_IMPORTANT)
+ ->willThrowException($e);
+ $this->logger->expects($this->once())
+ ->method('debug')
+ ->with('Could not flag messages in mailbox <' . $mailbox->getId() . '>');
+ $this->expectException(ServiceException::class);
+
+ $this->migration->migrateImportantOnImap($account, $mailbox);
+ }
+
+ public function migrateImportantFromDb() {
+ $account = $this->createMock(Account::class);
+ $mailbox = new Mailbox();
+ $mailbox->setId(1);
+ $uids = [1,2,3];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->mailboxMapper->expects($this->once())
+ ->method('findFlaggedImportantUids')
+ ->with($mailbox->getId())
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with($this->client, $mailbox, $uids, Tag::LABEL_IMPORTANT);
+ $this->logger->expects($this->never())
+ ->method('debug');
+
+ $this->migration->migrateImportantFromDb($account, $mailbox);
+ }
+
+ public function testMigrateImportantFromDbNoUids() {
+ $account = $this->createMock(Account::class);
+ $mailbox = new Mailbox();
+ $mailbox->setId(1);
+ $uids = [];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->mailboxMapper->expects($this->once())
+ ->method('findFlaggedImportantUids')
+ ->with($mailbox->getId())
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->never())
+ ->method('addFlag');
+ $this->logger->expects($this->never())
+ ->method('debug');
+
+ $this->migration->migrateImportantFromDb($account, $mailbox);
+ }
+
+ public function testMigrateImportantFromDbExceptionOnFlag() {
+ $account = $this->createMock(Account::class);
+ $mailbox = new Mailbox();
+ $mailbox->setId(1);
+ $mailbox->setName('INBOX');
+ $e = new Horde_Imap_Client_Exception('');
+ $uids = [1,2,3];
+
+ $this->clientFactory->expects($this->once())
+ ->method('getClient')
+ ->with($account)
+ ->willReturn($this->client);
+ $this->mailboxMapper->expects($this->once())
+ ->method('findFlaggedImportantUids')
+ ->with($mailbox->getId())
+ ->willReturn($uids);
+ $this->messageMapper->expects($this->once())
+ ->method('addFlag')
+ ->with($this->client, $mailbox, $uids, Tag::LABEL_IMPORTANT)
+ ->willThrowException($e);
+ $this->logger->expects($this->once())
+ ->method('debug')
+ ->with('Could not flag messages in mailbox <' . $mailbox->getId() . '>');
+ $this->expectException(ServiceException::class);
+
+ $this->migration->migrateImportantFromDb($account, $mailbox);
+ }
+}