nextcloud/apps/settings/tests/SetupChecks/CheckServerResponseTraitTest.php
Ferdinand Thiessen 27300ac6ce
fix(setup-checks): Ensure URL with webroot works
We basically mock the way `URLGenerator::getAbsoluteURL` works,
so we must make sure that the URL might already contain the webroot.
Because `baseURL` and `cliURL` also contain the webroot we need to remove
the webroot from the URL first.

Co-authored-by: Ferdinand Thiessen <opensource@fthiessen.de>
Co-authored-by: Daniel <mail@danielkesselberg.de>
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2024-09-15 21:40:27 +02:00

214 lines
7.7 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Settings\Tests\SetupChecks;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IL10N;
use OCP\IURLGenerator;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Test\TestCase;
class CheckServerResponseTraitTest extends TestCase {
protected const BASE_URL = 'https://nextcloud.local';
private IL10N&MockObject $l10n;
private IConfig&MockObject $config;
private IURLGenerator&MockObject $urlGenerator;
private IClientService&MockObject $clientService;
private LoggerInterface&MockObject $logger;
private CheckServerResponseTraitImplementation $trait;
protected function setUp(): void {
parent::setUp();
$this->l10n = $this->createMock(IL10N::class);
$this->l10n->method('t')
->willReturnArgument(0);
$this->config = $this->createMock(IConfig::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->clientService = $this->createMock(IClientService::class);
$this->logger = $this->createMock(LoggerInterface::class);
$this->trait = new CheckServerResponseTraitImplementation(
$this->l10n,
$this->config,
$this->urlGenerator,
$this->clientService,
$this->logger,
);
}
/**
* @dataProvider dataNormalizeUrl
*/
public function testNormalizeUrl(string $url, string $webRoot, bool $removeWebRoot, string $expected): void {
$this->assertEquals($expected, $this->trait->normalizeUrl($url, $webRoot, $removeWebRoot));
}
public static function dataNormalizeUrl(): array {
return [
'valid and nothing to change' => ['http://example.com/root', '/root', false, 'http://example.com/root'],
'trailing slash' => ['http://example.com/root/', '/root', false, 'http://example.com/root'],
'remove web root' => ['http://example.com/root/', '/root', true, 'http://example.com'],
'remove web root but empty' => ['http://example.com', '', true, 'http://example.com'],
];
}
/**
* @dataProvider dataGetTestUrls
*/
public function testGetTestUrls(
string $url,
bool $removeWebRoot,
string $cliUrl,
string $webRoot,
array $trustedDomains,
array $expected,
): void {
$this->config->expects(self::atLeastOnce())
->method('getSystemValueString')
->with('overwrite.cli.url', '')
->willReturn($cliUrl);
$this->config->expects(self::atLeastOnce())
->method('getSystemValue')
->with('trusted_domains', [])
->willReturn($trustedDomains);
$this->urlGenerator->expects(self::atLeastOnce())
->method('getWebroot')
->willReturn($webRoot);
$this->urlGenerator->expects(self::atLeastOnce())
->method('getBaseUrl')
->willReturn(self::BASE_URL . $webRoot);
$result = $this->trait->getTestUrls($url, $removeWebRoot);
$this->assertEquals($expected, $result);
}
public static function dataGetTestUrls(): array {
return [
'same cli and base URL' => [
'/apps/files/js/example.js', false, 'https://nextcloud.local', '', ['nextcloud.local'], [
// from cli url
'https://nextcloud.local/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/apps/files/js/example.js',
]
],
'different cli and base URL' => [
'/apps/files/js/example.js', false, 'https://example.com', '', ['nextcloud.local'], [
// from cli url
'https://example.com/apps/files/js/example.js',
// from base url
'https://nextcloud.local/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/apps/files/js/example.js',
]
],
'different cli and base URL and trusted domains' => [
'/apps/files/js/example.js', false, 'https://example.com', '', ['nextcloud.local', 'example.com', '127.0.0.1'], [
// from cli url
'https://example.com/apps/files/js/example.js',
// from base url
'https://nextcloud.local/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/apps/files/js/example.js',
'http://example.com/apps/files/js/example.js',
// trusted domains
'https://127.0.0.1/apps/files/js/example.js',
'http://127.0.0.1/apps/files/js/example.js',
]
],
'wildcard trusted domains' => [
'/apps/files/js/example.js', false, '', '', ['nextcloud.local', '*.example.com'], [
// from base url
'https://nextcloud.local/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/apps/files/js/example.js',
// trusted domains with wild card are skipped
]
],
'missing leading slash' => [
'apps/files/js/example.js', false, 'https://nextcloud.local', '', ['nextcloud.local'], [
// from cli url
'https://nextcloud.local/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/apps/files/js/example.js',
]
],
'keep web-root' => [
'/apps/files/js/example.js', false, 'https://example.com', '/nextcloud', ['nextcloud.local', 'example.com', '192.168.100.1'], [
// from cli url (note that the CLI url has NO web root)
'https://example.com/apps/files/js/example.js',
// from base url
'https://nextcloud.local/nextcloud/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/nextcloud/apps/files/js/example.js',
// trusted domains with web-root
'https://example.com/nextcloud/apps/files/js/example.js',
'http://example.com/nextcloud/apps/files/js/example.js',
'https://192.168.100.1/nextcloud/apps/files/js/example.js',
'http://192.168.100.1/nextcloud/apps/files/js/example.js',
]
],
// example if the URL is generated by the URL generator
'keep web-root and web root in url' => [
'/nextcloud/apps/files/js/example.js', false, 'https://example.com', '/nextcloud', ['nextcloud.local', 'example.com', '192.168.100.1'], [
// from cli url (note that the CLI url has NO web root)
'https://example.com/apps/files/js/example.js',
// from base url
'https://nextcloud.local/nextcloud/apps/files/js/example.js',
// http variant from trusted domains
'http://nextcloud.local/nextcloud/apps/files/js/example.js',
// trusted domains with web-root
'https://example.com/nextcloud/apps/files/js/example.js',
'http://example.com/nextcloud/apps/files/js/example.js',
'https://192.168.100.1/nextcloud/apps/files/js/example.js',
'http://192.168.100.1/nextcloud/apps/files/js/example.js',
]
],
'remove web-root' => [
'/.well-known/caldav', true, 'https://example.com', '/nextcloud', ['nextcloud.local', 'example.com', '192.168.100.1'], [
// from cli url (note that the CLI url has NO web root)
'https://example.com/.well-known/caldav',
// from base url
'https://nextcloud.local/.well-known/caldav',
// http variant from trusted domains
'http://nextcloud.local/.well-known/caldav',
'http://example.com/.well-known/caldav',
// trusted domains with web-root
'https://192.168.100.1/.well-known/caldav',
'http://192.168.100.1/.well-known/caldav',
]
],
// example if the URL is generated by the URL generator
'remove web-root and web root in url' => [
'/nextcloud/.well-known/caldav', true, 'https://example.com', '/nextcloud', ['nextcloud.local', 'example.com', '192.168.100.1'], [
// from cli url (note that the CLI url has NO web root)
'https://example.com/.well-known/caldav',
// from base url
'https://nextcloud.local/.well-known/caldav',
// http variant from trusted domains
'http://nextcloud.local/.well-known/caldav',
'http://example.com/.well-known/caldav',
// trusted domains with web-root
'https://192.168.100.1/.well-known/caldav',
'http://192.168.100.1/.well-known/caldav',
]
],
];
}
}