diff options
author | Christoph Wurst <ChristophWurst@users.noreply.github.com> | 2019-10-07 15:07:51 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-10-07 15:07:51 +0300 |
commit | 18a76774eb0f0e00b5a3ddfbea8d2e980219b642 (patch) | |
tree | 72b07864b1dd615fefc686eee76f7648d3fbae2c /tests | |
parent | 4e2ebfa08d809ab01de113eb895757fb7b5a02ca (diff) |
Clean up searching for messages (#2058)
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Controller/MessagesControllerTest.php | 55 | ||||
-rw-r--r-- | tests/IMAP/Search/SearchFilterStringParserTest.php (renamed from tests/SearchHelperTest.php) | 19 | ||||
-rw-r--r-- | tests/IMAP/Search/SearchStrategyFactoryTest.php | 152 | ||||
-rw-r--r-- | tests/Service/MailSearchTest.php | 97 |
4 files changed, 312 insertions, 11 deletions
diff --git a/tests/Controller/MessagesControllerTest.php b/tests/Controller/MessagesControllerTest.php index 623f3b5e4..62c660c33 100644 --- a/tests/Controller/MessagesControllerTest.php +++ b/tests/Controller/MessagesControllerTest.php @@ -27,13 +27,16 @@ use OC\AppFramework\Http\Request; use OCA\Mail\Account; use OCA\Mail\Attachment; use OCA\Mail\Contracts\IMailManager; +use OCA\Mail\Contracts\IMailSearch; use OCA\Mail\Controller\MessagesController; use OCA\Mail\Exception\ServiceException; use OCA\Mail\Http\AttachmentDownloadResponse; use OCA\Mail\Http\HtmlResponse; use OCA\Mail\Mailbox; use OCA\Mail\Model\IMAPMessage; +use OCA\Mail\Model\Message; use OCA\Mail\Service\AccountService; +use OCA\Mail\Service\MailManager; use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Http\ContentSecurityPolicy; use OCP\AppFramework\Http\JSONResponse; @@ -44,24 +47,59 @@ use OCP\IL10N; use OCP\ILogger; use OCP\IRequest; use OCP\IURLGenerator; +use PHPUnit\Framework\MockObject\MockObject; class MessagesControllerTest extends TestCase { + /** @var string */ private $appName; + + /** @var MockObject|IRequest */ private $request; + + /** @var MockObject|AccountService */ private $accountService; + + /** @var MockObject|MailManager */ private $mailManager; + + /** @var MockObject|IMailSearch */ + private $mailSearch; + + /** @var string */ private $userId; + + /** @var MockObject|Folder */ private $userFolder; + + /** @var MockObject|ILogger */ private $logger; + + /** @var MockObject|IL10N */ private $l10n; + + /** @var MessagesController */ private $controller; + + /** @var MockObject|Account */ private $account; + + /** @var MockObject|Mailbox */ private $mailbox; + + /** @var MockObject|Message */ private $message; + + /** @var MockObject|Attachment */ private $attachment; + + /** @var MockObject|IMimeTypeDetector */ private $mimeTypeDetector; + + /** @var MockObject|IURLGenerator */ private $urlGenerator; + + /** @var MockObject|ITimeFactory */ private $timeFactory; protected function setUp() { @@ -71,6 +109,7 @@ class MessagesControllerTest extends TestCase { $this->request = $this->getMockBuilder(IRequest::class)->getMock(); $this->accountService = $this->createMock(AccountService::class); $this->mailManager = $this->createMock(IMailManager::class); + $this->mailSearch = $this->createMock(IMailSearch::class); $this->userId = 'john'; $this->userFolder = $this->createMock(Folder::class); $this->request = $this->createMock(Request::class); @@ -81,9 +120,19 @@ class MessagesControllerTest extends TestCase { $this->timeFactory = $this->createMock(ITimeFactory::class); $this->controller = new MessagesController( - $this->appName, $this->request, $this->accountService, $this->mailManager, - $this->userId, $this->userFolder, $this->logger, $this->l10n, - $this->mimeTypeDetector, $this->urlGenerator, $this->timeFactory); + $this->appName, + $this->request, + $this->accountService, + $this->mailManager, + $this->mailSearch, + $this->userId, + $this->userFolder, + $this->logger, + $this->l10n, + $this->mimeTypeDetector, + $this->urlGenerator, + $this->timeFactory + ); $this->account = $this->createMock(Account::class); $this->mailbox = $this->createMock(Mailbox::class); diff --git a/tests/SearchHelperTest.php b/tests/IMAP/Search/SearchFilterStringParserTest.php index 97fb4018e..1bb2d0610 100644 --- a/tests/SearchHelperTest.php +++ b/tests/IMAP/Search/SearchFilterStringParserTest.php @@ -1,6 +1,9 @@ -<?php +<?php declare(strict_types=1); + /** - * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * @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 * @@ -16,18 +19,18 @@ * * 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; +namespace OCA\Mail\Tests\IMAP\Search; use ChristophWurst\Nextcloud\Testing\TestCase; -use OCA\Mail\SearchHelper; +use OCA\Mail\IMAP\Search\SearchFilterStringParser; + +class SearchFilterStringParserTest extends TestCase { -class SearchHelperTest extends TestCase { private function search($filter) { - $helper = new SearchHelper(); - $query = $helper->parseFilterString($filter); + $helper = new SearchFilterStringParser(); + $query = $helper->parse($filter); return (string)($query->build()['query']); } diff --git a/tests/IMAP/Search/SearchStrategyFactoryTest.php b/tests/IMAP/Search/SearchStrategyFactoryTest.php new file mode 100644 index 000000000..93bf330e0 --- /dev/null +++ b/tests/IMAP/Search/SearchStrategyFactoryTest.php @@ -0,0 +1,152 @@ +<?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\IMAP\Search; + +use ChristophWurst\Nextcloud\Testing\TestCase; +use Horde_Imap_Client_Data_Capability; +use Horde_Imap_Client_Search_Query; +use Horde_Imap_Client_Socket; +use OCA\Mail\IMAP\Search\FullScanSearchStrategy; +use OCA\Mail\IMAP\Search\ImapSortSearchStrategy; +use OCA\Mail\IMAP\Search\SearchStrategyFactory; +use PHPUnit\Framework\MockObject\MockObject; + +class SearchStrategyFactoryTest extends TestCase { + + /** @var SearchStrategyFactory */ + private $factory; + + protected function setUp() { + parent::setUp(); + + $this->factory = new SearchStrategyFactory(); + } + + public function testGetStrategyForFetchNoFilter() { + /** @var MockObject|Horde_Imap_Client_Socket $client */ + $client = $this->createMock(Horde_Imap_Client_Socket::class); + $mailbox = 'INBOX'; + $filter = new Horde_Imap_Client_Search_Query(); + $cursor = null; + $capability = $this->createMock(Horde_Imap_Client_Data_Capability::class); + $client->expects($this->once()) + ->method('__get') + ->with('capability') + ->willReturn($capability); + $capability->expects($this->once()) + ->method('query') + ->with('SORT') + ->willReturn(true); + + $strategy = $this->factory->getStrategy( + $client, + $mailbox, + $filter, + $cursor + ); + + $this->assertInstanceOf(ImapSortSearchStrategy::class, $strategy); + } + + public function testGetStrategyForFetchNoSort() { + /** @var MockObject|Horde_Imap_Client_Socket $client */ + $client = $this->createMock(Horde_Imap_Client_Socket::class); + $mailbox = 'INBOX'; + $filter = new Horde_Imap_Client_Search_Query(); + $cursor = null; + $capability = $this->createMock(Horde_Imap_Client_Data_Capability::class); + $client->expects($this->once()) + ->method('__get') + ->with('capability') + ->willReturn($capability); + $capability->expects($this->once()) + ->method('query') + ->with('SORT') + ->willReturn(false); + + $strategy = $this->factory->getStrategy( + $client, + $mailbox, + $filter, + $cursor + ); + + $this->assertInstanceOf(FullScanSearchStrategy::class, $strategy); + } + + public function testGetStrategyForSearchWithSort() { + /** @var MockObject|Horde_Imap_Client_Socket $client */ + $client = $this->createMock(Horde_Imap_Client_Socket::class); + $mailbox = 'INBOX'; + $filter = new Horde_Imap_Client_Search_Query(); + $filter->text('test'); + $cursor = null; + $capability = $this->createMock(Horde_Imap_Client_Data_Capability::class); + $client->expects($this->once()) + ->method('__get') + ->with('capability') + ->willReturn($capability); + $capability->expects($this->once()) + ->method('query') + ->with('SORT') + ->willReturn(true); + + $strategy = $this->factory->getStrategy( + $client, + $mailbox, + $filter, + $cursor + ); + + $this->assertInstanceOf(ImapSortSearchStrategy::class, $strategy); + } + + public function testGetStrategyForSearchWithoutSort() { + /** @var MockObject|Horde_Imap_Client_Socket $client */ + $client = $this->createMock(Horde_Imap_Client_Socket::class); + $mailbox = 'INBOX'; + $filter = new Horde_Imap_Client_Search_Query(); + $filter->text('sort'); + $cursor = null; + $capability = $this->createMock(Horde_Imap_Client_Data_Capability::class); + $client->expects($this->once()) + ->method('__get') + ->with('capability') + ->willReturn($capability); + $capability->expects($this->once()) + ->method('query') + ->with('SORT') + ->willReturn(true); + + $strategy = $this->factory->getStrategy( + $client, + $mailbox, + $filter, + $cursor + ); + + $this->assertInstanceOf(ImapSortSearchStrategy::class, $strategy); + } + +} diff --git a/tests/Service/MailSearchTest.php b/tests/Service/MailSearchTest.php new file mode 100644 index 000000000..c5fa66720 --- /dev/null +++ b/tests/Service/MailSearchTest.php @@ -0,0 +1,97 @@ +<?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\Service; + +use ChristophWurst\Nextcloud\Testing\TestCase; +use Horde_Imap_Client_Fetch_Results; +use Horde_Imap_Client_Socket; +use OCA\Mail\Account; +use OCA\Mail\Db\MailboxMapper; +use OCA\Mail\IMAP\IMAPClientFactory; +use OCA\Mail\IMAP\Search\SearchFilterStringParser; +use OCA\Mail\IMAP\Search\SearchStrategyFactory; +use OCA\Mail\Service\MailSearch; +use OCP\ILogger; +use PHPUnit\Framework\MockObject\MockObject; + +class MailSearchTest extends TestCase { + + /** @var MockObject|IMAPClientFactory */ + private $imapClientFactory; + + /** @var MockObject|SearchStrategyFactory */ + private $searchStrategyFactory; + + /** @var MockObject|SearchFilterStringParser */ + private $searchStringParser; + + /** @var MockObject|MailboxMapper */ + private $mailboxMapper; + + /** @var MockObject|ILogger */ + private $logger; + + /** @var MailSearch */ + private $search; + + protected function setUp() { + parent::setUp(); + + $this->imapClientFactory = $this->createMock(IMAPClientFactory::class); + $this->searchStrategyFactory = $this->createMock(SearchStrategyFactory::class); + $this->searchStringParser = $this->createMock(SearchFilterStringParser::class); + $this->mailboxMapper = $this->createMock(MailboxMapper::class); + $this->logger = $this->createMock(ILogger::class); + + $this->search = new MailSearch( + $this->imapClientFactory, + $this->searchStrategyFactory, + $this->searchStringParser, + $this->mailboxMapper, + $this->logger + ); + } + + public function testNoFindMessages() { + $account = $this->createMock(Account::class); + $client = $this->createMock(Horde_Imap_Client_Socket::class); + $this->imapClientFactory->expects($this->once()) + ->method('getClient') + ->with($account) + ->willReturn($client); + $client->expects($this->once()) + ->method('fetch') + ->willReturn(new Horde_Imap_Client_Fetch_Results()); + + $messages = $this->search->findMessages( + $account, + 'INBOX', + null, + null + ); + + $this->assertEmpty($messages); + } + +} |