0
0
Fork 0
mirror of https://github.com/nextcloud/server.git synced 2025-05-03 05:20:31 +00:00
nextcloud_server/apps/files_versions/tests/Versions/VersionManagerTest.php
ailkiv 9b3424f607 refactor: move version rollback hook to event
Signed-off-by: ailkiv <a.ilkiv.ye@gmail.com>
2025-02-25 14:03:21 +00:00

139 lines
4.5 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
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 Test\TestCase;
class VersionManagerTest extends TestCase {
private function getBackend(bool $shouldUse = true): IVersionBackend {
$backend = $this->createMock(IVersionBackend::class);
$backend->method('useBackendForStorage')
->willReturn($shouldUse);
return $backend;
}
private function getStorage(string $class): IStorage {
return $this->getMockBuilder($class)
->disableOriginalConstructor()
->setMethodsExcept(['instanceOfStorage'])
->getMock();
}
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(): void {
$dispatcher = $this->createMock(IEventDispatcher::class);
$manager = new VersionManager($dispatcher);
$backend1 = $this->getBackend();
$backend2 = $this->getBackend();
$manager->registerBackend(IStorage::class, $backend1);
$manager->registerBackend(Local::class, $backend2);
$this->assertEquals($backend2, $manager->getBackendForStorage($this->getStorage(Local::class)));
}
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);
$manager->registerBackend(Local::class, $backend2);
$this->assertEquals($backend1, $manager->getBackendForStorage($this->getStorage(Local::class)));
}
public function testGetBackendMultiple(): void {
$dispatcher = $this->createMock(IEventDispatcher::class);
$manager = new VersionManager($dispatcher);
$backend1 = $this->getBackend();
$backend2 = $this->getBackend(false);
$backend3 = $this->getBackend();
$manager->registerBackend(IStorage::class, $backend1);
$manager->registerBackend(Local::class, $backend2);
$manager->registerBackend(Local::class, $backend3);
$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));
}
}