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)); } }