aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/Federation/CloudIdManagerTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/Federation/CloudIdManagerTest.php')
-rw-r--r--tests/lib/Federation/CloudIdManagerTest.php175
1 files changed, 175 insertions, 0 deletions
diff --git a/tests/lib/Federation/CloudIdManagerTest.php b/tests/lib/Federation/CloudIdManagerTest.php
new file mode 100644
index 00000000000..cf97c895dc1
--- /dev/null
+++ b/tests/lib/Federation/CloudIdManagerTest.php
@@ -0,0 +1,175 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * 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],
+ ];
+ }
+
+ #[\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 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'],
+ ];
+ }
+
+ #[\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())
+ ->method('search')
+ ->with($cleanId, ['CLOUD'])
+ ->willReturn([
+ [
+ 'CLOUD' => [$cleanId],
+ 'FN' => $displayName,
+ ]
+ ]);
+
+ $cloudId = $this->cloudIdManager->resolveCloudId($cloudId);
+
+ $this->assertEquals($user, $cloudId->getUser());
+ $this->assertEquals('https://' . $noProtocolRemote, $cloudId->getRemote());
+ $this->assertEquals($cleanId, $cloudId->getId());
+ $this->assertEquals($displayName . '@' . $noProtocolRemote, $cloudId->getDisplayId());
+ }
+
+ public static function invalidCloudIdProvider(): array {
+ return [
+ ['example.com'],
+ ['test:foo@example.com'],
+ ['test/foo@example.com']
+ ];
+ }
+
+ #[\PHPUnit\Framework\Attributes\DataProvider('invalidCloudIdProvider')]
+ public function testInvalidCloudId(string $cloudId): void {
+ $this->expectException(\InvalidArgumentException::class);
+
+ $this->contactsManager->expects($this->never())
+ ->method('search');
+
+ $this->cloudIdManager->resolveCloudId($cloudId);
+ }
+
+ public static function getCloudIdProvider(): array {
+ return [
+ ['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'],
+ ];
+ }
+
+ #[\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(), 'Cloud ID');
+ $this->assertEquals($expectedRemoteId, $cloudId->getRemote(), 'Remote URL');
+ }
+}