aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorFerdinand Thiessen <opensource@fthiessen.de>2024-09-13 14:18:25 +0200
committerJoas Schilling <coding@schilljs.com>2024-09-16 14:58:21 +0200
commit7fbd518452570e1e3c77815acaf6ab0242b00d08 (patch)
tree76330afc5e2b841a2155778954f6931d5fe8d022 /tests
parentff0cab5956c289bad60db54716b148c8879566a4 (diff)
downloadnextcloud-server-7fbd518452570e1e3c77815acaf6ab0242b00d08.tar.gz
nextcloud-server-7fbd518452570e1e3c77815acaf6ab0242b00d08.zip
feat: Make `CheckServerResponseTrait` public and provide as `OCP\SetupCheck\CheckServerResponseTrait`feat/make-setup-check-trait-public
This trait is used by other apps for creating setup checks, so we should provide it instead apps using private API. Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'tests')
-rw-r--r--tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php39
-rw-r--r--tests/lib/SetupCheck/CheckServerResponseTraitTest.php213
2 files changed, 252 insertions, 0 deletions
diff --git a/tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php b/tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php
new file mode 100644
index 00000000000..1119c5ed0d9
--- /dev/null
+++ b/tests/lib/SetupCheck/CheckServerResponseTraitImplementation.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace Test\SetupCheck;
+
+use OCP\Http\Client\IClientService;
+use OCP\IConfig;
+use OCP\IL10N;
+use OCP\IURLGenerator;
+use OCP\SetupCheck\CheckServerResponseTrait;
+use Psr\Log\LoggerInterface;
+
+/**
+ * Dummy implementation for CheckServerResponseTraitTest
+ */
+class CheckServerResponseTraitImplementation {
+
+ use CheckServerResponseTrait {
+ CheckServerResponseTrait::getRequestOptions as public;
+ CheckServerResponseTrait::runRequest as public;
+ CheckServerResponseTrait::normalizeUrl as public;
+ CheckServerResponseTrait::getTestUrls as public;
+ }
+
+ public function __construct(
+ protected IL10N $l10n,
+ protected IConfig $config,
+ protected IURLGenerator $urlGenerator,
+ protected IClientService $clientService,
+ protected LoggerInterface $logger,
+ ) {
+ }
+
+}
diff --git a/tests/lib/SetupCheck/CheckServerResponseTraitTest.php b/tests/lib/SetupCheck/CheckServerResponseTraitTest.php
new file mode 100644
index 00000000000..32fbce64ce6
--- /dev/null
+++ b/tests/lib/SetupCheck/CheckServerResponseTraitTest.php
@@ -0,0 +1,213 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+namespace Test\SetupCheck;
+
+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, bool $isRootRequest, string $expected): void {
+ $this->assertEquals($expected, $this->trait->normalizeUrl($url, $isRootRequest));
+ }
+
+ public static function dataNormalizeUrl(): array {
+ return [
+ // untouched web-root
+ 'valid and nothing to change' => ['http://example.com/root', false, 'http://example.com/root'],
+ 'valid with port and nothing to change' => ['http://example.com:8081/root', false, 'http://example.com:8081/root'],
+ 'trailing slash' => ['http://example.com/root/', false, 'http://example.com/root'],
+ 'deep web root' => ['http://example.com/deep/webroot', false, 'http://example.com/deep/webroot'],
+ // removal of the web-root
+ 'remove web root' => ['http://example.com/root/', true, 'http://example.com'],
+ 'remove web root but empty' => ['http://example.com', true, 'http://example.com'],
+ 'remove deep web root' => ['http://example.com/deep/webroot', true, 'http://example.com'],
+ 'remove web root with port' => ['http://example.com:8081/root', true, 'http://example.com:8081'],
+ 'remove web root with port but empty' => ['http://example.com:8081', true, 'http://example.com:8081'],
+ 'remove web root from IP' => ['https://127.0.0.1/root', true, 'https://127.0.0.1'],
+ 'remove web root from IP with port' => ['https://127.0.0.1:8080/root', true, 'https://127.0.0.1:8080'],
+ 'remove web root from IPv6' => ['https://[ff02::1]/root', true, 'https://[ff02::1]'],
+ 'remove web root from IPv6 with port' => ['https://[ff02::1]:8080/root', true, 'https://[ff02::1]:8080'],
+ ];
+ }
+
+ /**
+ * @dataProvider dataGetTestUrls
+ */
+ public function testGetTestUrls(
+ string $url,
+ bool $isRootRequest,
+ 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, $isRootRequest);
+ $this->assertEquals($expected, $result);
+ }
+
+ /**
+ * @return array<string, list{string, bool, string, string, list<string>, list<string>}>
+ */
+ 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',
+ ]
+ ],
+ ];
+ }
+
+}