diff options
Diffstat (limited to 'tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php')
-rw-r--r-- | tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php | 471 |
1 files changed, 283 insertions, 188 deletions
diff --git a/tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php b/tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php index bd82c203ff5..9097ee779d2 100644 --- a/tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php +++ b/tests/lib/Contacts/ContactsMenu/ContactsStoreTest.php @@ -1,26 +1,10 @@ <?php + +declare(strict_types=1); + /** - * @copyright 2017 Christoph Wurst <christoph@winzerhof-wurst.at> - * @copyright 2017 Lukas Reschke <lukas@statuscode.ch> - * - * @author 2017 Christoph Wurst <christoph@winzerhof-wurst.at> - * @author 2017 Lukas Reschke <lukas@statuscode.ch> - * - * @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/>. - * + * SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace Tests\Contacts\ContactsMenu; @@ -28,6 +12,8 @@ namespace Tests\Contacts\ContactsMenu; use OC\Contacts\ContactsMenu\ContactsStore; use OC\KnownUser\KnownUserService; use OC\Profile\ProfileManager; +use OCA\UserStatus\Db\UserStatus; +use OCA\UserStatus\Service\StatusService; use OCP\Contacts\IManager; use OCP\IConfig; use OCP\IGroupManager; @@ -39,19 +25,19 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class ContactsStoreTest extends TestCase { - /** @var ContactsStore */ - private $contactsStore; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ + private ContactsStore $contactsStore; + private StatusService|MockObject $statusService; + /** @var IManager|MockObject */ private $contactsManager; /** @var ProfileManager */ private $profileManager; - /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IUserManager|MockObject */ private $userManager; /** @var IURLGenerator */ private $urlGenerator; - /** @var IGroupManager|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IGroupManager|MockObject */ private $groupManager; - /** @var IConfig|\PHPUnit\Framework\MockObject\MockObject */ + /** @var IConfig|MockObject */ private $config; /** @var KnownUserService|MockObject */ private $knownUserService; @@ -62,6 +48,7 @@ class ContactsStoreTest extends TestCase { parent::setUp(); $this->contactsManager = $this->createMock(IManager::class); + $this->statusService = $this->createMock(StatusService::class); $this->userManager = $this->createMock(IUserManager::class); $this->profileManager = $this->createMock(ProfileManager::class); $this->urlGenerator = $this->createMock(IURLGenerator::class); @@ -71,18 +58,19 @@ class ContactsStoreTest extends TestCase { $this->l10nFactory = $this->createMock(IL10NFactory::class); $this->contactsStore = new ContactsStore( $this->contactsManager, + $this->statusService, $this->config, $this->profileManager, $this->userManager, $this->urlGenerator, $this->groupManager, $this->knownUserService, - $this->l10nFactory + $this->l10nFactory, ); } - public function testGetContactsWithoutFilter() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testGetContactsWithoutFilter(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -111,8 +99,8 @@ class ContactsStoreTest extends TestCase { ], $entries[1]->getEMailAddresses()); } - public function testGetContactsHidesOwnEntry() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testGetContactsHidesOwnEntry(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -138,9 +126,13 @@ class ContactsStoreTest extends TestCase { $this->assertCount(1, $entries); } - public function testGetContactsWithoutBinaryImage() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testGetContactsWithoutBinaryImage(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); + $this->urlGenerator->expects($this->any()) + ->method('linkToRouteAbsolute') + ->with('core.GuestAvatar.getAvatar', $this->anything()) + ->willReturn('https://urlToNcAvatar.test'); $this->contactsManager->expects($this->once()) ->method('search') ->with($this->equalTo(''), $this->equalTo(['FN', 'EMAIL'])) @@ -164,11 +156,11 @@ class ContactsStoreTest extends TestCase { $entries = $this->contactsStore->getContacts($user, ''); $this->assertCount(2, $entries); - $this->assertNull($entries[1]->getAvatar()); + $this->assertSame('https://urlToNcAvatar.test', $entries[1]->getAvatar()); } - public function testGetContactsWithoutAvatarURI() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testGetContactsWithoutAvatarURI(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -196,7 +188,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('https://photo', $entries[1]->getAvatar()); } - public function testGetContactsWhenUserIsInExcludeGroups() { + public function testGetContactsWhenUserIsInExcludeGroups(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -206,9 +198,10 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_exclude_groups', 'no', 'yes'], ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], ['core', 'shareapi_exclude_groups_list', '', '["group1", "group5", "group6"]'], + ['core', 'shareapi_only_share_with_group_members_exclude_group_list', '', '[]'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') @@ -240,7 +233,7 @@ class ContactsStoreTest extends TestCase { $this->assertCount(0, $entries); } - public function testGetContactsOnlyShareIfInTheSameGroup() { + public function testGetContactsOnlyShareIfInTheSameGroup(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -249,46 +242,40 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], ['core', 'shareapi_exclude_groups', 'no', 'no'], ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], + ['core', 'shareapi_only_share_with_group_members_exclude_group_list', '', '[]'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) - ->method('getUserGroupIds') - ->with($this->equalTo($currentUser)) - ->willReturn(['group1', 'group2', 'group3']); - $user1 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(0)) - ->method('get') - ->with('user1') - ->willReturn($user1); - $this->groupManager->expects($this->at(1)) - ->method('getUserGroupIds') - ->with($this->equalTo($user1)) - ->willReturn(['group1']); $user2 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(1)) - ->method('get') - ->with('user2') - ->willReturn($user2); - $this->groupManager->expects($this->at(2)) - ->method('getUserGroupIds') - ->with($this->equalTo($user2)) - ->willReturn(['group2', 'group3']); $user3 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(2)) - ->method('get') - ->with('user3') - ->willReturn($user3); - $this->groupManager->expects($this->at(3)) + + $calls = [ + [[$currentUser], ['group1', 'group2', 'group3']], + [[$user1], ['group1']], + [[$user2], ['group2', 'group3']], + [[$user3], ['group8', 'group9']], + ]; + $this->groupManager->expects($this->exactly(4)) ->method('getUserGroupIds') - ->with($this->equalTo($user3)) - ->willReturn(['group8', 'group9']); + ->willReturnCallback(function () use (&$calls): array { + $expected = array_shift($calls); + $this->assertEquals($expected[0], func_get_args()); + return $expected[1]; + }); + + $this->userManager->expects($this->exactly(3)) + ->method('get') + ->willReturnMap([ + ['user1', $user1], + ['user2', $user2], + ['user3', $user3], + ]); $this->contactsManager->expects($this->once()) ->method('search') @@ -319,7 +306,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[2]->getProperty('UID')); } - public function testGetContactsOnlyEnumerateIfInTheSameGroup() { + public function testGetContactsOnlyEnumerateIfInTheSameGroup(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -328,46 +315,40 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], ['core', 'shareapi_exclude_groups', 'no', 'no'], ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], + ['core', 'shareapi_only_share_with_group_members_exclude_group_list', '', '[]'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) - ->method('getUserGroupIds') - ->with($this->equalTo($currentUser)) - ->willReturn(['group1', 'group2', 'group3']); - $user1 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(0)) - ->method('get') - ->with('user1') - ->willReturn($user1); - $this->groupManager->expects($this->at(1)) - ->method('getUserGroupIds') - ->with($this->equalTo($user1)) - ->willReturn(['group1']); $user2 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(1)) - ->method('get') - ->with('user2') - ->willReturn($user2); - $this->groupManager->expects($this->at(2)) - ->method('getUserGroupIds') - ->with($this->equalTo($user2)) - ->willReturn(['group2', 'group3']); $user3 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(2)) - ->method('get') - ->with('user3') - ->willReturn($user3); - $this->groupManager->expects($this->at(3)) + + $calls = [ + [[$currentUser], ['group1', 'group2', 'group3']], + [[$user1], ['group1']], + [[$user2], ['group2', 'group3']], + [[$user3], ['group8', 'group9']], + ]; + $this->groupManager->expects($this->exactly(4)) ->method('getUserGroupIds') - ->with($this->equalTo($user3)) - ->willReturn(['group8', 'group9']); + ->willReturnCallback(function () use (&$calls): array { + $expected = array_shift($calls); + $this->assertEquals($expected[0], func_get_args()); + return $expected[1]; + }); + + $this->userManager->expects($this->exactly(3)) + ->method('get') + ->willReturnMap([ + ['user1', $user1], + ['user2', $user2], + ['user3', $user3], + ]); $this->contactsManager->expects($this->once()) ->method('search') @@ -398,7 +379,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[2]->getProperty('UID')); } - public function testGetContactsOnlyEnumerateIfPhoneBookMatch() { + public function testGetContactsOnlyEnumerateIfPhoneBookMatch(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -409,13 +390,13 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_only_share_with_group_members', 'no', 'no'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) + $this->groupManager->expects($this->once()) ->method('getUserGroupIds') ->with($this->equalTo($currentUser)) ->willReturn(['group1', 'group2', 'group3']); @@ -456,7 +437,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[2]->getProperty('UID')); } - public function testGetContactsOnlyEnumerateIfPhoneBookMatchWithOwnGroupsOnly() { + public function testGetContactsOnlyEnumerateIfPhoneBookMatchWithOwnGroupsOnly(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -465,46 +446,40 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'yes'], ['core', 'shareapi_exclude_groups', 'no', 'no'], ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], + ['core', 'shareapi_only_share_with_group_members_exclude_group_list', '', '[]'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) - ->method('getUserGroupIds') - ->with($this->equalTo($currentUser)) - ->willReturn(['group1', 'group2', 'group3']); - $user1 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(0)) - ->method('get') - ->with('user1') - ->willReturn($user1); - $this->groupManager->expects($this->at(1)) - ->method('getUserGroupIds') - ->with($this->equalTo($user1)) - ->willReturn(['group1']); $user2 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(1)) - ->method('get') - ->with('user2') - ->willReturn($user2); - $this->groupManager->expects($this->at(2)) - ->method('getUserGroupIds') - ->with($this->equalTo($user2)) - ->willReturn(['group2', 'group3']); $user3 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(2)) - ->method('get') - ->with('user3') - ->willReturn($user3); - $this->groupManager->expects($this->at(3)) + + $calls = [ + [[$currentUser], ['group1', 'group2', 'group3']], + [[$user1], ['group1']], + [[$user2], ['group2', 'group3']], + [[$user3], ['group8', 'group9']], + ]; + $this->groupManager->expects($this->exactly(4)) ->method('getUserGroupIds') - ->with($this->equalTo($user3)) - ->willReturn(['group8', 'group9']); + ->willReturnCallback(function () use (&$calls): array { + $expected = array_shift($calls); + $this->assertEquals($expected[0], func_get_args()); + return $expected[1]; + }); + + $this->userManager->expects($this->exactly(3)) + ->method('get') + ->willReturnMap([ + ['user1', $user1], + ['user2', $user2], + ['user3', $user3], + ]); $this->knownUserService->method('isKnownToUser') ->willReturnMap([ @@ -542,7 +517,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[2]->getProperty('UID')); } - public function testGetContactsOnlyEnumerateIfPhoneBookOrSameGroup() { + public function testGetContactsOnlyEnumerateIfPhoneBookOrSameGroup(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -553,26 +528,30 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_only_share_with_group_members', 'no', 'no'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) + $user1 = $this->createMock(IUser::class); + + $calls = [ + [[$currentUser], ['group1', 'group2', 'group3']], + [[$user1], ['group1']], + ]; + $this->groupManager->expects($this->exactly(2)) ->method('getUserGroupIds') - ->with($this->equalTo($currentUser)) - ->willReturn(['group1', 'group2', 'group3']); + ->willReturnCallback(function () use (&$calls): array { + $expected = array_shift($calls); + $this->assertEquals($expected[0], func_get_args()); + return $expected[1]; + }); - $user1 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(0)) + $this->userManager->expects($this->once()) ->method('get') ->with('user1') ->willReturn($user1); - $this->groupManager->expects($this->at(1)) - ->method('getUserGroupIds') - ->with($this->equalTo($user1)) - ->willReturn(['group1']); $this->knownUserService->method('isKnownToUser') ->willReturnMap([ @@ -611,7 +590,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[3]->getProperty('UID')); } - public function testGetContactsOnlyEnumerateIfPhoneBookOrSameGroupInOwnGroupsOnly() { + public function testGetContactsOnlyEnumerateIfPhoneBookOrSameGroupInOwnGroupsOnly(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -620,46 +599,40 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'yes'], ['core', 'shareapi_exclude_groups', 'no', 'no'], ['core', 'shareapi_only_share_with_group_members', 'no', 'yes'], + ['core', 'shareapi_only_share_with_group_members_exclude_group_list', '', '[]'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $currentUser */ + /** @var IUser|MockObject $currentUser */ $currentUser = $this->createMock(IUser::class); $currentUser->expects($this->exactly(2)) ->method('getUID') ->willReturn('user001'); - $this->groupManager->expects($this->at(0)) - ->method('getUserGroupIds') - ->with($this->equalTo($currentUser)) - ->willReturn(['group1', 'group2', 'group3']); - $user1 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(0)) - ->method('get') - ->with('user1') - ->willReturn($user1); - $this->groupManager->expects($this->at(1)) - ->method('getUserGroupIds') - ->with($this->equalTo($user1)) - ->willReturn(['group1']); $user2 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(1)) - ->method('get') - ->with('user2') - ->willReturn($user2); - $this->groupManager->expects($this->at(2)) - ->method('getUserGroupIds') - ->with($this->equalTo($user2)) - ->willReturn(['group2', 'group3']); $user3 = $this->createMock(IUser::class); - $this->userManager->expects($this->at(2)) - ->method('get') - ->with('user3') - ->willReturn($user3); - $this->groupManager->expects($this->at(3)) + + $calls = [ + [[$currentUser], ['group1', 'group2', 'group3']], + [[$user1], ['group1']], + [[$user2], ['group2', 'group3']], + [[$user3], ['group8', 'group9']], + ]; + $this->groupManager->expects($this->exactly(4)) ->method('getUserGroupIds') - ->with($this->equalTo($user3)) - ->willReturn(['group8', 'group9']); + ->willReturnCallback(function () use (&$calls): array { + $expected = array_shift($calls); + $this->assertEquals($expected[0], func_get_args()); + return $expected[1]; + }); + + $this->userManager->expects($this->exactly(3)) + ->method('get') + ->willReturnMap([ + ['user1', $user1], + ['user2', $user2], + ['user3', $user3], + ]); $this->knownUserService->method('isKnownToUser') ->willReturnMap([ @@ -697,7 +670,7 @@ class ContactsStoreTest extends TestCase { $this->assertEquals('contact', $entries[2]->getProperty('UID')); } - public function testGetContactsWithFilter() { + public function testGetContactsWithFilter(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -705,7 +678,7 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_full_match', 'yes', 'yes'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->any()) ->method('search') @@ -784,7 +757,7 @@ class ContactsStoreTest extends TestCase { ], $entry[0]->getEMailAddresses()); } - public function testGetContactsWithFilterWithoutFullMatch() { + public function testGetContactsWithFilterWithoutFullMatch(): void { $this->config ->method('getAppValue') ->willReturnMap([ @@ -792,7 +765,7 @@ class ContactsStoreTest extends TestCase { ['core', 'shareapi_restrict_user_enumeration_full_match', 'yes', 'no'], ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->any()) ->method('search') @@ -868,12 +841,20 @@ class ContactsStoreTest extends TestCase { ], $entry[0]->getEMailAddresses()); } - public function testFindOneUser() { - $this->config->expects($this->at(0))->method('getAppValue') - ->with($this->equalTo('core'), $this->equalTo('shareapi_allow_share_dialog_user_enumeration'), $this->equalTo('yes')) - ->willReturn('yes'); + public function testFindOneUser(): void { + $this->config + ->method('getAppValue') + ->willReturnMap([ + ['core', 'shareapi_allow_share_dialog_user_enumeration', 'yes', 'yes'], + ['core', 'shareapi_restrict_user_enumeration_to_group', 'no', 'no'], + ['core', 'shareapi_restrict_user_enumeration_to_phone', 'no', 'no'], + ['core', 'shareapi_restrict_user_enumeration_full_match', 'yes', 'yes'], + ['core', 'shareapi_exclude_groups', 'no', 'yes'], + ['core', 'shareapi_exclude_groups_list', '', ''], + ['core', 'shareapi_only_share_with_group_members', 'no', 'no'], + ]); - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -903,8 +884,8 @@ class ContactsStoreTest extends TestCase { ], $entry->getEMailAddresses()); } - public function testFindOneEMail() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testFindOneEMail(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -934,8 +915,8 @@ class ContactsStoreTest extends TestCase { ], $entry->getEMailAddresses()); } - public function testFindOneNotSupportedType() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testFindOneNotSupportedType(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $entry = $this->contactsStore->findOne($user, 42, 'darren@roner.au'); @@ -943,8 +924,8 @@ class ContactsStoreTest extends TestCase { $this->assertEquals(null, $entry); } - public function testFindOneNoMatches() { - /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ + public function testFindOneNoMatches(): void { + /** @var IUser|MockObject $user */ $user = $this->createMock(IUser::class); $this->contactsManager->expects($this->once()) ->method('search') @@ -970,4 +951,118 @@ class ContactsStoreTest extends TestCase { $this->assertEquals(null, $entry); } + + public function testGetRecentStatusFirst(): void { + $user = $this->createMock(IUser::class); + $status1 = new UserStatus(); + $status1->setUserId('user1'); + $status2 = new UserStatus(); + $status2->setUserId('user2'); + $this->statusService->expects(self::once()) + ->method('findAllRecentStatusChanges') + ->willReturn([ + $status1, + $status2, + ]); + $user1 = $this->createMock(IUser::class); + $user1->method('getCloudId')->willReturn('user1@localcloud'); + $user2 = $this->createMock(IUser::class); + $user2->method('getCloudId')->willReturn('user2@localcloud'); + $this->userManager->expects(self::exactly(2)) + ->method('get') + ->willReturnCallback(function ($uid) use ($user1, $user2) { + return match ($uid) { + 'user1' => $user1, + 'user2' => $user2, + }; + }); + $this->contactsManager + ->expects(self::exactly(3)) + ->method('search') + ->willReturnCallback(function ($uid, $searchProps, $options) { + return match ([$uid, $options['limit'] ?? null]) { + ['user1@localcloud', 1] => [ + [ + 'UID' => 'user1', + 'URI' => 'user1.vcf', + ], + ], + ['user2@localcloud' => [], 1], // Simulate not found + ['', 4] => [ + [ + 'UID' => 'contact1', + 'URI' => 'contact1.vcf', + ], + [ + 'UID' => 'contact2', + 'URI' => 'contact2.vcf', + ], + ], + default => [], + }; + }); + + $contacts = $this->contactsStore->getContacts( + $user, + null, + 5, + ); + + self::assertCount(3, $contacts); + self::assertEquals('user1', $contacts[0]->getProperty('UID')); + self::assertEquals('contact1', $contacts[1]->getProperty('UID')); + self::assertEquals('contact2', $contacts[2]->getProperty('UID')); + } + + public function testPaginateRecentStatus(): void { + $user = $this->createMock(IUser::class); + $status1 = new UserStatus(); + $status1->setUserId('user1'); + $status2 = new UserStatus(); + $status2->setUserId('user2'); + $status3 = new UserStatus(); + $status3->setUserId('user3'); + $this->statusService->expects(self::never()) + ->method('findAllRecentStatusChanges'); + $this->contactsManager + ->expects(self::exactly(2)) + ->method('search') + ->willReturnCallback(function ($uid, $searchProps, $options) { + return match ([$uid, $options['limit'] ?? null, $options['offset'] ?? null]) { + ['', 2, 0] => [ + [ + 'UID' => 'contact1', + 'URI' => 'contact1.vcf', + ], + [ + 'UID' => 'contact2', + 'URI' => 'contact2.vcf', + ], + ], + ['', 2, 3] => [ + [ + 'UID' => 'contact3', + 'URI' => 'contact3.vcf', + ], + ], + default => [], + }; + }); + + $page1 = $this->contactsStore->getContacts( + $user, + null, + 2, + 0, + ); + $page2 = $this->contactsStore->getContacts( + $user, + null, + 2, + 3, + ); + + self::assertCount(2, $page1); + self::assertCount(1, $page2); + } } |