diff options
Diffstat (limited to 'apps/files_versions/tests')
-rw-r--r-- | apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php | 38 | ||||
-rw-r--r-- | apps/files_versions/tests/Command/CleanupTest.php | 95 | ||||
-rw-r--r-- | apps/files_versions/tests/Command/ExpireTest.php | 27 | ||||
-rw-r--r-- | apps/files_versions/tests/Controller/PreviewControllerTest.php | 78 | ||||
-rw-r--r-- | apps/files_versions/tests/ExpirationTest.php | 53 | ||||
-rw-r--r-- | apps/files_versions/tests/StorageTest.php | 32 | ||||
-rw-r--r-- | apps/files_versions/tests/VersioningTest.php | 491 | ||||
-rw-r--r-- | apps/files_versions/tests/Versions/VersionManagerTest.php | 112 |
8 files changed, 414 insertions, 512 deletions
diff --git a/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php b/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php index 1d5812767ca..21e88e86f90 100644 --- a/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php +++ b/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php @@ -1,24 +1,9 @@ <?php + +declare(strict_types=1); /** - * @copyright 2021 Daniel Kesselberg <mail@danielkesselberg.de> - * - * @author Daniel Kesselberg <mail@danielkesselberg.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: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\Files_Versions\Tests\BackgroundJob; @@ -33,17 +18,10 @@ use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class ExpireVersionsTest extends TestCase { - /** @var IConfig|MockObject */ - private $config; - - /** @var IUserManager|MockObject */ - private $userManager; - - /** @var Expiration|MockObject */ - private $expiration; - - /** @var IJobList|MockObject */ - private $jobList; + private IConfig&MockObject $config; + private IUserManager&MockObject $userManager; + private Expiration&MockObject $expiration; + private IJobList&MockObject $jobList; protected function setUp(): void { parent::setUp(); diff --git a/apps/files_versions/tests/Command/CleanupTest.php b/apps/files_versions/tests/Command/CleanupTest.php index 085b25822f3..dd6665f5aef 100644 --- a/apps/files_versions/tests/Command/CleanupTest.php +++ b/apps/files_versions/tests/Command/CleanupTest.php @@ -1,36 +1,22 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Björn Schießle <bjoern@schiessle.org> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @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: 2017-2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\Files_Versions\Tests\Command; use OC\User\Manager; use OCA\Files_Versions\Command\CleanUp; +use OCA\Files_Versions\Db\VersionsMapper; use OCP\Files\Cache\ICache; use OCP\Files\Folder; use OCP\Files\IRootFolder; use OCP\Files\Storage\IStorage; +use OCP\UserInterface; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; /** @@ -41,37 +27,26 @@ use Test\TestCase; * @package OCA\Files_Versions\Tests\Command */ class CleanupTest extends TestCase { - - /** @var CleanUp */ - protected $cleanup; - - /** @var \PHPUnit\Framework\MockObject\MockObject | Manager */ - protected $userManager; - - /** @var \PHPUnit\Framework\MockObject\MockObject | IRootFolder */ - protected $rootFolder; - - /** @var \PHPUnit\Framework\MockObject\MockObject | VersionsMapper */ - protected $versionMapper; + protected Manager&MockObject $userManager; + protected IRootFolder&MockObject $rootFolder; + protected VersionsMapper&MockObject $versionMapper; + protected CleanUp $cleanup; protected function setUp(): void { parent::setUp(); - $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder') - ->disableOriginalConstructor()->getMock(); - $this->userManager = $this->getMockBuilder('OC\User\Manager') - ->disableOriginalConstructor()->getMock(); - $this->versionMapper = $this->getMockBuilder('OCA\Files_Versions\Db\VersionsMapper') - ->disableOriginalConstructor()->getMock(); + $this->rootFolder = $this->createMock(IRootFolder::class); + $this->userManager = $this->createMock(Manager::class); + $this->versionMapper = $this->createMock(VersionsMapper::class); $this->cleanup = new CleanUp($this->rootFolder, $this->userManager, $this->versionMapper); } /** - * @dataProvider dataTestDeleteVersions * @param boolean $nodeExists */ - public function testDeleteVersions($nodeExists) { + #[\PHPUnit\Framework\Attributes\DataProvider('dataTestDeleteVersions')] + public function testDeleteVersions(bool $nodeExists): void { $this->rootFolder->expects($this->once()) ->method('nodeExists') ->with('/testUser/files_versions') @@ -110,7 +85,7 @@ class CleanupTest extends TestCase { $this->invokePrivate($this->cleanup, 'deleteVersions', ['testUser']); } - public function dataTestDeleteVersions() { + public static function dataTestDeleteVersions(): array { return [ [true], [false] @@ -121,30 +96,28 @@ class CleanupTest extends TestCase { /** * test delete versions from users given as parameter */ - public function testExecuteDeleteListOfUsers() { + public function testExecuteDeleteListOfUsers(): void { $userIds = ['user1', 'user2', 'user3']; - $instance = $this->getMockBuilder('OCA\Files_Versions\Command\CleanUp') - ->setMethods(['deleteVersions']) + $instance = $this->getMockBuilder(CleanUp::class) + ->onlyMethods(['deleteVersions']) ->setConstructorArgs([$this->rootFolder, $this->userManager, $this->versionMapper]) ->getMock(); $instance->expects($this->exactly(count($userIds))) ->method('deleteVersions') - ->willReturnCallback(function ($user) use ($userIds) { + ->willReturnCallback(function ($user) use ($userIds): void { $this->assertTrue(in_array($user, $userIds)); }); $this->userManager->expects($this->exactly(count($userIds))) ->method('userExists')->willReturn(true); - $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface') - ->disableOriginalConstructor()->getMock(); + $inputInterface = $this->createMock(\Symfony\Component\Console\Input\InputInterface::class); $inputInterface->expects($this->once())->method('getArgument') ->with('user_id') ->willReturn($userIds); - $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface') - ->disableOriginalConstructor()->getMock(); + $outputInterface = $this->createMock(\Symfony\Component\Console\Output\OutputInterface::class); $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]); } @@ -152,16 +125,16 @@ class CleanupTest extends TestCase { /** * test delete versions of all users */ - public function testExecuteAllUsers() { + public function testExecuteAllUsers(): void { $userIds = []; $backendUsers = ['user1', 'user2']; - $instance = $this->getMockBuilder('OCA\Files_Versions\Command\CleanUp') - ->setMethods(['deleteVersions']) + $instance = $this->getMockBuilder(CleanUp::class) + ->onlyMethods(['deleteVersions']) ->setConstructorArgs([$this->rootFolder, $this->userManager, $this->versionMapper]) ->getMock(); - $backend = $this->getMockBuilder(\OCP\UserInterface::class) + $backend = $this->getMockBuilder(UserInterface::class) ->disableOriginalConstructor()->getMock(); $backend->expects($this->once())->method('getUsers') ->with('', 500, 0) @@ -169,22 +142,20 @@ class CleanupTest extends TestCase { $instance->expects($this->exactly(count($backendUsers))) ->method('deleteVersions') - ->willReturnCallback(function ($user) use ($backendUsers) { + ->willReturnCallback(function ($user) use ($backendUsers): void { $this->assertTrue(in_array($user, $backendUsers)); }); - $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface') - ->disableOriginalConstructor()->getMock(); + $inputInterface = $this->createMock(\Symfony\Component\Console\Input\InputInterface::class); $inputInterface->expects($this->once())->method('getArgument') ->with('user_id') ->willReturn($userIds); - $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface') - ->disableOriginalConstructor()->getMock(); + $outputInterface = $this->createMock(\Symfony\Component\Console\Output\OutputInterface::class); $this->userManager->expects($this->once()) - ->method('getBackends') - ->willReturn([$backend]); + ->method('getBackends') + ->willReturn([$backend]); $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]); } diff --git a/apps/files_versions/tests/Command/ExpireTest.php b/apps/files_versions/tests/Command/ExpireTest.php index 9b0b68e71ea..b74457a7fd6 100644 --- a/apps/files_versions/tests/Command/ExpireTest.php +++ b/apps/files_versions/tests/Command/ExpireTest.php @@ -1,25 +1,10 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * - * @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: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\Files_Versions\Tests\Command; @@ -34,7 +19,7 @@ use Test\TestCase; * @package OCA\Files_Versions\Tests\Command */ class ExpireTest extends TestCase { - public function testExpireNonExistingUser() { + public function testExpireNonExistingUser(): void { $command = new Expire($this->getUniqueID('test'), ''); $command->handle(); diff --git a/apps/files_versions/tests/Controller/PreviewControllerTest.php b/apps/files_versions/tests/Controller/PreviewControllerTest.php index 0457d0d5f24..542ea2b6b34 100644 --- a/apps/files_versions/tests/Controller/PreviewControllerTest.php +++ b/apps/files_versions/tests/Controller/PreviewControllerTest.php @@ -1,37 +1,19 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl> - * - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * - * @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: 2016 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ + namespace OCA\Files_Versions\Tests\Controller; use OCA\Files_Versions\Controller\PreviewController; use OCA\Files_Versions\Versions\IVersionManager; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; -use OCP\AppFramework\Http\FileDisplayResponse; use OCP\Files\File; use OCP\Files\Folder; -use OCP\Files\IMimeTypeDetector; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; @@ -39,30 +21,19 @@ use OCP\IPreview; use OCP\IRequest; use OCP\IUser; use OCP\IUserSession; +use OCP\Preview\IMimeIconProvider; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class PreviewControllerTest extends TestCase { + private IRootFolder&MockObject $rootFolder; + private string $userId; + private IPreview&MockObject $previewManager; + private IUserSession&MockObject $userSession; + private IVersionManager&MockObject $versionManager; - /** @var IRootFolder|\PHPUnit\Framework\MockObject\MockObject */ - private $rootFolder; - - /** @var string */ - private $userId; - - /** @var IMimeTypeDetector|\PHPUnit\Framework\MockObject\MockObject */ - private $mimeTypeDetector; - - /** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */ - private $previewManager; - - /** @var PreviewController|\PHPUnit\Framework\MockObject\MockObject */ - private $controller; - - /** @var IUserSession|\PHPUnit\Framework\MockObject\MockObject */ - private $userSession; - - /** @var IVersionManager|\PHPUnit\Framework\MockObject\MockObject */ - private $versionManager; + private IMimeIconProvider&MockObject $mimeIconProvider; + private PreviewController $controller; protected function setUp(): void { parent::setUp(); @@ -79,6 +50,7 @@ class PreviewControllerTest extends TestCase { ->method('getUser') ->willReturn($user); $this->versionManager = $this->createMock(IVersionManager::class); + $this->mimeIconProvider = $this->createMock(IMimeIconProvider::class); $this->controller = new PreviewController( 'files_versions', @@ -86,39 +58,40 @@ class PreviewControllerTest extends TestCase { $this->rootFolder, $this->userSession, $this->versionManager, - $this->previewManager + $this->previewManager, + $this->mimeIconProvider, ); } - public function testInvalidFile() { + public function testInvalidFile(): void { $res = $this->controller->getPreview(''); $expected = new DataResponse([], Http::STATUS_BAD_REQUEST); $this->assertEquals($expected, $res); } - public function testInvalidWidth() { + public function testInvalidWidth(): void { $res = $this->controller->getPreview('file', 0); $expected = new DataResponse([], Http::STATUS_BAD_REQUEST); $this->assertEquals($expected, $res); } - public function testInvalidHeight() { + public function testInvalidHeight(): void { $res = $this->controller->getPreview('file', 10, 0); $expected = new DataResponse([], Http::STATUS_BAD_REQUEST); $this->assertEquals($expected, $res); } - public function testInvalidVersion() { + public function testInvalidVersion(): void { $res = $this->controller->getPreview('file', 10, 0); $expected = new DataResponse([], Http::STATUS_BAD_REQUEST); $this->assertEquals($expected, $res); } - public function testValidPreview() { + public function testValidPreview(): void { $userFolder = $this->createMock(Folder::class); $userRoot = $this->createMock(Folder::class); @@ -150,12 +123,13 @@ class PreviewControllerTest extends TestCase { ->willReturn('previewMime'); $res = $this->controller->getPreview('file', 10, 10, '42'); - $expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'previewMime']); - $this->assertEquals($expected, $res); + $this->assertEquals('previewMime', $res->getHeaders()['Content-Type']); + $this->assertEquals(Http::STATUS_OK, $res->getStatus()); + $this->assertEquals($preview, $this->invokePrivate($res, 'file')); } - public function testVersionNotFound() { + public function testVersionNotFound(): void { $userFolder = $this->createMock(Folder::class); $userRoot = $this->createMock(Folder::class); diff --git a/apps/files_versions/tests/ExpirationTest.php b/apps/files_versions/tests/ExpirationTest.php index 228d1d6830c..8cf412c3fe0 100644 --- a/apps/files_versions/tests/ExpirationTest.php +++ b/apps/files_versions/tests/ExpirationTest.php @@ -1,27 +1,10 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Joas Schilling <coding@schilljs.com> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Victor Dubiniuk <dubiniuk@owncloud.com> - * - * @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: 2017 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\Files_Versions\Tests; @@ -34,7 +17,7 @@ use Psr\Log\LoggerInterface; class ExpirationTest extends \Test\TestCase { public const SECONDS_PER_DAY = 86400; //60*60*24 - public function expirationData() { + public static function expirationData(): array { $today = 100 * self::SECONDS_PER_DAY; $back10Days = (100 - 10) * self::SECONDS_PER_DAY; $back20Days = (100 - 20) * self::SECONDS_PER_DAY; @@ -98,16 +81,8 @@ class ExpirationTest extends \Test\TestCase { ]; } - /** - * @dataProvider expirationData - * - * @param string $retentionObligation - * @param int $timeNow - * @param int $timestamp - * @param bool $quotaExceeded - * @param string $expectedResult - */ - public function testExpiration($retentionObligation, $timeNow, $timestamp, $quotaExceeded, $expectedResult) { + #[\PHPUnit\Framework\Attributes\DataProvider('expirationData')] + public function testExpiration(string $retentionObligation, int $timeNow, int $timestamp, bool $quotaExceeded, bool $expectedResult): void { $mockedConfig = $this->getMockedConfig($retentionObligation); $mockedTimeFactory = $this->getMockedTimeFactory($timeNow); $mockedLogger = $this->createMock(LoggerInterface::class); @@ -119,11 +94,7 @@ class ExpirationTest extends \Test\TestCase { } - /** - * @param int $time - * @return ITimeFactory|MockObject - */ - private function getMockedTimeFactory($time) { + private function getMockedTimeFactory(int $time): ITimeFactory&MockObject { $mockedTimeFactory = $this->createMock(ITimeFactory::class); $mockedTimeFactory->expects($this->any()) ->method('getTime') @@ -132,11 +103,7 @@ class ExpirationTest extends \Test\TestCase { return $mockedTimeFactory; } - /** - * @param string $returnValue - * @return IConfig|MockObject - */ - private function getMockedConfig($returnValue) { + private function getMockedConfig(string $returnValue): IConfig&MockObject { $mockedConfig = $this->createMock(IConfig::class); $mockedConfig->expects($this->any()) ->method('getSystemValue') diff --git a/apps/files_versions/tests/StorageTest.php b/apps/files_versions/tests/StorageTest.php index ba9bcf0705a..443cff3ee06 100644 --- a/apps/files_versions/tests/StorageTest.php +++ b/apps/files_versions/tests/StorageTest.php @@ -2,23 +2,8 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2021 Robin Appelman <robin@icewind.nl> - * - * @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: 2021 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ namespace OCA\files_versions\tests; @@ -27,6 +12,7 @@ use OCA\Files_Versions\Expiration; use OCA\Files_Versions\Storage; use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; +use OCP\Server; use Test\TestCase; use Test\Traits\UserTrait; @@ -38,7 +24,7 @@ class StorageTest extends TestCase { private $versionsRoot; private $userFolder; - private $expireTimestamp = 10; + private int $expireTimestamp = 10; protected function setUp(): void { parent::setUp(); @@ -55,22 +41,22 @@ class StorageTest extends TestCase { $this->createUser('version_test', ''); $this->loginAsUser('version_test'); /** @var IRootFolder $root */ - $root = \OC::$server->get(IRootFolder::class); + $root = Server::get(IRootFolder::class); $this->userFolder = $root->getUserFolder('version_test'); } - protected function createPastFile(string $path, int $mtime) { + protected function createPastFile(string $path, int $mtime): void { try { $file = $this->userFolder->get($path); + $file->putContent((string)$mtime); } catch (NotFoundException $e) { - $file = $this->userFolder->newFile($path); + $file = $this->userFolder->newFile($path, (string)$mtime); } - $file->putContent((string)$mtime); $file->touch($mtime); } - public function testExpireMaxAge() { + public function testExpireMaxAge(): void { $this->userFolder->newFolder('folder1'); $this->userFolder->newFolder('folder1/sub1'); $this->userFolder->newFolder('folder2'); diff --git a/apps/files_versions/tests/VersioningTest.php b/apps/files_versions/tests/VersioningTest.php index f454ba30b86..c9f7d27d7ab 100644 --- a/apps/files_versions/tests/VersioningTest.php +++ b/apps/files_versions/tests/VersioningTest.php @@ -1,47 +1,35 @@ <?php + +declare(strict_types=1); /** - * @copyright Copyright (c) 2016, ownCloud, Inc. - * - * @author Arthur Schiwon <blizzz@arthur-schiwon.de> - * @author Björn Schießle <bjoern@schiessle.org> - * @author Christoph Wurst <christoph@winzerhof-wurst.at> - * @author Georg Ehrke <oc.list@georgehrke.com> - * @author Joas Schilling <coding@schilljs.com> - * @author Jörn Friedrich Dreyer <jfd@butonic.de> - * @author Liam JACK <liamjack@users.noreply.github.com> - * @author Lukas Reschke <lukas@statuscode.ch> - * @author Morris Jobke <hey@morrisjobke.de> - * @author Robin Appelman <robin@icewind.nl> - * @author Roeland Jago Douma <roeland@famdouma.nl> - * @author Stefan Weil <sw@weilnetz.de> - * @author Thomas Müller <thomas.mueller@tmit.eu> - * @author Vincent Petry <vincent@nextcloud.com> - * - * @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 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2016 ownCloud, Inc. + * SPDX-License-Identifier: AGPL-3.0-only */ namespace OCA\Files_Versions\Tests; +use OC\AllConfig; +use OC\Files\Cache\Watcher; +use OC\Files\Filesystem; use OC\Files\Storage\Temporary; +use OC\Files\View; +use OC\SystemConfig; +use OC\User\NoUserException; +use OCA\Files_Sharing\AppInfo\Application; use OCA\Files_Versions\Db\VersionEntity; use OCA\Files_Versions\Db\VersionsMapper; +use OCA\Files_Versions\Events\VersionRestoredEvent; +use OCA\Files_Versions\Storage; use OCA\Files_Versions\Versions\IVersionManager; +use OCP\Constants; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\IMimeTypeLoader; use OCP\IConfig; use OCP\IUser; +use OCP\IUserManager; +use OCP\Server; use OCP\Share\IShare; +use OCP\Util; /** * Class Test_Files_versions @@ -55,7 +43,7 @@ class VersioningTest extends \Test\TestCase { public const USERS_VERSIONS_ROOT = '/test-versions-user/files_versions'; /** - * @var \OC\Files\View + * @var View */ private $rootView; /** @@ -72,7 +60,7 @@ class VersioningTest extends \Test\TestCase { public static function setUpBeforeClass(): void { parent::setUpBeforeClass(); - $application = new \OCA\Files_Sharing\AppInfo\Application(); + $application = new Application(); // create test user self::loginHelper(self::TEST_VERSIONS_USER2, true); @@ -81,11 +69,11 @@ class VersioningTest extends \Test\TestCase { public static function tearDownAfterClass(): void { // cleanup test user - $user = \OC::$server->getUserManager()->get(self::TEST_VERSIONS_USER); + $user = Server::get(IUserManager::class)->get(self::TEST_VERSIONS_USER); if ($user !== null) { $user->delete(); } - $user = \OC::$server->getUserManager()->get(self::TEST_VERSIONS_USER2); + $user = Server::get(IUserManager::class)->get(self::TEST_VERSIONS_USER2); if ($user !== null) { $user->delete(); } @@ -96,32 +84,35 @@ class VersioningTest extends \Test\TestCase { protected function setUp(): void { parent::setUp(); - $config = \OC::$server->getConfig(); - $mockConfig = $this->createMock(IConfig::class); + $config = Server::get(IConfig::class); + $mockConfig = $this->getMockBuilder(AllConfig::class) + ->onlyMethods(['getSystemValue']) + ->setConstructorArgs([Server::get(SystemConfig::class)]) + ->getMock(); $mockConfig->expects($this->any()) ->method('getSystemValue') ->willReturnCallback(function ($key, $default) use ($config) { if ($key === 'filesystem_check_changes') { - return \OC\Files\Cache\Watcher::CHECK_ONCE; + return Watcher::CHECK_ONCE; } else { return $config->getSystemValue($key, $default); } }); - $this->overwriteService(\OC\AllConfig::class, $mockConfig); + $this->overwriteService(AllConfig::class, $mockConfig); // clear hooks \OC_Hook::clear(); - \OC::registerShareHooks(\OC::$server->getSystemConfig()); + \OC::registerShareHooks(Server::get(SystemConfig::class)); \OC::$server->boot(); self::loginHelper(self::TEST_VERSIONS_USER); - $this->rootView = new \OC\Files\View(); + $this->rootView = new View(); if (!$this->rootView->file_exists(self::USERS_VERSIONS_ROOT)) { $this->rootView->mkdir(self::USERS_VERSIONS_ROOT); } - $this->versionsMapper = \OCP\Server::get(VersionsMapper::class); - $this->mimeTypeLoader = \OCP\Server::get(IMimeTypeLoader::class); + $this->versionsMapper = Server::get(VersionsMapper::class); + $this->mimeTypeLoader = Server::get(IMimeTypeLoader::class); $this->user1 = $this->createMock(IUser::class); $this->user1->method('getUID') @@ -132,7 +123,7 @@ class VersioningTest extends \Test\TestCase { } protected function tearDown(): void { - $this->restoreService(\OC\AllConfig::class); + $this->restoreService(AllConfig::class); if ($this->rootView) { $this->rootView->deleteAll(self::TEST_VERSIONS_USER . '/files/'); @@ -149,9 +140,9 @@ class VersioningTest extends \Test\TestCase { /** * @medium * test expire logic - * @dataProvider versionsProvider */ - public function testGetExpireList($versions, $sizeOfAllDeletedFiles) { + #[\PHPUnit\Framework\Attributes\DataProvider('versionsProvider')] + public function testGetExpireList($versions, $sizeOfAllDeletedFiles): void { // last interval end at 2592000 $startTime = 5000000; @@ -165,61 +156,61 @@ class VersioningTest extends \Test\TestCase { // the deleted array should only contain versions which should be deleted foreach ($deleted as $key => $path) { unset($versions[$key]); - $this->assertEquals("delete", substr($path, 0, strlen("delete"))); + $this->assertEquals('delete', substr($path, 0, strlen('delete'))); } // the versions array should only contain versions which should be kept foreach ($versions as $version) { - $this->assertEquals("keep", $version['path']); + $this->assertEquals('keep', $version['path']); } } - public function versionsProvider() { + public static function versionsProvider(): array { return [ // first set of versions uniformly distributed versions [ [ // first slice (10sec) keep one version every 2 seconds - ["version" => 4999999, "path" => "keep", "size" => 1], - ["version" => 4999998, "path" => "delete", "size" => 1], - ["version" => 4999997, "path" => "keep", "size" => 1], - ["version" => 4999995, "path" => "keep", "size" => 1], - ["version" => 4999994, "path" => "delete", "size" => 1], + ['version' => 4999999, 'path' => 'keep', 'size' => 1], + ['version' => 4999998, 'path' => 'delete', 'size' => 1], + ['version' => 4999997, 'path' => 'keep', 'size' => 1], + ['version' => 4999995, 'path' => 'keep', 'size' => 1], + ['version' => 4999994, 'path' => 'delete', 'size' => 1], //next slice (60sec) starts at 4999990 keep one version every 10 secons - ["version" => 4999988, "path" => "keep", "size" => 1], - ["version" => 4999978, "path" => "keep", "size" => 1], - ["version" => 4999975, "path" => "delete", "size" => 1], - ["version" => 4999972, "path" => "delete", "size" => 1], - ["version" => 4999967, "path" => "keep", "size" => 1], - ["version" => 4999958, "path" => "delete", "size" => 1], - ["version" => 4999957, "path" => "keep", "size" => 1], + ['version' => 4999988, 'path' => 'keep', 'size' => 1], + ['version' => 4999978, 'path' => 'keep', 'size' => 1], + ['version' => 4999975, 'path' => 'delete', 'size' => 1], + ['version' => 4999972, 'path' => 'delete', 'size' => 1], + ['version' => 4999967, 'path' => 'keep', 'size' => 1], + ['version' => 4999958, 'path' => 'delete', 'size' => 1], + ['version' => 4999957, 'path' => 'keep', 'size' => 1], //next slice (3600sec) start at 4999940 keep one version every 60 seconds - ["version" => 4999900, "path" => "keep", "size" => 1], - ["version" => 4999841, "path" => "delete", "size" => 1], - ["version" => 4999840, "path" => "keep", "size" => 1], - ["version" => 4999780, "path" => "keep", "size" => 1], - ["version" => 4996401, "path" => "keep", "size" => 1], + ['version' => 4999900, 'path' => 'keep', 'size' => 1], + ['version' => 4999841, 'path' => 'delete', 'size' => 1], + ['version' => 4999840, 'path' => 'keep', 'size' => 1], + ['version' => 4999780, 'path' => 'keep', 'size' => 1], + ['version' => 4996401, 'path' => 'keep', 'size' => 1], // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - ["version" => 4996350, "path" => "delete", "size" => 1], - ["version" => 4992800, "path" => "keep", "size" => 1], - ["version" => 4989800, "path" => "delete", "size" => 1], - ["version" => 4989700, "path" => "delete", "size" => 1], - ["version" => 4989200, "path" => "keep", "size" => 1], + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4992800, 'path' => 'keep', 'size' => 1], + ['version' => 4989800, 'path' => 'delete', 'size' => 1], + ['version' => 4989700, 'path' => 'delete', 'size' => 1], + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - ["version" => 4913600, "path" => "keep", "size" => 1], - ["version" => 4852800, "path" => "delete", "size" => 1], - ["version" => 4827201, "path" => "delete", "size" => 1], - ["version" => 4827200, "path" => "keep", "size" => 1], - ["version" => 4777201, "path" => "delete", "size" => 1], - ["version" => 4777501, "path" => "delete", "size" => 1], - ["version" => 4740000, "path" => "keep", "size" => 1], + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - ["version" => 2408000, "path" => "keep", "size" => 1], - ["version" => 1803201, "path" => "delete", "size" => 1], - ["version" => 1803200, "path" => "keep", "size" => 1], - ["version" => 1800199, "path" => "delete", "size" => 1], - ["version" => 1800100, "path" => "delete", "size" => 1], - ["version" => 1198300, "path" => "keep", "size" => 1], + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], ], 16 // size of all deleted files (every file has the size 1) ], @@ -230,28 +221,28 @@ class VersioningTest extends \Test\TestCase { // next slice (60sec) starts at 4999990 keep one version every 10 secons // next slice (3600sec) start at 4999940 keep one version every 60 seconds // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - ["version" => 4996400, "path" => "keep", "size" => 1], - ["version" => 4996350, "path" => "delete", "size" => 1], - ["version" => 4996350, "path" => "delete", "size" => 1], - ["version" => 4992800, "path" => "keep", "size" => 1], - ["version" => 4989800, "path" => "delete", "size" => 1], - ["version" => 4989700, "path" => "delete", "size" => 1], - ["version" => 4989200, "path" => "keep", "size" => 1], + ['version' => 4996400, 'path' => 'keep', 'size' => 1], + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4996350, 'path' => 'delete', 'size' => 1], + ['version' => 4992800, 'path' => 'keep', 'size' => 1], + ['version' => 4989800, 'path' => 'delete', 'size' => 1], + ['version' => 4989700, 'path' => 'delete', 'size' => 1], + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - ["version" => 4913600, "path" => "keep", "size" => 1], - ["version" => 4852800, "path" => "delete", "size" => 1], - ["version" => 4827201, "path" => "delete", "size" => 1], - ["version" => 4827200, "path" => "keep", "size" => 1], - ["version" => 4777201, "path" => "delete", "size" => 1], - ["version" => 4777501, "path" => "delete", "size" => 1], - ["version" => 4740000, "path" => "keep", "size" => 1], + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - ["version" => 2408000, "path" => "keep", "size" => 1], - ["version" => 1803201, "path" => "delete", "size" => 1], - ["version" => 1803200, "path" => "keep", "size" => 1], - ["version" => 1800199, "path" => "delete", "size" => 1], - ["version" => 1800100, "path" => "delete", "size" => 1], - ["version" => 1198300, "path" => "keep", "size" => 1], + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], ], 11 // size of all deleted files (every file has the size 1) ], @@ -259,32 +250,32 @@ class VersioningTest extends \Test\TestCase { [ [ // first slice (10sec) keep one version every 2 seconds - ["version" => 4999999, "path" => "keep", "size" => 1], - ["version" => 4999998, "path" => "delete", "size" => 1], - ["version" => 4999997, "path" => "keep", "size" => 1], - ["version" => 4999995, "path" => "keep", "size" => 1], - ["version" => 4999994, "path" => "delete", "size" => 1], + ['version' => 4999999, 'path' => 'keep', 'size' => 1], + ['version' => 4999998, 'path' => 'delete', 'size' => 1], + ['version' => 4999997, 'path' => 'keep', 'size' => 1], + ['version' => 4999995, 'path' => 'keep', 'size' => 1], + ['version' => 4999994, 'path' => 'delete', 'size' => 1], //next slice (60sec) starts at 4999990 keep one version every 10 secons - ["version" => 4999988, "path" => "keep", "size" => 1], - ["version" => 4999978, "path" => "keep", "size" => 1], + ['version' => 4999988, 'path' => 'keep', 'size' => 1], + ['version' => 4999978, 'path' => 'keep', 'size' => 1], //next slice (3600sec) start at 4999940 keep one version every 60 seconds // next slice (86400sec) start at 4996400 keep one version every 3600 seconds - ["version" => 4989200, "path" => "keep", "size" => 1], + ['version' => 4989200, 'path' => 'keep', 'size' => 1], // next slice (2592000sec) start at 4913600 keep one version every 86400 seconds - ["version" => 4913600, "path" => "keep", "size" => 1], - ["version" => 4852800, "path" => "delete", "size" => 1], - ["version" => 4827201, "path" => "delete", "size" => 1], - ["version" => 4827200, "path" => "keep", "size" => 1], - ["version" => 4777201, "path" => "delete", "size" => 1], - ["version" => 4777501, "path" => "delete", "size" => 1], - ["version" => 4740000, "path" => "keep", "size" => 1], + ['version' => 4913600, 'path' => 'keep', 'size' => 1], + ['version' => 4852800, 'path' => 'delete', 'size' => 1], + ['version' => 4827201, 'path' => 'delete', 'size' => 1], + ['version' => 4827200, 'path' => 'keep', 'size' => 1], + ['version' => 4777201, 'path' => 'delete', 'size' => 1], + ['version' => 4777501, 'path' => 'delete', 'size' => 1], + ['version' => 4740000, 'path' => 'keep', 'size' => 1], // final slice starts at 2408000 keep one version every 604800 secons - ["version" => 2408000, "path" => "keep", "size" => 1], - ["version" => 1803201, "path" => "delete", "size" => 1], - ["version" => 1803200, "path" => "keep", "size" => 1], - ["version" => 1800199, "path" => "delete", "size" => 1], - ["version" => 1800100, "path" => "delete", "size" => 1], - ["version" => 1198300, "path" => "keep", "size" => 1], + ['version' => 2408000, 'path' => 'keep', 'size' => 1], + ['version' => 1803201, 'path' => 'delete', 'size' => 1], + ['version' => 1803200, 'path' => 'keep', 'size' => 1], + ['version' => 1800199, 'path' => 'delete', 'size' => 1], + ['version' => 1800100, 'path' => 'delete', 'size' => 1], + ['version' => 1198300, 'path' => 'keep', 'size' => 1], ], 9 // size of all deleted files (every file has the size 1) ], @@ -297,8 +288,8 @@ class VersioningTest extends \Test\TestCase { ]; } - public function testRename() { - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testRename(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -315,7 +306,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute rename hook of versions app - \OC\Files\Filesystem::rename("test.txt", "test2.txt"); + Filesystem::rename('test.txt', 'test2.txt'); $this->runCommands(); @@ -326,10 +317,10 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v2Renamed), 'version 2 of renamed file exists'); } - public function testRenameInSharedFolder() { - \OC\Files\Filesystem::mkdir('folder1'); - \OC\Files\Filesystem::mkdir('folder1/folder2'); - \OC\Files\Filesystem::file_put_contents("folder1/test.txt", "test file"); + public function testRenameInSharedFolder(): void { + Filesystem::mkdir('folder1'); + Filesystem::mkdir('folder1/folder2'); + Filesystem::file_put_contents('folder1/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -347,21 +338,21 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); - $this->assertTrue(\OC\Files\Filesystem::file_exists('folder1/test.txt')); + $this->assertTrue(Filesystem::file_exists('folder1/test.txt')); // execute rename hook of versions app - \OC\Files\Filesystem::rename('/folder1/test.txt', '/folder1/folder2/test.txt'); + Filesystem::rename('/folder1/test.txt', '/folder1/folder2/test.txt'); $this->runCommands(); @@ -373,13 +364,13 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed), 'version 1 of renamed file exists'); $this->assertTrue($this->rootView->file_exists($v2Renamed), 'version 2 of renamed file exists'); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testMoveFolder() { - \OC\Files\Filesystem::mkdir('folder1'); - \OC\Files\Filesystem::mkdir('folder2'); - \OC\Files\Filesystem::file_put_contents('folder1/test.txt', 'test file'); + public function testMoveFolder(): void { + Filesystem::mkdir('folder1'); + Filesystem::mkdir('folder2'); + Filesystem::file_put_contents('folder1/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -397,7 +388,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute rename hook of versions app - \OC\Files\Filesystem::rename('folder1', 'folder2/folder1'); + Filesystem::rename('folder1', 'folder2/folder1'); $this->runCommands(); @@ -409,23 +400,23 @@ class VersioningTest extends \Test\TestCase { } - public function testMoveFileIntoSharedFolderAsRecipient() { - \OC\Files\Filesystem::mkdir('folder1'); - $fileInfo = \OC\Files\Filesystem::getFileInfo('folder1'); + public function testMoveFileIntoSharedFolderAsRecipient(): void { + Filesystem::mkdir('folder1'); + $fileInfo = Filesystem::getFileInfo('folder1'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); $versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions'; - \OC\Files\Filesystem::file_put_contents('test.txt', 'test file'); + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -441,8 +432,9 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // move file into the shared folder as recipient - \OC\Files\Filesystem::rename('/test.txt', '/folder1/test.txt'); + $success = Filesystem::rename('/test.txt', '/folder1/test.txt'); + $this->assertTrue($success); $this->assertFalse($this->rootView->file_exists($v1)); $this->assertFalse($this->rootView->file_exists($v2)); @@ -456,26 +448,26 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed)); $this->assertTrue($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testMoveFolderIntoSharedFolderAsRecipient() { - \OC\Files\Filesystem::mkdir('folder1'); + public function testMoveFolderIntoSharedFolderAsRecipient(): void { + Filesystem::mkdir('folder1'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder1'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); $versionsFolder2 = '/' . self::TEST_VERSIONS_USER2 . '/files_versions'; - \OC\Files\Filesystem::mkdir('folder2'); - \OC\Files\Filesystem::file_put_contents('folder2/test.txt', 'test file'); + Filesystem::mkdir('folder2'); + Filesystem::file_put_contents('folder2/test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -492,7 +484,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // move file into the shared folder as recipient - \OC\Files\Filesystem::rename('/folder2', '/folder1/folder2'); + Filesystem::rename('/folder2', '/folder1/folder2'); $this->assertFalse($this->rootView->file_exists($v1)); $this->assertFalse($this->rootView->file_exists($v2)); @@ -507,11 +499,11 @@ class VersioningTest extends \Test\TestCase { $this->assertTrue($this->rootView->file_exists($v1Renamed)); $this->assertTrue($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testRenameSharedFile() { - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testRenameSharedFile(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -530,21 +522,21 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('test.txt'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_READ | Constants::PERMISSION_UPDATE | Constants::PERMISSION_SHARE); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); self::loginHelper(self::TEST_VERSIONS_USER2); - $this->assertTrue(\OC\Files\Filesystem::file_exists('test.txt')); + $this->assertTrue(Filesystem::file_exists('test.txt')); // execute rename hook of versions app - \OC\Files\Filesystem::rename('test.txt', 'test2.txt'); + Filesystem::rename('test.txt', 'test2.txt'); self::loginHelper(self::TEST_VERSIONS_USER); @@ -556,11 +548,11 @@ class VersioningTest extends \Test\TestCase { $this->assertFalse($this->rootView->file_exists($v1Renamed)); $this->assertFalse($this->rootView->file_exists($v2Renamed)); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } - public function testCopy() { - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + public function testCopy(): void { + Filesystem::file_put_contents('test.txt', 'test file'); $t1 = time(); // second version is two weeks older, this way we make sure that no @@ -577,7 +569,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute copy hook of versions app - \OC\Files\Filesystem::copy("test.txt", "test2.txt"); + Filesystem::copy('test.txt', 'test2.txt'); $this->runCommands(); @@ -592,7 +584,7 @@ class VersioningTest extends \Test\TestCase { * test if we find all versions and if the versions array contain * the correct 'path' and 'name' */ - public function testGetVersions() { + public function testGetVersions(): void { $t1 = time(); // second version is two weeks older, this way we make sure that no // version will be expired @@ -608,7 +600,7 @@ class VersioningTest extends \Test\TestCase { $this->rootView->file_put_contents($v2, 'version2'); // execute copy hook of versions app - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, '/subfolder/test.txt'); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, '/subfolder/test.txt'); $this->assertCount(2, $versions); @@ -625,65 +617,65 @@ class VersioningTest extends \Test\TestCase { * test if we find all versions and if the versions array contain * the correct 'path' and 'name' */ - public function testGetVersionsEmptyFile() { + public function testGetVersionsEmptyFile(): void { // execute copy hook of versions app - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, ''); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, ''); $this->assertCount(0, $versions); - $versions = \OCA\Files_Versions\Storage::getVersions(self::TEST_VERSIONS_USER, null); + $versions = Storage::getVersions(self::TEST_VERSIONS_USER, null); $this->assertCount(0, $versions); } - public function testExpireNonexistingFile() { + public function testExpireNonexistingFile(): void { $this->logout(); // needed to have a FS setup (the background job does this) \OC_Util::setupFS(self::TEST_VERSIONS_USER); - $this->assertFalse(\OCA\Files_Versions\Storage::expire('/void/unexist.txt', self::TEST_VERSIONS_USER)); + $this->assertFalse(Storage::expire('/void/unexist.txt', self::TEST_VERSIONS_USER)); } - public function testExpireNonexistingUser() { - $this->expectException(\OC\User\NoUserException::class); + public function testExpireNonexistingUser(): void { + $this->expectException(NoUserException::class); $this->logout(); // needed to have a FS setup (the background job does this) \OC_Util::setupFS(self::TEST_VERSIONS_USER); - \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); + Filesystem::file_put_contents('test.txt', 'test file'); - $this->assertFalse(\OCA\Files_Versions\Storage::expire('test.txt', 'unexist')); + $this->assertFalse(Storage::expire('test.txt', 'unexist')); } - public function testRestoreSameStorage() { - \OC\Files\Filesystem::mkdir('sub'); + public function testRestoreSameStorage(): void { + Filesystem::mkdir('sub'); $this->doTestRestore(); } - public function testRestoreCrossStorage() { + public function testRestoreCrossStorage(): void { $storage2 = new Temporary([]); - \OC\Files\Filesystem::mount($storage2, [], self::TEST_VERSIONS_USER . '/files/sub'); + Filesystem::mount($storage2, [], self::TEST_VERSIONS_USER . '/files/sub'); $this->doTestRestore(); } - public function testRestoreNoPermission() { + public function testRestoreNoPermission(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); $userHome = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER); $node = $userHome->newFolder('folder'); $file = $node->newFile('test.txt'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_READ); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_READ); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); $versions = $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'folder/test.txt' ); @@ -693,15 +685,15 @@ class VersioningTest extends \Test\TestCase { $firstVersion = current($versions); - $this->assertFalse(\OCA\Files_Versions\Storage::rollback('folder/test.txt', $firstVersion['version'], $this->user2), 'Revert did not happen'); + $this->assertFalse(Storage::rollback('folder/test.txt', (int)$firstVersion['version'], $this->user2), 'Revert did not happen'); $this->loginAsUser(self::TEST_VERSIONS_USER); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); $this->assertEquals('test file', $file->getContent(), 'File content has not changed'); } - public function testRestoreMovedShare() { + public function testRestoreMovedShare(): void { $this->markTestSkipped('Unreliable test'); $this->loginAsUser(self::TEST_VERSIONS_USER); @@ -712,21 +704,21 @@ class VersioningTest extends \Test\TestCase { $userHome2 = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER2); $userHome2->newFolder('subfolder'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); - $shareManager = \OC::$server->getShareManager(); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + $shareManager = Server::get(\OCP\Share\IManager::class); $shareManager->acceptShare($share, self::TEST_VERSIONS_USER2); - $share->setTarget("subfolder/folder"); + $share->setTarget('subfolder/folder'); $shareManager->moveShare($share, self::TEST_VERSIONS_USER2); $versions = $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'folder/test.txt' ); @@ -736,11 +728,11 @@ class VersioningTest extends \Test\TestCase { $firstVersion = current($versions); - $this->assertTrue(\OCA\Files_Versions\Storage::rollback('folder/test.txt', $firstVersion['version'], $this->user1)); + $this->assertTrue(Storage::rollback('folder/test.txt', $firstVersion['version'], $this->user1)); $this->loginAsUser(self::TEST_VERSIONS_USER); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); $this->assertEquals('version 2', $file->getContent(), 'File content has not changed'); } @@ -753,19 +745,19 @@ class VersioningTest extends \Test\TestCase { return; } - $eventHandler = $this->getMockBuilder(\stdclass::class) - ->setMethods(['callback']) + $eventHandler = $this->getMockBuilder(DummyHookListener::class) + ->onlyMethods(['callback']) ->getMock(); $eventHandler->expects($this->any()) ->method('callback') ->willReturnCallback( - function ($p) use (&$params) { + function ($p) use (&$params): void { $params = $p; } ); - \OCP\Util::connectHook( + Util::connectHook( '\OCP\Versions', $hookName, $eventHandler, @@ -773,7 +765,7 @@ class VersioningTest extends \Test\TestCase { ); } - private function doTestRestore() { + private function doTestRestore(): void { $filePath = self::TEST_VERSIONS_USER . '/files/sub/test.txt'; $this->rootView->file_put_contents($filePath, 'test file'); @@ -811,7 +803,7 @@ class VersioningTest extends \Test\TestCase { $versionEntity->setMetadata([]); $this->versionsMapper->insert($versionEntity); - $oldVersions = \OCA\Files_Versions\Storage::getVersions( + $oldVersions = Storage::getVersions( self::TEST_VERSIONS_USER, '/sub/test.txt' ); @@ -820,22 +812,22 @@ class VersioningTest extends \Test\TestCase { $this->assertEquals('test file', $this->rootView->file_get_contents($filePath)); $info1 = $this->rootView->getFileInfo($filePath); - $params = []; - $this->connectMockHooks('rollback', $params); + $eventDispatcher = Server::get(IEventDispatcher::class); + $eventFired = false; + $eventDispatcher->addListener(VersionRestoredEvent::class, function ($event) use (&$eventFired, $t2): void { + $eventFired = true; + $this->assertEquals('/sub/test.txt', $event->getVersion()->getVersionPath()); + $this->assertTrue($event->getVersion()->getRevisionId() > 0); + }); - $versionManager = \OCP\Server::get(IVersionManager::class); + $versionManager = Server::get(IVersionManager::class); $versions = $versionManager->getVersionsForFile($this->user1, $info1); $version = array_filter($versions, function ($version) use ($t2) { return $version->getRevisionId() === $t2; }); $this->assertTrue($versionManager->rollback(current($version))); - $expectedParams = [ - 'path' => '/sub/test.txt', - ]; - $this->assertEquals($expectedParams['path'], $params['path']); - $this->assertTrue(array_key_exists('revision', $params)); - $this->assertTrue($params['revision'] > 0); + $this->assertTrue($eventFired, 'VersionRestoredEvent was not fired'); $this->assertEquals('version2', $this->rootView->file_get_contents($filePath)); $info2 = $this->rootView->getFileInfo($filePath); @@ -856,7 +848,7 @@ class VersioningTest extends \Test\TestCase { 'Restored file has mtime from version' ); - $newVersions = \OCA\Files_Versions\Storage::getVersions( + $newVersions = Storage::getVersions( self::TEST_VERSIONS_USER, '/sub/test.txt' ); @@ -892,11 +884,11 @@ class VersioningTest extends \Test\TestCase { /** * Test whether versions are created when overwriting as owner */ - public function testStoreVersionAsOwner() { + public function testStoreVersionAsOwner(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'test.txt' ); } @@ -904,30 +896,30 @@ class VersioningTest extends \Test\TestCase { /** * Test whether versions are created when overwriting as share recipient */ - public function testStoreVersionAsRecipient() { + public function testStoreVersionAsRecipient(): void { $this->loginAsUser(self::TEST_VERSIONS_USER); - \OC\Files\Filesystem::mkdir('folder'); - \OC\Files\Filesystem::file_put_contents('folder/test.txt', 'test file'); + Filesystem::mkdir('folder'); + Filesystem::file_put_contents('folder/test.txt', 'test file'); $node = \OC::$server->getUserFolder(self::TEST_VERSIONS_USER)->get('folder'); - $share = \OC::$server->getShareManager()->newShare(); + $share = Server::get(\OCP\Share\IManager::class)->newShare(); $share->setNode($node) ->setShareType(IShare::TYPE_USER) ->setSharedBy(self::TEST_VERSIONS_USER) ->setSharedWith(self::TEST_VERSIONS_USER2) - ->setPermissions(\OCP\Constants::PERMISSION_ALL); - $share = \OC::$server->getShareManager()->createShare($share); - \OC::$server->getShareManager()->acceptShare($share, self::TEST_VERSIONS_USER2); + ->setPermissions(Constants::PERMISSION_ALL); + $share = Server::get(\OCP\Share\IManager::class)->createShare($share); + Server::get(\OCP\Share\IManager::class)->acceptShare($share, self::TEST_VERSIONS_USER2); $this->loginAsUser(self::TEST_VERSIONS_USER2); $this->createAndCheckVersions( - \OC\Files\Filesystem::getView(), + Filesystem::getView(), 'folder/test.txt' ); - \OC::$server->getShareManager()->deleteShare($share); + Server::get(\OCP\Share\IManager::class)->deleteShare($share); } /** @@ -937,25 +929,21 @@ class VersioningTest extends \Test\TestCase { * is logged in. File modification must still be able to find * the owner and create versions. */ - public function testStoreVersionAsAnonymous() { + public function testStoreVersionAsAnonymous(): void { $this->logout(); // note: public link upload does this, // needed to make the hooks fire \OC_Util::setupFS(self::TEST_VERSIONS_USER); - $userView = new \OC\Files\View('/' . self::TEST_VERSIONS_USER . '/files'); + $userView = new View('/' . self::TEST_VERSIONS_USER . '/files'); $this->createAndCheckVersions( $userView, 'test.txt' ); } - /** - * @param \OC\Files\View $view - * @param string $path - */ - private function createAndCheckVersions(\OC\Files\View $view, $path) { + private function createAndCheckVersions(View $view, string $path): array { $view->file_put_contents($path, 'test file'); $view->file_put_contents($path, 'version 1'); $view->file_put_contents($path, 'version 2'); @@ -966,7 +954,7 @@ class VersioningTest extends \Test\TestCase { [$rootStorage,] = $this->rootView->resolvePath(self::TEST_VERSIONS_USER . '/files_versions'); $rootStorage->getScanner()->scan('files_versions'); - $versions = \OCA\Files_Versions\Storage::getVersions( + $versions = Storage::getVersions( self::TEST_VERSIONS_USER, '/' . $path ); @@ -977,28 +965,29 @@ class VersioningTest extends \Test\TestCase { return $versions; } - /** - * @param string $user - * @param bool $create - */ - public static function loginHelper($user, $create = false) { + public static function loginHelper(string $user, bool $create = false) { if ($create) { $backend = new \Test\Util\User\Dummy(); $backend->createUser($user, $user); - \OC::$server->getUserManager()->registerBackend($backend); + Server::get(IUserManager::class)->registerBackend($backend); } \OC_Util::tearDownFS(); \OC_User::setUserId(''); - \OC\Files\Filesystem::tearDown(); + Filesystem::tearDown(); \OC_User::setUserId($user); \OC_Util::setupFS($user); \OC::$server->getUserFolder($user); } } +class DummyHookListener { + public function callback() { + } +} + // extend the original class to make it possible to test protected methods -class VersionStorageToTest extends \OCA\Files_Versions\Storage { +class VersionStorageToTest extends Storage { /** * @param integer $time diff --git a/apps/files_versions/tests/Versions/VersionManagerTest.php b/apps/files_versions/tests/Versions/VersionManagerTest.php index f3eb1ee3e4d..79caa65d5f1 100644 --- a/apps/files_versions/tests/Versions/VersionManagerTest.php +++ b/apps/files_versions/tests/Versions/VersionManagerTest.php @@ -3,32 +3,19 @@ declare(strict_types=1); /** - * @copyright Copyright (c) 2019 Robin Appelman <robin@icewind.nl> - * - * @author Robin Appelman <robin@icewind.nl> - * - * @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: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ -namespace OCA\files_versions\tests\Versions; +namespace OCA\Files_Versions\Tests\Versions; use OC\Files\Storage\Local; +use OCA\Files_Versions\Events\VersionRestoredEvent; +use OCA\Files_Versions\Versions\IVersion; use OCA\Files_Versions\Versions\IVersionBackend; use OCA\Files_Versions\Versions\VersionManager; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Storage\IStorage; +use PHPUnit\Framework\MockObject\MockObject; use Test\TestCase; class VersionManagerTest extends TestCase { @@ -39,23 +26,25 @@ class VersionManagerTest extends TestCase { return $backend; } - private function getStorage(string $class): IStorage { + private function getStorage(string $class): IStorage&MockObject { return $this->getMockBuilder($class) ->disableOriginalConstructor() - ->setMethodsExcept(['instanceOfStorage']) + ->onlyMethods(array_diff(get_class_methods($class), ['instanceOfStorage'])) ->getMock(); } - public function testGetBackendSingle() { - $manager = new VersionManager(); + public function testGetBackendSingle(): void { + $dispatcher = $this->createMock(IEventDispatcher::class); + $manager = new VersionManager($dispatcher); $backend = $this->getBackend(); $manager->registerBackend(IStorage::class, $backend); $this->assertEquals($backend, $manager->getBackendForStorage($this->getStorage(Local::class))); } - public function testGetBackendMoreSpecific() { - $manager = new VersionManager(); + public function testGetBackendMoreSpecific(): void { + $dispatcher = $this->createMock(IEventDispatcher::class); + $manager = new VersionManager($dispatcher); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(); $manager->registerBackend(IStorage::class, $backend1); @@ -64,8 +53,9 @@ class VersionManagerTest extends TestCase { $this->assertEquals($backend2, $manager->getBackendForStorage($this->getStorage(Local::class))); } - public function testGetBackendNoUse() { - $manager = new VersionManager(); + public function testGetBackendNoUse(): void { + $dispatcher = $this->createMock(IEventDispatcher::class); + $manager = new VersionManager($dispatcher); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(false); $manager->registerBackend(IStorage::class, $backend1); @@ -74,8 +64,9 @@ class VersionManagerTest extends TestCase { $this->assertEquals($backend1, $manager->getBackendForStorage($this->getStorage(Local::class))); } - public function testGetBackendMultiple() { - $manager = new VersionManager(); + public function testGetBackendMultiple(): void { + $dispatcher = $this->createMock(IEventDispatcher::class); + $manager = new VersionManager($dispatcher); $backend1 = $this->getBackend(); $backend2 = $this->getBackend(false); $backend3 = $this->getBackend(); @@ -85,4 +76,65 @@ class VersionManagerTest extends TestCase { $this->assertEquals($backend3, $manager->getBackendForStorage($this->getStorage(Local::class))); } + + public function testRollbackSuccess(): void { + $versionMock = $this->createMock(IVersion::class); + $backendMock = $this->createMock(IVersionBackend::class); + + $backendMock->expects($this->once()) + ->method('rollback') + ->with($versionMock) + ->willReturn(true); + + $versionMock->method('getBackend')->willReturn($backendMock); + + $dispatcherMock = $this->createMock(IEventDispatcher::class); + $dispatcherMock->expects($this->once()) + ->method('dispatchTyped') + ->with($this->isInstanceOf(VersionRestoredEvent::class)); + + $manager = new VersionManager($dispatcherMock); + + $this->assertTrue($manager->rollback($versionMock)); + } + + public function testRollbackNull(): void { + $versionMock = $this->createMock(IVersion::class); + $backendMock = $this->createMock(IVersionBackend::class); + + $backendMock->expects($this->once()) + ->method('rollback') + ->with($versionMock) + ->willReturn(null); + + $versionMock->method('getBackend')->willReturn($backendMock); + + $dispatcherMock = $this->createMock(IEventDispatcher::class); + $dispatcherMock->expects($this->once()) + ->method('dispatchTyped') + ->with($this->isInstanceOf(VersionRestoredEvent::class)); + + $manager = new VersionManager($dispatcherMock); + + $this->assertNull($manager->rollback($versionMock)); + } + + public function testRollbackFailure(): void { + $versionMock = $this->createMock(IVersion::class); + $backendMock = $this->createMock(IVersionBackend::class); + + $backendMock->expects($this->once()) + ->method('rollback') + ->with($versionMock) + ->willReturn(false); + + $versionMock->method('getBackend')->willReturn($backendMock); + + $dispatcherMock = $this->createMock(IEventDispatcher::class); + $dispatcherMock->expects($this->never())->method('dispatchTyped'); + + $manager = new VersionManager($dispatcherMock); + + $this->assertFalse($manager->rollback($versionMock)); + } } |