nextcloud-server/apps/federatedfilesharing/tests/AddressHandlerTest.php

175 lines
5.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2016 ownCloud, Inc.
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\FederatedFileSharing\Tests;
use OC\Federation\CloudIdManager;
use OCA\FederatedFileSharing\AddressHandler;
use OCP\Contacts\IManager;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\HintException;
use OCP\ICacheFactory;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\IUserManager;
use PHPUnit\Framework\MockObject\MockObject;
class AddressHandlerTest extends \Test\TestCase {
protected IManager&MockObject $contactsManager;
private IURLGenerator&MockObject $urlGenerator;
private IL10N&MockObject $il10n;
private CloudIdManager $cloudIdManager;
private AddressHandler $addressHandler;
protected function setUp(): void {
parent::setUp();
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->il10n = $this->createMock(IL10N::class);
$this->contactsManager = $this->createMock(IManager::class);
$this->cloudIdManager = new CloudIdManager(
$this->createMock(ICacheFactory::class),
$this->createMock(IEventDispatcher::class),
$this->contactsManager,
$this->urlGenerator,
$this->createMock(IUserManager::class),
);
$this->addressHandler = new AddressHandler($this->urlGenerator, $this->il10n, $this->cloudIdManager);
}
public static function dataTestSplitUserRemote(): array {
$userPrefix = ['user@name', 'username'];
$protocols = ['', 'http://', 'https://'];
$remotes = [
'localhost',
'local.host',
'dev.local.host',
'dev.local.host/path',
'dev.local.host/at@inpath',
'127.0.0.1',
'::1',
'::192.0.2.128',
'::192.0.2.128/at@inpath',
];
$testCases = [];
foreach ($userPrefix as $user) {
foreach ($remotes as $remote) {
foreach ($protocols as $protocol) {
$baseUrl = $user . '@' . $protocol . $remote;
if ($protocol === '') {
// https:// protocol is expected in the final result
$protocol = 'https://';
}
$testCases[] = [$baseUrl, $user, $protocol . $remote];
$testCases[] = [$baseUrl . '/', $user, $protocol . $remote];
$testCases[] = [$baseUrl . '/index.php', $user, $protocol . $remote];
$testCases[] = [$baseUrl . '/index.php/s/token', $user, $protocol . $remote];
}
}
}
return $testCases;
}
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestSplitUserRemote')]
public function testSplitUserRemote(string $remote, string $expectedUser, string $expectedUrl): void {
$this->contactsManager->expects($this->any())
->method('search')
->willReturn([]);
[$remoteUser, $remoteUrl] = $this->addressHandler->splitUserRemote($remote);
$this->assertSame($expectedUser, $remoteUser);
$this->assertSame($expectedUrl, $remoteUrl);
}
public static function dataTestSplitUserRemoteError(): array {
return [
// Invalid path
['user@'],
// Invalid user
['@server'],
['us/er@server'],
['us:er@server'],
// Invalid splitting
['user'],
[''],
['us/erserver'],
['us:erserver'],
];
}
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestSplitUserRemoteError')]
public function testSplitUserRemoteError(string $id): void {
$this->expectException(HintException::class);
$this->addressHandler->splitUserRemote($id);
}
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestCompareAddresses')]
public function testCompareAddresses(string $user1, string $server1, string $user2, string $server2, bool $expected): void {
$this->assertSame($expected,
$this->addressHandler->compareAddresses($user1, $server1, $user2, $server2)
);
}
public static function dataTestCompareAddresses(): array {
return [
['user1', 'http://server1', 'user1', 'http://server1', true],
['user1', 'https://server1', 'user1', 'http://server1', true],
['user1', 'http://serVer1', 'user1', 'http://server1', true],
['user1', 'http://server1/', 'user1', 'http://server1', true],
['user1', 'server1', 'user1', 'http://server1', true],
['user1', 'http://server1', 'user1', 'http://server2', false],
['user1', 'https://server1', 'user1', 'http://server2', false],
['user1', 'http://serVer1', 'user1', 'http://serer2', false],
['user1', 'http://server1/', 'user1', 'http://server2', false],
['user1', 'server1', 'user1', 'http://server2', false],
['user1', 'http://server1', 'user2', 'http://server1', false],
['user1', 'https://server1', 'user2', 'http://server1', false],
['user1', 'http://serVer1', 'user2', 'http://server1', false],
['user1', 'http://server1/', 'user2', 'http://server1', false],
['user1', 'server1', 'user2', 'http://server1', false],
];
}
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestRemoveProtocolFromUrl')]
public function testRemoveProtocolFromUrl(string $url, string $expectedResult): void {
$result = $this->addressHandler->removeProtocolFromUrl($url);
$this->assertSame($expectedResult, $result);
}
public static function dataTestRemoveProtocolFromUrl(): array {
return [
['http://example.tld', 'example.tld'],
['https://example.tld', 'example.tld'],
['example.tld', 'example.tld'],
];
}
#[\PHPUnit\Framework\Attributes\DataProvider('dataTestUrlContainProtocol')]
public function testUrlContainProtocol(string $url, bool $expectedResult): void {
$result = $this->addressHandler->urlContainProtocol($url);
$this->assertSame($expectedResult, $result);
}
public static function dataTestUrlContainProtocol(): array {
return [
['http://nextcloud.com', true],
['https://nextcloud.com', true],
['nextcloud.com', false],
['httpserver.com', false],
];
}
}