diff options
Diffstat (limited to 'tests/lib/Federation/CloudIdManagerTest.php')
-rw-r--r-- | tests/lib/Federation/CloudIdManagerTest.php | 161 |
1 files changed, 102 insertions, 59 deletions
diff --git a/tests/lib/Federation/CloudIdManagerTest.php b/tests/lib/Federation/CloudIdManagerTest.php index dd68abf0ecb..cf97c895dc1 100644 --- a/tests/lib/Federation/CloudIdManagerTest.php +++ b/tests/lib/Federation/CloudIdManagerTest.php @@ -1,62 +1,103 @@ <?php + +declare(strict_types=1); + /** - * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl> - * - * @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 Test\Federation; use OC\Federation\CloudIdManager; +use OC\Memcache\ArrayCache; use OCP\Contacts\IManager; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Federation\ICloudIdManager; +use OCP\ICacheFactory; +use OCP\IURLGenerator; +use OCP\IUserManager; use Test\TestCase; +/** + * @group DB + */ class CloudIdManagerTest extends TestCase { /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ protected $contactsManager; + /** @var IURLGenerator|\PHPUnit\Framework\MockObject\MockObject */ + private $urlGenerator; + /** @var IUserManager|\PHPUnit\Framework\MockObject\MockObject */ + private $userManager; /** @var CloudIdManager */ private $cloudIdManager; + /** @var ICacheFactory|\PHPUnit\Framework\MockObject\MockObject */ + private $cacheFactory; + protected function setUp(): void { parent::setUp(); $this->contactsManager = $this->createMock(IManager::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->userManager = $this->createMock(IUserManager::class); + + $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->cacheFactory->method('createDistributed') + ->willReturn(new ArrayCache('')); + + $this->cloudIdManager = new CloudIdManager( + $this->cacheFactory, + $this->createMock(IEventDispatcher::class), + $this->contactsManager, + $this->urlGenerator, + $this->userManager, + ); + $this->overwriteService(ICloudIdManager::class, $this->cloudIdManager); + } + + public static function dataGetDisplayNameFromContact(): array { + return [ + ['test1@example.tld', 'test', 'test'], + ['test2@example.tld', null, null], + ['test3@example.tld', 'test3@example', 'test3@example'], + ['test4@example.tld', 'test4@example.tld', null], + ]; + } - $this->cloudIdManager = new CloudIdManager($this->contactsManager); + #[\PHPUnit\Framework\Attributes\DataProvider('dataGetDisplayNameFromContact')] + public function testGetDisplayNameFromContact(string $cloudId, ?string $displayName, ?string $expected): void { + $returnedContact = [ + 'CLOUD' => [$cloudId], + 'FN' => $expected, + ]; + if ($displayName === null) { + unset($returnedContact['FN']); + } + $this->contactsManager->method('search') + ->with($cloudId, ['CLOUD']) + ->willReturn([$returnedContact]); + + $this->assertEquals($expected, $this->cloudIdManager->getDisplayNameFromContact($cloudId)); + $this->assertEquals($expected, $this->cloudIdManager->getDisplayNameFromContact($cloudId)); } - public function cloudIdProvider() { + public static function cloudIdProvider(): array { return [ ['test@example.com', 'test', 'example.com', 'test@example.com'], ['test@example.com/cloud', 'test', 'example.com/cloud', 'test@example.com/cloud'], ['test@example.com/cloud/', 'test', 'example.com/cloud', 'test@example.com/cloud'], ['test@example.com/cloud/index.php', 'test', 'example.com/cloud', 'test@example.com/cloud'], ['test@example.com@example.com', 'test@example.com', 'example.com', 'test@example.com@example.com'], + + // Equal signs are not valid on Nextcloud side, but can be used by other federated OCM compatible servers + ['test==@example.com', 'test==', 'example.com', 'test==@example.com'], + ['==@example.com', '==', 'example.com', '==@example.com'], ]; } - /** - * @dataProvider cloudIdProvider - * - * @param string $cloudId - * @param string $user - * @param string $remote - */ - public function testResolveCloudId($cloudId, $user, $remote, $cleanId) { + #[\PHPUnit\Framework\Attributes\DataProvider('cloudIdProvider')] + public function testResolveCloudId(string $cloudId, string $user, string $noProtocolRemote, string $cleanId): void { $displayName = 'Ample Ex'; $this->contactsManager->expects($this->any()) @@ -65,19 +106,19 @@ class CloudIdManagerTest extends TestCase { ->willReturn([ [ 'CLOUD' => [$cleanId], - 'FN' => 'Ample Ex', + 'FN' => $displayName, ] ]); $cloudId = $this->cloudIdManager->resolveCloudId($cloudId); $this->assertEquals($user, $cloudId->getUser()); - $this->assertEquals($remote, $cloudId->getRemote()); + $this->assertEquals('https://' . $noProtocolRemote, $cloudId->getRemote()); $this->assertEquals($cleanId, $cloudId->getId()); - $this->assertEquals($displayName . '@' . $remote, $cloudId->getDisplayId()); + $this->assertEquals($displayName . '@' . $noProtocolRemote, $cloudId->getDisplayId()); } - public function invalidCloudIdProvider() { + public static function invalidCloudIdProvider(): array { return [ ['example.com'], ['test:foo@example.com'], @@ -85,13 +126,8 @@ class CloudIdManagerTest extends TestCase { ]; } - /** - * @dataProvider invalidCloudIdProvider - * - * @param string $cloudId - * - */ - public function testInvalidCloudId($cloudId) { + #[\PHPUnit\Framework\Attributes\DataProvider('invalidCloudIdProvider')] + public function testInvalidCloudId(string $cloudId): void { $this->expectException(\InvalidArgumentException::class); $this->contactsManager->expects($this->never()) @@ -100,33 +136,40 @@ class CloudIdManagerTest extends TestCase { $this->cloudIdManager->resolveCloudId($cloudId); } - public function getCloudIdProvider() { + public static function getCloudIdProvider(): array { return [ - ['test', 'example.com', 'test@example.com'], - ['test@example.com', 'example.com', 'test@example.com@example.com'], + ['test', 'example.com', 'test@example.com', null, 'https://example.com', 'https://example.com'], + ['test', 'http://example.com', 'test@http://example.com', 'test@example.com'], + ['test', null, 'test@http://example.com', 'test@example.com', 'http://example.com', 'http://example.com'], + ['test@example.com', 'example.com', 'test@example.com@example.com', null, 'https://example.com', 'https://example.com'], + ['test@example.com', 'https://example.com', 'test@example.com@example.com'], + ['test@example.com', null, 'test@example.com@example.com', null, 'https://example.com', 'https://example.com'], + ['test@example.com', 'https://example.com/index.php/s/shareToken', 'test@example.com@example.com', null, 'https://example.com', 'https://example.com'], ]; } - /** - * @dataProvider getCloudIdProvider - * - * @param string $user - * @param string $remote - * @param string $id - */ - public function testGetCloudId($user, $remote, $id) { - $this->contactsManager->expects($this->any()) - ->method('search') - ->with($id, ['CLOUD']) - ->willReturn([ - [ - 'CLOUD' => [$id], - 'FN' => 'Ample Ex', - ] - ]); + #[\PHPUnit\Framework\Attributes\DataProvider('getCloudIdProvider')] + public function testGetCloudId(string $user, ?string $remote, string $id, ?string $searchCloudId = null, ?string $localHost = 'https://example.com', ?string $expectedRemoteId = null): void { + if ($remote !== null) { + $this->contactsManager->expects($this->any()) + ->method('search') + ->with($searchCloudId ?? $id, ['CLOUD']) + ->willReturn([ + [ + 'CLOUD' => [$searchCloudId ?? $id], + 'FN' => 'Ample Ex', + ] + ]); + } else { + $this->urlGenerator->expects(self::once()) + ->method('getAbsoluteUrl') + ->willReturn($localHost); + } + $expectedRemoteId ??= $remote; $cloudId = $this->cloudIdManager->getCloudId($user, $remote); - $this->assertEquals($id, $cloudId->getId()); + $this->assertEquals($id, $cloudId->getId(), 'Cloud ID'); + $this->assertEquals($expectedRemoteId, $cloudId->getRemote(), 'Remote URL'); } } |