diff options
Diffstat (limited to 'tests/lib/Updater')
-rw-r--r-- | tests/lib/Updater/ChangesCheckTest.php | 80 | ||||
-rw-r--r-- | tests/lib/Updater/ReleaseMetadataTest.php | 207 | ||||
-rw-r--r-- | tests/lib/Updater/VersionCheckTest.php | 68 |
3 files changed, 262 insertions, 93 deletions
diff --git a/tests/lib/Updater/ChangesCheckTest.php b/tests/lib/Updater/ChangesCheckTest.php index 4afb9f05a5b..dd0d97a9e80 100644 --- a/tests/lib/Updater/ChangesCheckTest.php +++ b/tests/lib/Updater/ChangesCheckTest.php @@ -3,25 +3,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2018 Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * - * @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: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace Test\Updater; @@ -59,7 +42,7 @@ class ChangesCheckTest extends TestCase { $this->checker = new ChangesCheck($this->clientService, $this->mapper, $this->logger); } - public function statusCodeProvider():array { + public static function statusCodeProvider(): array { return [ [200, ChangesCheck::RESPONSE_HAS_CONTENT], [304, ChangesCheck::RESPONSE_USE_CACHE], @@ -68,10 +51,8 @@ class ChangesCheckTest extends TestCase { ]; } - /** - * @dataProvider statusCodeProvider - */ - public function testEvaluateResponse(int $statusCode, int $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('statusCodeProvider')] + public function testEvaluateResponse(int $statusCode, int $expected): void { $response = $this->createMock(IResponse::class); $response->expects($this->atLeastOnce()) ->method('getStatusCode') @@ -86,13 +67,15 @@ class ChangesCheckTest extends TestCase { $this->assertSame($expected, $evaluation); } - public function testCacheResultInsert() { + public function testCacheResultInsert(): void { $version = '13.0.4'; $entry = $this->createMock(Changes::class); $entry->expects($this->exactly(2)) ->method('__call') - ->withConsecutive(['getVersion'], ['setVersion', [$version]]) - ->willReturnOnConsecutiveCalls('', null); + ->willReturnMap([ + ['getVersion', [], ''], + ['setVersion', [$version], null], + ]); $this->mapper->expects($this->once()) ->method('insert'); @@ -102,7 +85,7 @@ class ChangesCheckTest extends TestCase { $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); } - public function testCacheResultUpdate() { + public function testCacheResultUpdate(): void { $version = '13.0.4'; $entry = $this->createMock(Changes::class); $entry->expects($this->once()) @@ -117,7 +100,7 @@ class ChangesCheckTest extends TestCase { $this->invokePrivate($this->checker, 'cacheResult', [$entry, $version]); } - public function changesXMLProvider(): array { + public static function changesXMLProvider(): array { return [ [ # 0 - full example '<?xml version="1.0" encoding="utf-8" ?> @@ -286,25 +269,21 @@ class ChangesCheckTest extends TestCase { ]; } - /** - * @dataProvider changesXMLProvider - */ - public function testExtractData(string $body, array $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('changesXMLProvider')] + public function testExtractData(string $body, array $expected): void { $actual = $this->invokePrivate($this->checker, 'extractData', [$body]); $this->assertSame($expected, $actual); } - public function etagProvider() { + public static function etagProvider() { return [ [''], ['a27aab83d8205d73978435076e53d143'] ]; } - /** - * @dataProvider etagProvider - */ - public function testQueryChangesServer(string $etag) { + #[\PHPUnit\Framework\Attributes\DataProvider('etagProvider')] + public function testQueryChangesServer(string $etag): void { $uri = 'https://changes.nextcloud.server/?13.0.5'; $entry = $this->createMock(Changes::class); $entry->expects($this->any()) @@ -327,7 +306,7 @@ class ChangesCheckTest extends TestCase { $this->assertInstanceOf(IResponse::class, $response); } - public function versionProvider(): array { + public static function versionProvider(): array { return [ ['13.0.7', '13.0.7'], ['13.0.7.3', '13.0.7'], @@ -338,30 +317,25 @@ class ChangesCheckTest extends TestCase { ]; } - /** - * @dataProvider versionProvider - */ - public function testNormalizeVersion(string $input, string $expected) { + #[\PHPUnit\Framework\Attributes\DataProvider('versionProvider')] + public function testNormalizeVersion(string $input, string $expected): void { $normalized = $this->checker->normalizeVersion($input); $this->assertSame($expected, $normalized); } - public function changeDataProvider():array { - $testDataFound = $testDataNotFound = $this->versionProvider(); - array_walk($testDataFound, function (&$params) { + public static function changeDataProvider():array { + $testDataFound = $testDataNotFound = self::versionProvider(); + array_walk($testDataFound, static function (&$params): void { $params[] = true; }); - array_walk($testDataNotFound, function (&$params) { + array_walk($testDataNotFound, static function (&$params): void { $params[] = false; }); return array_merge($testDataFound, $testDataNotFound); } - /** - * @dataProvider changeDataProvider - * - */ - public function testGetChangesForVersion(string $inputVersion, string $normalizedVersion, bool $isFound) { + #[\PHPUnit\Framework\Attributes\DataProvider('changeDataProvider')] + public function testGetChangesForVersion(string $inputVersion, string $normalizedVersion, bool $isFound): void { $mocker = $this->mapper->expects($this->once()) ->method('getChanges') ->with($normalizedVersion); @@ -385,7 +359,7 @@ class ChangesCheckTest extends TestCase { $this->assertTrue(isset($data['changelogURL'])); } - public function testGetChangesForVersionEmptyData() { + public function testGetChangesForVersionEmptyData(): void { $entry = $this->createMock(Changes::class); $entry->expects($this->once()) ->method('__call') diff --git a/tests/lib/Updater/ReleaseMetadataTest.php b/tests/lib/Updater/ReleaseMetadataTest.php new file mode 100644 index 00000000000..e93d9fe64be --- /dev/null +++ b/tests/lib/Updater/ReleaseMetadataTest.php @@ -0,0 +1,207 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ +namespace Test\Updater; + +use OC\Updater\ReleaseMetadata; +use OCP\Http\Client\IClient; +use OCP\Http\Client\IClientService; +use OCP\Http\Client\IResponse; +use PHPUnit\Framework\MockObject\MockObject; + +class ReleaseMetadataTest extends \Test\TestCase { + private IClientService|MockObject $clientService; + + protected function setUp(): void { + parent::setUp(); + $this->clientService = $this->createMock(IClientService::class); + } + + public function testDownloadMetadata(): void { + $client = $this->createMock(IClient::class); + $response = $this->createMock(IResponse::class); + $this->clientService->expects($this->once()) + ->method('newClient') + ->with() + ->willReturn($client); + $client->expects($this->once()) + ->method('get') + ->willReturn($response); + $response->expects($this->once()) + ->method('getBody') + ->with() + ->willReturn($this->resultRequest()); + + + $releaseMetadata = new ReleaseMetadata($this->clientService); + $this->assertSame(self::resultRequestArray(), $releaseMetadata->downloadMetadata('ouila')); + } + + /** + * + * @param string $version + * @param string $url + */ + #[\PHPUnit\Framework\Attributes\DataProvider('getMetadataUrlProvider')] + public function testGetMetadata(string $version, string $url): void { + $client = $this->createMock(IClient::class); + $response = $this->createMock(IResponse::class); + $this->clientService->expects($this->once()) + ->method('newClient') + ->with() + ->willReturn($client); + $client->expects($this->once()) + ->method('get') + ->with($url) + ->willReturn($response); + + $response->expects($this->once()) + ->method('getBody') + ->with() + ->willReturn('{}'); + + $releaseMetadata = new ReleaseMetadata($this->clientService); + $releaseMetadata->getMetadata($version); + } + + /** + * @return array + */ + public static function getMetadataUrlProvider(): array { + return [ + [ + '30.0.0', + 'https://download.nextcloud.com/server/releases/nextcloud-30.0.0.metadata' + ], + [ + '30.0.0-beta1', + 'https://download.nextcloud.com/server/prereleases/nextcloud-30.0.0-beta1.metadata' + ], + [ + '30', + 'https://download.nextcloud.com/server/releases/latest-30.metadata' + ] + ]; + } + + private static function resultRequest(): string { + return json_encode(self::resultRequestArray()); + } + + private static function resultRequestArray(): array { + return [ + 'migrations' => [ + 'core' => [], + 'apps' => [ + 'testing' => [ + '30000Date20240102030405' => [ + 'class' => 'OCP\\Migration\\Attributes\\DropTable', + 'table' => 'old_table', + 'description' => '', + 'notes' => [], + 'columns' => [] + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\CreateTable', + 'table' => 'new_table', + 'description' => 'Table is used to store things, but also to get more things', + 'notes' => [ + 'this is a notice', + 'and another one, if really needed' + ], + 'columns' => [] + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', + 'table' => 'my_table', + 'description' => '', + 'notes' => [], + 'name' => '', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', + 'table' => 'my_table', + 'description' => '', + 'notes' => [], + 'name' => 'another_field', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\AddColumn', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'name' => 'last_one', + 'type' => 'date' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\AddIndex', + 'table' => 'my_table', + 'description' => '', + 'notes' => [], + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\AddIndex', + 'table' => 'my_table', + 'description' => '', + 'notes' => [], + 'type' => 'primary' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\DropColumn', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'name' => '', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\DropColumn', + 'table' => 'other_table', + 'description' => 'field is not used anymore and replaced by \'last_one\'', + 'notes' => [], + 'name' => 'old_column', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\DropIndex', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'name' => '', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'name' => 'this_field', + 'type' => '' + ], + [ + 'class' => 'OCP\\Migration\\Attributes\\ModifyColumn', + 'table' => 'other_table', + 'description' => '', + 'notes' => [], + 'name' => 'this_field', + 'type' => 'bigint' + ] + ] + ] + ] + ]; + } +} diff --git a/tests/lib/Updater/VersionCheckTest.php b/tests/lib/Updater/VersionCheckTest.php index ed04975fc54..1936062a5d0 100644 --- a/tests/lib/Updater/VersionCheckTest.php +++ b/tests/lib/Updater/VersionCheckTest.php @@ -1,23 +1,9 @@ <?php + /** - * @author Lukas Reschke <lukas@owncloud.com> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @copyright Copyright (c) 2015, ownCloud, Inc. - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see <http://www.gnu.org/licenses/> - * + * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace Test\Updater; @@ -27,33 +13,33 @@ use OCP\Http\Client\IClientService; use OCP\IAppConfig; use OCP\IConfig; use OCP\IUserManager; +use OCP\Server; +use OCP\ServerVersion; use OCP\Support\Subscription\IRegistry; -use OCP\Util; use Psr\Log\LoggerInterface; class VersionCheckTest extends \Test\TestCase { + /** @var ServerVersion|\PHPUnit\Framework\MockObject\MockObject */ + private $serverVersion; /** @var IConfig| \PHPUnit\Framework\MockObject\MockObject */ private $config; /** @var IAppConfig| \PHPUnit\Framework\MockObject\MockObject */ private $appConfig; - /** @var VersionCheck | \PHPUnit\Framework\MockObject\MockObject*/ + /** @var VersionCheck | \PHPUnit\Framework\MockObject\MockObject */ private $updater; - /** @var IRegistry | \PHPUnit\Framework\Mo2ckObject\MockObject*/ + /** @var IRegistry | \PHPUnit\Framework\Mo2ckObject\MockObject */ private $registry; - /** @var LoggerInterface | \PHPUnit\Framework\Mo2ckObject\MockObject*/ + /** @var LoggerInterface | \PHPUnit\Framework\Mo2ckObject\MockObject */ private $logger; protected function setUp(): void { parent::setUp(); - $this->config = $this->getMockBuilder(IConfig::class) - ->disableOriginalConstructor() - ->getMock(); - $this->appConfig = $this->getMockBuilder(IAppConfig::class) - ->disableOriginalConstructor() - ->getMock(); - $clientService = $this->getMockBuilder(IClientService::class) - ->disableOriginalConstructor() - ->getMock(); + $this->serverVersion = $this->createMock(ServerVersion::class); + $this->config = $this->createMock(IConfig::class); + $this->appConfig = $this->createMock(IAppConfig::class); + $clientService = $this->createMock(IClientService::class); + + $this->serverVersion->method('getChannel')->willReturn('git'); $this->registry = $this->createMock(IRegistry::class); $this->registry @@ -61,8 +47,9 @@ class VersionCheckTest extends \Test\TestCase { ->willReturn(false); $this->logger = $this->createMock(LoggerInterface::class); $this->updater = $this->getMockBuilder(VersionCheck::class) - ->setMethods(['getUrlContent']) + ->onlyMethods(['getUrlContent']) ->setConstructorArgs([ + $this->serverVersion, $clientService, $this->config, $this->appConfig, @@ -78,10 +65,11 @@ class VersionCheckTest extends \Test\TestCase { * @return string */ private function buildUpdateUrl($baseUrl) { - return $baseUrl . '?version='.implode('x', Util::getVersion()).'xinstalledatx' . time() . 'x'.\OC_Util::getChannel().'xxx'.PHP_MAJOR_VERSION.'x'.PHP_MINOR_VERSION.'x'.PHP_RELEASE_VERSION.'x0x0'; + $serverVersion = Server::get(ServerVersion::class); + return $baseUrl . '?version=' . implode('x', $serverVersion->getVersion()) . 'xinstalledatx' . time() . 'x' . $serverVersion->getChannel() . 'xxx' . PHP_MAJOR_VERSION . 'x' . PHP_MINOR_VERSION . 'x' . PHP_RELEASE_VERSION . 'x0x0'; } - public function testCheckInCache() { + public function testCheckInCache(): void { $expectedResult = [ 'version' => '8.0.4.2', 'versionstring' => 'ownCloud 8.0.4', @@ -109,7 +97,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame($expectedResult, $this->updater->check()); } - public function testCheckWithoutUpdateUrl() { + public function testCheckWithoutUpdateUrl(): void { $expectedResult = [ 'version' => '8.0.4.2', 'versionstring' => 'ownCloud 8.0.4', @@ -170,7 +158,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame($expectedResult, $this->updater->check()); } - public function testCheckWithInvalidXml() { + public function testCheckWithInvalidXml(): void { $this->config ->expects($this->once()) ->method('getSystemValueBool') @@ -213,7 +201,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame([], $this->updater->check()); } - public function testCheckWithEmptyValidXmlResponse() { + public function testCheckWithEmptyValidXmlResponse(): void { $expectedResult = [ 'version' => '', 'versionstring' => '', @@ -273,7 +261,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame($expectedResult, $this->updater->check()); } - public function testCheckWithEmptyInvalidXmlResponse() { + public function testCheckWithEmptyInvalidXmlResponse(): void { $expectedResult = []; $this->config @@ -318,7 +306,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame($expectedResult, $this->updater->check()); } - public function testCheckWithMissingAttributeXmlResponse() { + public function testCheckWithMissingAttributeXmlResponse(): void { $expectedResult = [ 'version' => '', 'versionstring' => '', @@ -378,7 +366,7 @@ class VersionCheckTest extends \Test\TestCase { $this->assertSame($expectedResult, $this->updater->check()); } - public function testNoInternet() { + public function testNoInternet(): void { $this->config ->expects($this->once()) ->method('getSystemValueBool') |