* * @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 * */ namespace OCA\Files_External\Tests\Service; use OCA\Files_External\Lib\Auth\AuthMechanism; use OCA\Files_External\Lib\Backend\Backend; use OCA\Files_External\Lib\Config\IAuthMechanismProvider; use OCA\Files_External\Lib\Config\IBackendProvider; use \OCA\Files_External\Service\BackendService; use OCP\IConfig; use OCP\IL10N; class BackendServiceTest extends \Test\TestCase { /** @var \OCP\IConfig */ protected $config; /** @var \OCP\IL10N */ protected $l10n; protected function setUp() { $this->config = $this->createMock(IConfig::class); $this->l10n = $this->createMock(IL10N::class); } /** * @param string $class * * @return \OCA\Files_External\Lib\Backend\Backend */ protected function getBackendMock($class) { $backend = $this->getMockBuilder(Backend::class) ->disableOriginalConstructor() ->getMock(); $backend->method('getIdentifier')->will($this->returnValue('identifier:'.$class)); $backend->method('getIdentifierAliases')->will($this->returnValue(['identifier:'.$class])); return $backend; } /** * @param string $class * * @return \OCA\Files_External\Lib\Auth\AuthMechanism */ protected function getAuthMechanismMock($class) { $backend = $this->getMockBuilder(AuthMechanism::class) ->disableOriginalConstructor() ->getMock(); $backend->method('getIdentifier')->will($this->returnValue('identifier:'.$class)); $backend->method('getIdentifierAliases')->will($this->returnValue(['identifier:'.$class])); return $backend; } public function testRegisterBackend() { $service = new BackendService($this->config, $this->l10n); $backend = $this->getBackendMock('\Foo\Bar'); $backendAlias = $this->getMockBuilder(Backend::class) ->disableOriginalConstructor() ->getMock(); $backendAlias->method('getIdentifierAliases') ->willReturn(['identifier_real', 'identifier_alias']); $backendAlias->method('getIdentifier') ->willReturn('identifier_real'); $service->registerBackend($backend); $service->registerBackend($backendAlias); $this->assertEquals($backend, $service->getBackend('identifier:\Foo\Bar')); $this->assertEquals($backendAlias, $service->getBackend('identifier_real')); $this->assertEquals($backendAlias, $service->getBackend('identifier_alias')); $backends = $service->getBackends(); $this->assertCount(2, $backends); $this->assertArrayHasKey('identifier:\Foo\Bar', $backends); $this->assertArrayHasKey('identifier_real', $backends); $this->assertArrayNotHasKey('identifier_alias', $backends); } public function testBackendProvider() { $service = new BackendService($this->config, $this->l10n); $backend1 = $this->getBackendMock('\Foo\Bar'); $backend2 = $this->getBackendMock('\Bar\Foo'); $providerMock = $this->createMock(IBackendProvider::class); $providerMock->expects($this->once()) ->method('getBackends') ->willReturn([$backend1, $backend2]); $service->registerBackendProvider($providerMock); $this->assertEquals($backend1, $service->getBackend('identifier:\Foo\Bar')); $this->assertEquals($backend2, $service->getBackend('identifier:\Bar\Foo')); $this->assertCount(2, $service->getBackends()); } public function testAuthMechanismProvider() { $service = new BackendService($this->config, $this->l10n); $backend1 = $this->getAuthMechanismMock('\Foo\Bar'); $backend2 = $this->getAuthMechanismMock('\Bar\Foo'); $providerMock = $this->createMock(IAuthMechanismProvider::class); $providerMock->expects($this->once()) ->method('getAuthMechanisms') ->willReturn([$backend1, $backend2]); $service->registerAuthMechanismProvider($providerMock); $this->assertEquals($backend1, $service->getAuthMechanism('identifier:\Foo\Bar')); $this->assertEquals($backend2, $service->getAuthMechanism('identifier:\Bar\Foo')); $this->assertCount(2, $service->getAuthMechanisms()); } public function testMultipleBackendProviders() { $service = new BackendService($this->config, $this->l10n); $backend1a = $this->getBackendMock('\Foo\Bar'); $backend1b = $this->getBackendMock('\Bar\Foo'); $backend2 = $this->getBackendMock('\Dead\Beef'); $provider1Mock = $this->createMock(IBackendProvider::class); $provider1Mock->expects($this->once()) ->method('getBackends') ->willReturn([$backend1a, $backend1b]); $service->registerBackendProvider($provider1Mock); $provider2Mock = $this->createMock(IBackendProvider::class); $provider2Mock->expects($this->once()) ->method('getBackends') ->willReturn([$backend2]); $service->registerBackendProvider($provider2Mock); $this->assertEquals($backend1a, $service->getBackend('identifier:\Foo\Bar')); $this->assertEquals($backend1b, $service->getBackend('identifier:\Bar\Foo')); $this->assertEquals($backend2, $service->getBackend('identifier:\Dead\Beef')); $this->assertCount(3, $service->getBackends()); } public function testUserMountingBackends() { $this->config->expects($this->exactly(2)) ->method('getAppValue') ->will($this->returnValueMap([ ['files_external', 'allow_user_mounting', 'yes', 'yes'], ['files_external', 'user_mounting_backends', '', 'identifier:\User\Mount\Allowed,identifier_alias'] ])); $service = new BackendService($this->config, $this->l10n); $backendAllowed = $this->getBackendMock('\User\Mount\Allowed'); $backendAllowed->expects($this->never()) ->method('removeVisibility'); $backendNotAllowed = $this->getBackendMock('\User\Mount\NotAllowed'); $backendNotAllowed->expects($this->once()) ->method('removeVisibility') ->with(BackendService::VISIBILITY_PERSONAL); $backendAlias = $this->getMockBuilder(Backend::class) ->disableOriginalConstructor() ->getMock(); $backendAlias->method('getIdentifierAliases') ->willReturn(['identifier_real', 'identifier_alias']); $backendAlias->expects($this->never()) ->method('removeVisibility'); $service->registerBackend($backendAllowed); $service->registerBackend($backendNotAllowed); $service->registerBackend($backendAlias); } public function testGetAvailableBackends() { $service = new BackendService($this->config, $this->l10n); $backendAvailable = $this->getBackendMock('\Backend\Available'); $backendAvailable->expects($this->once()) ->method('checkDependencies') ->will($this->returnValue([])); $backendNotAvailable = $this->getBackendMock('\Backend\NotAvailable'); $backendNotAvailable->expects($this->once()) ->method('checkDependencies') ->will($this->returnValue([ $this->getMockBuilder('\OCA\Files_External\Lib\MissingDependency') ->disableOriginalConstructor() ->getMock() ])); $service->registerBackend($backendAvailable); $service->registerBackend($backendNotAvailable); $availableBackends = $service->getAvailableBackends(); $this->assertArrayHasKey('identifier:\Backend\Available', $availableBackends); $this->assertArrayNotHasKey('identifier:\Backend\NotAvailable', $availableBackends); } }