aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_versions/tests
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_versions/tests')
-rw-r--r--apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php55
-rw-r--r--apps/files_versions/tests/Command/CleanupTest.php116
-rw-r--r--apps/files_versions/tests/Command/ExpireTest.php28
-rw-r--r--apps/files_versions/tests/Controller/PreviewControllerTest.php85
-rw-r--r--apps/files_versions/tests/ExpirationTest.php58
-rw-r--r--apps/files_versions/tests/StorageTest.php101
-rw-r--r--apps/files_versions/tests/VersioningTest.php537
-rw-r--r--apps/files_versions/tests/Versions/VersionManagerTest.php113
-rw-r--r--apps/files_versions/tests/js/versioncollectionSpec.js34
-rw-r--r--apps/files_versions/tests/js/versionmodelSpec.js109
-rw-r--r--apps/files_versions/tests/js/versionstabviewSpec.js176
11 files changed, 617 insertions, 795 deletions
diff --git a/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php b/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php
new file mode 100644
index 00000000000..21e88e86f90
--- /dev/null
+++ b/apps/files_versions/tests/BackgroundJob/ExpireVersionsTest.php
@@ -0,0 +1,55 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\Files_Versions\Tests\BackgroundJob;
+
+use OCA\Files_Versions\BackgroundJob\ExpireVersions;
+use OCA\Files_Versions\Expiration;
+use OCP\AppFramework\Utility\ITimeFactory;
+use OCP\BackgroundJob\IJobList;
+use OCP\IConfig;
+use OCP\IUserManager;
+use PHPUnit\Framework\MockObject\MockObject;
+use Test\TestCase;
+
+class ExpireVersionsTest extends TestCase {
+ private IConfig&MockObject $config;
+ private IUserManager&MockObject $userManager;
+ private Expiration&MockObject $expiration;
+ private IJobList&MockObject $jobList;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $this->config = $this->createMock(IConfig::class);
+ $this->userManager = $this->createMock(IUserManager::class);
+ $this->expiration = $this->createMock(Expiration::class);
+ $this->jobList = $this->createMock(IJobList::class);
+
+ $this->jobList->expects($this->once())
+ ->method('setLastRun');
+ $this->jobList->expects($this->once())
+ ->method('setExecutionTime');
+ }
+
+ public function testBackgroundJobDeactivated(): void {
+ $this->config->method('getAppValue')
+ ->with('files_versions', 'background_job_expire_versions', 'yes')
+ ->willReturn('no');
+ $this->expiration->expects($this->never())
+ ->method('getMaxAgeAsTimestamp');
+
+ $timeFactory = $this->createMock(ITimeFactory::class);
+ $timeFactory->method('getTime')
+ ->with()
+ ->willReturn(999999999);
+
+ $job = new ExpireVersions($this->config, $this->userManager, $this->expiration, $timeFactory);
+ $job->start($this->jobList);
+ }
+}
diff --git a/apps/files_versions/tests/Command/CleanupTest.php b/apps/files_versions/tests/Command/CleanupTest.php
index b48bbaf1246..dd6665f5aef 100644
--- a/apps/files_versions/tests/Command/CleanupTest.php
+++ b/apps/files_versions/tests/Command/CleanupTest.php
@@ -1,34 +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;
/**
@@ -39,38 +27,46 @@ 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;
+ 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->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->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')
->willReturn($nodeExists);
+ $userFolder = $this->createMock(Folder::class);
+ $userHomeStorage = $this->createMock(IStorage::class);
+ $userHomeStorageCache = $this->createMock(ICache::class);
+ $this->rootFolder->expects($this->once())
+ ->method('getUserFolder')
+ ->willReturn($userFolder);
+ $userFolder->expects($this->once())
+ ->method('getStorage')
+ ->willReturn($userHomeStorage);
+ $userHomeStorage->expects($this->once())
+ ->method('getCache')
+ ->willReturn($userHomeStorageCache);
+ $userHomeStorageCache->expects($this->once())
+ ->method('getNumericStorageId')
+ ->willReturn(1);
if ($nodeExists) {
$this->rootFolder->expects($this->once())
@@ -89,7 +85,7 @@ class CleanupTest extends TestCase {
$this->invokePrivate($this->cleanup, 'deleteVersions', ['testUser']);
}
- public function dataTestDeleteVersions() {
+ public static function dataTestDeleteVersions(): array {
return [
[true],
[false]
@@ -100,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'])
- ->setConstructorArgs([$this->rootFolder, $this->userManager])
+ $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]);
}
@@ -131,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'])
- ->setConstructorArgs([$this->rootFolder, $this->userManager])
+ $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)
@@ -148,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 24871dd2b96..b74457a7fd6 100644
--- a/apps/files_versions/tests/Command/ExpireTest.php
+++ b/apps/files_versions/tests/Command/ExpireTest.php
@@ -1,27 +1,11 @@
<?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;
use OCA\Files_Versions\Command\Expire;
@@ -35,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 7b550f60866..542ea2b6b34 100644
--- a/apps/files_versions/tests/Controller/PreviewControllerTest.php
+++ b/apps/files_versions/tests/Controller/PreviewControllerTest.php
@@ -1,26 +1,9 @@
<?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;
@@ -29,10 +12,8 @@ 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;
@@ -40,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();
@@ -74,54 +44,54 @@ class PreviewControllerTest extends TestCase {
$user->expects($this->any())
->method('getUID')
->willReturn($this->userId);
- $this->mimeTypeDetector = $this->createMock(IMimeTypeDetector::class);
$this->previewManager = $this->createMock(IPreview::class);
$this->userSession = $this->createMock(IUserSession::class);
$this->userSession->expects($this->any())
->method('getUser')
->willReturn($user);
$this->versionManager = $this->createMock(IVersionManager::class);
+ $this->mimeIconProvider = $this->createMock(IMimeIconProvider::class);
$this->controller = new PreviewController(
'files_versions',
$this->createMock(IRequest::class),
$this->rootFolder,
$this->userSession,
- $this->mimeTypeDetector,
$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);
@@ -144,6 +114,8 @@ class PreviewControllerTest extends TestCase {
->willReturn($file);
$preview = $this->createMock(ISimpleFile::class);
+ $preview->method('getName')->willReturn('name');
+ $preview->method('getMTime')->willReturn(42);
$this->previewManager->method('getPreview')
->with($this->equalTo($file), 10, 10, true, IPreview::MODE_FILL, 'myMime')
->willReturn($preview);
@@ -151,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);
@@ -171,10 +144,6 @@ class PreviewControllerTest extends TestCase {
->with('file')
->willReturn($sourceFile);
- $this->mimeTypeDetector->method('detectPath')
- ->with($this->equalTo('file'))
- ->willReturn('myMime');
-
$this->versionManager->method('getVersionFile')
->willThrowException(new NotFoundException());
diff --git a/apps/files_versions/tests/ExpirationTest.php b/apps/files_versions/tests/ExpirationTest.php
index d6d057e29a5..8cf412c3fe0 100644
--- a/apps/files_versions/tests/ExpirationTest.php
+++ b/apps/files_versions/tests/ExpirationTest.php
@@ -1,40 +1,23 @@
<?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;
use OCA\Files_Versions\Expiration;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use PHPUnit\Framework\MockObject\MockObject;
+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,31 +81,20 @@ 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);
- $expiration = new Expiration($mockedConfig, $mockedTimeFactory);
+ $expiration = new Expiration($mockedConfig, $mockedTimeFactory, $mockedLogger);
$actualResult = $expiration->isExpired($timestamp, $quotaExceeded);
$this->assertEquals($expectedResult, $actualResult);
}
- /**
- * @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')
@@ -131,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
new file mode 100644
index 00000000000..443cff3ee06
--- /dev/null
+++ b/apps/files_versions/tests/StorageTest.php
@@ -0,0 +1,101 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCA\files_versions\tests;
+
+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;
+
+/**
+ * @group DB
+ */
+class StorageTest extends TestCase {
+ use UserTrait;
+
+ private $versionsRoot;
+ private $userFolder;
+ private int $expireTimestamp = 10;
+
+ protected function setUp(): void {
+ parent::setUp();
+
+ $expiration = $this->createMock(Expiration::class);
+ $expiration->method('getMaxAgeAsTimestamp')
+ ->willReturnCallback(function () {
+ return $this->expireTimestamp;
+ });
+ $this->overwriteService(Expiration::class, $expiration);
+
+ \OC::$server->boot();
+
+ $this->createUser('version_test', '');
+ $this->loginAsUser('version_test');
+ /** @var IRootFolder $root */
+ $root = Server::get(IRootFolder::class);
+ $this->userFolder = $root->getUserFolder('version_test');
+ }
+
+
+ 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, (string)$mtime);
+ }
+ $file->touch($mtime);
+ }
+
+ public function testExpireMaxAge(): void {
+ $this->userFolder->newFolder('folder1');
+ $this->userFolder->newFolder('folder1/sub1');
+ $this->userFolder->newFolder('folder2');
+
+ $this->createPastFile('file1', 100);
+ $this->createPastFile('file1', 500);
+ $this->createPastFile('file1', 900);
+
+ $this->createPastFile('folder1/file2', 100);
+ $this->createPastFile('folder1/file2', 200);
+ $this->createPastFile('folder1/file2', 300);
+
+ $this->createPastFile('folder1/sub1/file3', 400);
+ $this->createPastFile('folder1/sub1/file3', 500);
+ $this->createPastFile('folder1/sub1/file3', 600);
+
+ $this->createPastFile('folder2/file4', 100);
+ $this->createPastFile('folder2/file4', 600);
+ $this->createPastFile('folder2/file4', 800);
+
+ $this->assertCount(2, Storage::getVersions('version_test', 'file1'));
+ $this->assertCount(2, Storage::getVersions('version_test', 'folder1/file2'));
+ $this->assertCount(2, Storage::getVersions('version_test', 'folder1/sub1/file3'));
+ $this->assertCount(2, Storage::getVersions('version_test', 'folder2/file4'));
+
+ $this->expireTimestamp = 150;
+ Storage::expireOlderThanMaxForUser('version_test');
+
+ $this->assertCount(1, Storage::getVersions('version_test', 'file1'));
+ $this->assertCount(1, Storage::getVersions('version_test', 'folder1/file2'));
+ $this->assertCount(2, Storage::getVersions('version_test', 'folder1/sub1/file3'));
+ $this->assertCount(1, Storage::getVersions('version_test', 'folder2/file4'));
+
+ $this->expireTimestamp = 550;
+ Storage::expireOlderThanMaxForUser('version_test');
+
+ $this->assertCount(0, Storage::getVersions('version_test', 'file1'));
+ $this->assertCount(0, Storage::getVersions('version_test', 'folder1/file2'));
+ $this->assertCount(0, Storage::getVersions('version_test', 'folder1/sub1/file3'));
+ $this->assertCount(1, Storage::getVersions('version_test', 'folder2/file4'));
+ }
+}
diff --git a/apps/files_versions/tests/VersioningTest.php b/apps/files_versions/tests/VersioningTest.php
index 7a6802a1d0d..c9f7d27d7ab 100644
--- a/apps/files_versions/tests/VersioningTest.php
+++ b/apps/files_versions/tests/VersioningTest.php
@@ -1,44 +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
@@ -52,16 +43,24 @@ class VersioningTest extends \Test\TestCase {
public const USERS_VERSIONS_ROOT = '/test-versions-user/files_versions';
/**
- * @var \OC\Files\View
+ * @var View
*/
private $rootView;
+ /**
+ * @var VersionsMapper
+ */
+ private $versionsMapper;
+ /**
+ * @var IMimeTypeLoader
+ */
+ private $mimeTypeLoader;
private $user1;
private $user2;
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);
@@ -70,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();
}
@@ -85,30 +84,36 @@ 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());
- \OCA\Files_Versions\Hooks::connectHooks();
+ \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 = Server::get(VersionsMapper::class);
+ $this->mimeTypeLoader = Server::get(IMimeTypeLoader::class);
+
$this->user1 = $this->createMock(IUser::class);
$this->user1->method('getUID')
->willReturn(self::TEST_VERSIONS_USER);
@@ -118,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/');
@@ -135,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;
@@ -151,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)
],
@@ -216,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)
],
@@ -245,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)
],
@@ -283,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
@@ -301,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();
@@ -312,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
@@ -333,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();
@@ -359,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
@@ -383,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();
@@ -395,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
@@ -427,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));
@@ -442,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
@@ -478,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));
@@ -493,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
@@ -516,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);
@@ -542,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
@@ -563,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();
@@ -578,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
@@ -594,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);
@@ -611,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'
);
@@ -679,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);
@@ -698,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'
);
@@ -722,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');
}
@@ -739,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,
@@ -759,10 +765,11 @@ 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');
+ $fileInfo = $this->rootView->getFileInfo($filePath);
$t0 = $this->rootView->filemtime($filePath);
// not exactly the same timestamp as the file
@@ -775,10 +782,28 @@ class VersioningTest extends \Test\TestCase {
$v2 = self::USERS_VERSIONS_ROOT . '/sub/test.txt.v' . $t2;
$this->rootView->mkdir(self::USERS_VERSIONS_ROOT . '/sub');
+
$this->rootView->file_put_contents($v1, 'version1');
- $this->rootView->file_put_contents($v2, 'version2');
+ $fileInfoV1 = $this->rootView->getFileInfo($v1);
+ $versionEntity = new VersionEntity();
+ $versionEntity->setFileId($fileInfo->getId());
+ $versionEntity->setTimestamp($t1);
+ $versionEntity->setSize($fileInfoV1->getSize());
+ $versionEntity->setMimetype($this->mimeTypeLoader->getId($fileInfoV1->getMimetype()));
+ $versionEntity->setMetadata([]);
+ $this->versionsMapper->insert($versionEntity);
- $oldVersions = \OCA\Files_Versions\Storage::getVersions(
+ $this->rootView->file_put_contents($v2, 'version2');
+ $fileInfoV2 = $this->rootView->getFileInfo($v2);
+ $versionEntity = new VersionEntity();
+ $versionEntity->setFileId($fileInfo->getId());
+ $versionEntity->setTimestamp($t2);
+ $versionEntity->setSize($fileInfoV2->getSize());
+ $versionEntity->setMimetype($this->mimeTypeLoader->getId($fileInfoV2->getMimetype()));
+ $versionEntity->setMetadata([]);
+ $this->versionsMapper->insert($versionEntity);
+
+ $oldVersions = Storage::getVersions(
self::TEST_VERSIONS_USER, '/sub/test.txt'
);
@@ -787,17 +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);
+ });
- $this->assertTrue(\OCA\Files_Versions\Storage::rollback('sub/test.txt', $t2, $this->user1));
- $expectedParams = [
- 'path' => '/sub/test.txt',
- ];
+ $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)));
- $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);
@@ -818,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'
);
@@ -854,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'
);
}
@@ -866,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);
}
/**
@@ -899,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');
@@ -928,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
);
@@ -939,34 +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);
}
- $storage = new \ReflectionClass('\OCA\Files_Sharing\SharedStorage');
- $isInitialized = $storage->getProperty('initialized');
- $isInitialized->setAccessible(true);
- $isInitialized->setValue($storage, false);
- $isInitialized->setAccessible(false);
-
\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 950b719ca5d..79caa65d5f1 100644
--- a/apps/files_versions/tests/Versions/VersionManagerTest.php
+++ b/apps/files_versions/tests/Versions/VersionManagerTest.php
@@ -3,33 +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 {
@@ -40,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);
@@ -65,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);
@@ -75,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();
@@ -86,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));
+ }
}
diff --git a/apps/files_versions/tests/js/versioncollectionSpec.js b/apps/files_versions/tests/js/versioncollectionSpec.js
deleted file mode 100644
index 305685b71df..00000000000
--- a/apps/files_versions/tests/js/versioncollectionSpec.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-describe('OCA.Versions.VersionCollection', function() {
- var VersionCollection = OCA.Versions.VersionCollection;
- var collection, fileInfoModel;
-
- beforeEach(function() {
- fileInfoModel = new OCA.Files.FileInfoModel({
- path: '/subdir',
- name: 'some file.txt',
- id: 10,
- });
- collection = new VersionCollection();
- collection.setFileInfo(fileInfoModel);
- collection.setCurrentUser('user');
- });
- it('fetches the versions', function() {
- collection.fetch();
-
- expect(fakeServer.requests.length).toEqual(1);
- expect(fakeServer.requests[0].url).toEqual(
- OC.linkToRemoteBase('dav') + '/versions/user/versions/10'
- );
- fakeServer.requests[0].respond(200);
- });
-});
-
diff --git a/apps/files_versions/tests/js/versionmodelSpec.js b/apps/files_versions/tests/js/versionmodelSpec.js
deleted file mode 100644
index ae8801b1f5c..00000000000
--- a/apps/files_versions/tests/js/versionmodelSpec.js
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-describe('OCA.Versions.VersionModel', function() {
- var VersionModel = OCA.Versions.VersionModel;
- var model;
- var uid = OC.currentUser = 'user';
-
- beforeEach(function() {
- model = new VersionModel({
- id: 10000000,
- fileId: 10,
- timestamp: 10000000,
- fullPath: '/subdir/some file.txt',
- name: 'some file.txt',
- size: 150,
- user: 'user',
- client: new OC.Files.Client({
- host: 'localhost',
- port: 80,
- root: '/remote.php/dav/versions/user',
- useHTTPS: OC.getProtocol() === 'https'
- })
- });
- });
-
- it('returns the full path', function() {
- expect(model.getFullPath()).toEqual('/subdir/some file.txt');
- });
- it('returns the preview url', function() {
- expect(model.getPreviewUrl())
- .toEqual(OC.generateUrl('/apps/files_versions/preview') +
- '?file=%2Fsubdir%2Fsome%20file.txt&version=10000000'
- );
- });
- it('returns the download url', function() {
- expect(model.getDownloadUrl())
- .toEqual(OC.linkToRemoteBase('dav') + '/versions/' + uid +
- '/versions/10/10000000'
- );
- });
- describe('reverting', function() {
- var revertEventStub;
- var successStub;
- var errorStub;
-
- beforeEach(function() {
- revertEventStub = sinon.stub();
- errorStub = sinon.stub();
- successStub = sinon.stub();
-
- model.on('revert', revertEventStub);
- model.on('error', errorStub);
- });
- it('tells the server to revert when calling the revert method', function(done) {
- var promise = model.revert({
- success: successStub
- });
-
- expect(fakeServer.requests.length).toEqual(1);
- var request = fakeServer.requests[0];
- expect(request.url)
- .toEqual(
- OC.linkToRemoteBase('dav') + '/versions/user/versions/10/10000000'
- );
- expect(request.requestHeaders.Destination).toEqual(OC.getRootPath() + '/remote.php/dav/versions/user/restore/target');
- request.respond(201);
-
- promise.then(function() {
- expect(revertEventStub.calledOnce).toEqual(true);
- expect(successStub.calledOnce).toEqual(true);
- expect(errorStub.notCalled).toEqual(true);
-
- done();
- });
- });
- it('triggers error event when server returns a failure', function(done) {
- var promise = model.revert({
- success: successStub
- });
-
- expect(fakeServer.requests.length).toEqual(1);
- var responseErrorHeaders = {
- "Content-Type": "application/xml"
- };
- var responseErrorBody =
- '<d:error xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns">' +
- ' <s:exception>Sabre\\DAV\\Exception\\SomeException</s:exception>' +
- ' <s:message>Some error message</s:message>' +
- '</d:error>';
- fakeServer.requests[0].respond(404, responseErrorHeaders, responseErrorBody);
-
- promise.fail(function() {
- expect(revertEventStub.notCalled).toEqual(true);
- expect(successStub.notCalled).toEqual(true);
- expect(errorStub.calledOnce).toEqual(true);
-
- done();
- });
- });
- });
-});
-
diff --git a/apps/files_versions/tests/js/versionstabviewSpec.js b/apps/files_versions/tests/js/versionstabviewSpec.js
deleted file mode 100644
index 40fd8879645..00000000000
--- a/apps/files_versions/tests/js/versionstabviewSpec.js
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (c) 2015
- *
- * This file is licensed under the Affero General Public License version 3
- * or later.
- *
- * See the COPYING-README file.
- *
- */
-describe('OCA.Versions.VersionsTabView', function() {
- var VersionCollection = OCA.Versions.VersionCollection;
- var VersionModel = OCA.Versions.VersionModel;
- var VersionsTabView = OCA.Versions.VersionsTabView;
-
- var fetchStub, fileInfoModel, tabView, testVersions, clock;
-
- beforeEach(function() {
- clock = sinon.useFakeTimers(Date.UTC(2015, 6, 17, 1, 2, 0, 3));
- var time1 = Date.UTC(2015, 6, 17, 1, 2, 0, 3) / 1000;
- var time2 = Date.UTC(2015, 6, 15, 1, 2, 0, 3) / 1000;
-
- var version1 = new VersionModel({
- id: time1,
- timestamp: time1,
- name: 'some file.txt',
- size: 140,
- fullPath: '/subdir/some file.txt',
- mimetype: 'text/plain'
- });
- var version2 = new VersionModel({
- id: time2,
- timestamp: time2,
- name: 'some file.txt',
- size: 150,
- fullPath: '/subdir/some file.txt',
- mimetype: 'text/plain'
- });
-
- testVersions = [version1, version2];
-
- fetchStub = sinon.stub(VersionCollection.prototype, 'fetch');
- fileInfoModel = new OCA.Files.FileInfoModel({
- id: 123,
- name: 'test.txt',
- permissions: OC.PERMISSION_READ | OC.PERMISSION_UPDATE
- });
- tabView = new VersionsTabView();
- tabView.render();
- });
-
- afterEach(function() {
- fetchStub.restore();
- tabView.remove();
- clock.restore();
- });
-
- describe('rendering', function() {
- it('reloads matching versions when setting file info model', function() {
- tabView.setFileInfo(fileInfoModel);
- expect(fetchStub.calledOnce).toEqual(true);
- });
-
- it('renders loading icon while fetching versions', function() {
- tabView.setFileInfo(fileInfoModel);
- tabView.collection.trigger('request');
-
- expect(tabView.$el.find('.loading').length).toEqual(1);
- expect(tabView.$el.find('.versions li').length).toEqual(0);
- });
-
- it('renders versions', function() {
-
- tabView.setFileInfo(fileInfoModel);
- tabView.collection.set(testVersions);
-
- var version1 = testVersions[0];
- var version2 = testVersions[1];
- var $versions = tabView.$el.find('.versions>li');
- expect($versions.length).toEqual(2);
- var $item = $versions.eq(0);
- expect($item.find('.downloadVersion').attr('href')).toEqual(version1.getDownloadUrl());
- expect($item.find('.versiondate').text()).toEqual('seconds ago');
- expect($item.find('.size').text()).toEqual('< 1 KB');
- expect($item.find('.revertVersion').length).toEqual(1);
-
- $item = $versions.eq(1);
- expect($item.find('.downloadVersion').attr('href')).toEqual(version2.getDownloadUrl());
- expect($item.find('.versiondate').text()).toEqual('2 days ago');
- expect($item.find('.size').text()).toEqual('< 1 KB');
- expect($item.find('.revertVersion').length).toEqual(1);
- });
-
- it('does not render revert button when no update permissions', function() {
-
- fileInfoModel.set('permissions', OC.PERMISSION_READ);
- tabView.setFileInfo(fileInfoModel);
- tabView.collection.set(testVersions);
-
- var version1 = testVersions[0];
- var version2 = testVersions[1];
- var $versions = tabView.$el.find('.versions>li');
- expect($versions.length).toEqual(2);
- var $item = $versions.eq(0);
- expect($item.find('.downloadVersion').attr('href')).toEqual(version1.getDownloadUrl());
- expect($item.find('.versiondate').text()).toEqual('seconds ago');
- expect($item.find('.revertVersion').length).toEqual(0);
-
- $item = $versions.eq(1);
- expect($item.find('.downloadVersion').attr('href')).toEqual(version2.getDownloadUrl());
- expect($item.find('.versiondate').text()).toEqual('2 days ago');
- expect($item.find('.revertVersion').length).toEqual(0);
- });
- });
-
- describe('Reverting', function() {
- var revertStub;
-
- beforeEach(function() {
- revertStub = sinon.stub(VersionModel.prototype, 'revert');
- tabView.setFileInfo(fileInfoModel);
- tabView.collection.set(testVersions);
- });
-
- afterEach(function() {
- revertStub.restore();
- });
-
- it('tells the model to revert when clicking "Revert"', function() {
- tabView.$el.find('.revertVersion').eq(1).click();
-
- expect(revertStub.calledOnce).toEqual(true);
- });
- it('triggers busy state during revert', function() {
- var busyStub = sinon.stub();
- fileInfoModel.on('busy', busyStub);
-
- tabView.$el.find('.revertVersion').eq(1).click();
-
- expect(busyStub.calledOnce).toEqual(true);
- expect(busyStub.calledWith(fileInfoModel, true)).toEqual(true);
-
- busyStub.reset();
- revertStub.getCall(0).args[0].success();
-
- expect(busyStub.calledOnce).toEqual(true);
- expect(busyStub.calledWith(fileInfoModel, false)).toEqual(true);
- });
- it('updates the file info model with the information from the reverted revision', function() {
- var changeStub = sinon.stub();
- fileInfoModel.on('change', changeStub);
-
- tabView.$el.find('.revertVersion').eq(1).click();
-
- expect(changeStub.notCalled).toEqual(true);
-
- revertStub.getCall(0).args[0].success();
-
- expect(changeStub.calledOnce).toEqual(true);
- var changes = changeStub.getCall(0).args[0].changed;
- expect(changes.size).toEqual(150);
- expect(changes.mtime).toEqual(testVersions[1].get('timestamp') * 1000);
- expect(changes.etag).toBeDefined();
- });
- it('shows notification on revert error', function() {
- var notificationStub = sinon.stub(OC.Notification, 'show');
-
- tabView.$el.find('.revertVersion').eq(1).click();
-
- revertStub.getCall(0).args[0].error();
-
- expect(notificationStub.calledOnce).toEqual(true);
-
- notificationStub.restore();
- });
- });
-});