From 0df2796f2c79d7866689a2162340a4b1cebb7afd Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Fri, 10 Nov 2023 13:59:37 +0100 Subject: [PATCH] fixup! feat(advanced-search): allow date and recipient search Signed-off-by: Christoph Wurst --- tests/Unit/Search/FilteringProviderTest.php | 145 ++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 tests/Unit/Search/FilteringProviderTest.php diff --git a/tests/Unit/Search/FilteringProviderTest.php b/tests/Unit/Search/FilteringProviderTest.php new file mode 100644 index 0000000000..4d87fee862 --- /dev/null +++ b/tests/Unit/Search/FilteringProviderTest.php @@ -0,0 +1,145 @@ + + * + * @author 2023 Christoph Wurst + * + * @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 . + */ + +namespace OCA\Mail\Tests\Unit\Search; + +use ChristophWurst\Nextcloud\Testing\ServiceMockObject; +use ChristophWurst\Nextcloud\Testing\TestCase; +use OCA\Mail\AddressList; +use OCA\Mail\Db\Message; +use OCA\Mail\Db\Recipient; +use OCA\Mail\Search\FilteringProvider; +use OCP\IUser; +use OCP\Search\IFilter; +use OCP\Search\ISearchQuery; + +/** + * @covers \OCA\Mail\Search\FilteringProvider + */ +class FilteringProviderTest extends TestCase { + private ServiceMockObject $serviceMock; + private FilteringProvider $provider; + + protected function setUp(): void { + parent::setUp(); + + $this->serviceMock = $this->createServiceMock(FilteringProvider::class); + $this->provider = $this->serviceMock->getService(); + } + + public function testSearchForTerm(): void { + $term = 'spam'; + $user = $this->createMock(IUser::class); + $query = $this->createMock(ISearchQuery::class); + $termFilter = $this->createMock(IFilter::class); + $termFilter->method('get')->willReturn($term); + $query->method('getFilter')->willReturnCallback(function($filter) use ($termFilter) { + return match ($filter) { + 'term' => $termFilter, + default => null, + }; + }); + $message1 = new Message(); + $message1->setSubject('This is not spam'); + $message1->setFrom(AddressList::parse('Sender ')); + $this->serviceMock->getParameter('mailSearch') + ->expects(self::once()) + ->method('findMessagesGlobally') + ->with( + $user, + 'subject:spam' + ) + ->willReturn([ + $message1, + ]); + + $result = $this->provider->search( + $user, + $query, + ); + + self::assertNotEmpty($result->jsonSerialize()['entries'] ?? []); + } + + public function testSearchForUserNoEmail(): void { + $user = $this->createMock(IUser::class); + $otherUser = $this->createMock(IUser::class); + $query = $this->createMock(ISearchQuery::class); + $termFilter = $this->createMock(IFilter::class); + $termFilter->method('get')->willReturn($otherUser); + $query->method('getFilter')->willReturnCallback(function($filter) use ($termFilter) { + return match ($filter) { + 'person' => $termFilter, + default => null, + }; + }); + $this->serviceMock->getParameter('mailSearch') + ->expects(self::never()) + ->method('findMessagesGlobally'); + + $result = $this->provider->search( + $user, + $query, + ); + + self::assertEmpty($result->jsonSerialize()['entries'] ?? []); + } + + public function testSearchForUser(): void { + $user = $this->createMock(IUser::class); + $otherUser = $this->createMock(IUser::class); + $otherUser->method('getEMailAddress')->willReturn('other@domain.tld'); + $query = $this->createMock(ISearchQuery::class); + $userFilter = $this->createMock(IFilter::class); + $userFilter->method('get')->willReturn($otherUser); + $query->method('getFilter')->willReturnCallback(function($filter) use ($userFilter) { + return match ($filter) { + 'person' => $userFilter, + default => null, + }; + }); + $message1 = new Message(); + $message1->setSubject('This is not spam'); + $message1->setFrom(AddressList::parse('Other ')); + $this->serviceMock->getParameter('mailSearch') + ->expects(self::once()) + ->method('findMessagesGlobally') + ->with( + $user, + "from:other@domain.tld to:other@domain.tld cc:other@domain.tld" + ) + ->willReturn([ + $message1, + ]); + + $result = $this->provider->search( + $user, + $query, + ); + + self::assertNotEmpty($result->jsonSerialize()['entries'] ?? []); + } + +}