diff options
author | Vincent Petry <pvince81@owncloud.com> | 2014-10-31 11:41:07 +0100 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2015-03-12 18:51:02 +0100 |
commit | ce94a998dd5a5801beef7874dd13752095e35de0 (patch) | |
tree | 8d91631f709549c40555dcb74e9976519f895ae2 /apps/files_external/tests | |
parent | 23cc3cc5f2f42166c37fbe03fa62d3dd1dbfe5ed (diff) | |
download | nextcloud-server-ce94a998dd5a5801beef7874dd13752095e35de0.tar.gz nextcloud-server-ce94a998dd5a5801beef7874dd13752095e35de0.zip |
Use storage id + appframework for ext storage CRUD
- Added StorageConfig class to replace ugly arrays
- Implemented StorageService and StorageController for Global and User
storages
- Async status checking for storages (from Xenopathic)
- Auto-generate id for external storage configs (not the same as
storage_id)
- Refactor JS classes for external storage settings, this mostly
moves/encapsulated existing global event handlers into the
MountConfigListView class.
- Added some JS unit tests for the external storage UI
Diffstat (limited to 'apps/files_external/tests')
8 files changed, 1669 insertions, 0 deletions
diff --git a/apps/files_external/tests/controller/globalstoragescontrollertest.php b/apps/files_external/tests/controller/globalstoragescontrollertest.php new file mode 100644 index 00000000000..7ba4d16a7e9 --- /dev/null +++ b/apps/files_external/tests/controller/globalstoragescontrollertest.php @@ -0,0 +1,41 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Controller; + +use \OCA\Files_external\Controller\GlobalStoragesController; +use \OCA\Files_external\Service\GlobalStoragesService; +use \OCP\AppFramework\Http; +use \OCA\Files_external\NotFoundException; + +class GlobalStoragesControllerTest extends StoragesControllerTest { + public function setUp() { + parent::setUp(); + $this->service = $this->getMock('\OCA\Files_external\Service\GlobalStoragesService'); + + $this->controller = new GlobalStoragesController( + 'files_external', + $this->getMock('\OCP\IRequest'), + $this->getMock('\OCP\IL10N'), + $this->service + ); + } +} diff --git a/apps/files_external/tests/controller/storagescontrollertest.php b/apps/files_external/tests/controller/storagescontrollertest.php new file mode 100644 index 00000000000..fefe2928d76 --- /dev/null +++ b/apps/files_external/tests/controller/storagescontrollertest.php @@ -0,0 +1,217 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Controller; + +use \OCP\AppFramework\Http; + +use \OCA\Files_external\Controller\GlobalStoragesController; +use \OCA\Files_external\Service\GlobalStoragesService; +use \OCA\Files_external\Lib\StorageConfig; +use \OCA\Files_external\NotFoundException; + +abstract class StoragesControllerTest extends \Test\TestCase { + + /** + * @var GlobalStoragesController + */ + protected $controller; + + /** + * @var GlobalStoragesService + */ + protected $service; + + public function setUp() { + \OC_Mount_Config::$skipTest = true; + } + + public function tearDown() { + \OC_Mount_Config::$skipTest = false; + } + + public function testAddStorage() { + $storageConfig = new StorageConfig(1); + $storageConfig->setMountPoint('mount'); + + $this->service->expects($this->once()) + ->method('addStorage') + ->will($this->returnValue($storageConfig)); + + $response = $this->controller->create( + 'mount', + '\OC\Files\Storage\SMB', + array(), + [], + [], + null + ); + + $data = $response->getData(); + $this->assertEquals($storageConfig, $data); + $this->assertEquals(Http::STATUS_CREATED, $response->getStatus()); + } + + public function testUpdateStorage() { + $storageConfig = new StorageConfig(1); + $storageConfig->setMountPoint('mount'); + + $this->service->expects($this->once()) + ->method('updateStorage') + ->will($this->returnValue($storageConfig)); + + $response = $this->controller->update( + 1, + 'mount', + '\OC\Files\Storage\SMB', + array(), + [], + [], + null + ); + + $data = $response->getData(); + $this->assertEquals($storageConfig, $data); + $this->assertEquals(Http::STATUS_OK, $response->getStatus()); + } + + function mountPointNamesProvider() { + return array( + array(''), + array('/'), + array('//'), + ); + } + + /** + * @dataProvider mountPointNamesProvider + */ + public function testAddOrUpdateStorageInvalidMountPoint($mountPoint) { + $this->service->expects($this->never()) + ->method('addStorage'); + $this->service->expects($this->never()) + ->method('updateStorage'); + + $response = $this->controller->create( + $mountPoint, + '\OC\Files\Storage\SMB', + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + + $response = $this->controller->update( + 1, + $mountPoint, + '\OC\Files\Storage\SMB', + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + } + + public function testAddOrUpdateStorageInvalidBackend() { + $this->service->expects($this->never()) + ->method('addStorage'); + $this->service->expects($this->never()) + ->method('updateStorage'); + + $response = $this->controller->create( + 'mount', + '\OC\Files\Storage\InvalidStorage', + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + + $response = $this->controller->update( + 1, + 'mount', + '\OC\Files\Storage\InvalidStorage', + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + } + + public function testUpdateStorageNonExisting() { + $this->service->expects($this->once()) + ->method('updateStorage') + ->will($this->throwException(new NotFoundException())); + + $response = $this->controller->update( + 255, + 'mount', + '\OC\Files\Storage\SMB', + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_NOT_FOUND, $response->getStatus()); + } + + public function testDeleteStorage() { + $this->service->expects($this->once()) + ->method('removeStorage'); + + $response = $this->controller->destroy(1); + $this->assertEquals(Http::STATUS_NO_CONTENT, $response->getStatus()); + } + + public function testDeleteStorageNonExisting() { + $this->service->expects($this->once()) + ->method('removeStorage') + ->will($this->throwException(new NotFoundException())); + + $response = $this->controller->destroy(255); + $this->assertEquals(Http::STATUS_NOT_FOUND, $response->getStatus()); + } + + public function testGetStorage() { + $storageConfig = new StorageConfig(1); + $storageConfig->setMountPoint('test'); + $storageConfig->setBackendClass('\OC\Files\Storage\SMB'); + $storageConfig->setBackendOptions(['user' => 'test', 'password', 'password123']); + + $this->service->expects($this->once()) + ->method('getStorage') + ->with(1) + ->will($this->returnValue($storageConfig)); + $response = $this->controller->show(1); + + $this->assertEquals(Http::STATUS_OK, $response->getStatus()); + $this->assertEquals($storageConfig, $response->getData()); + } +} diff --git a/apps/files_external/tests/controller/userstoragescontrollertest.php b/apps/files_external/tests/controller/userstoragescontrollertest.php new file mode 100644 index 00000000000..9d6fbb15e23 --- /dev/null +++ b/apps/files_external/tests/controller/userstoragescontrollertest.php @@ -0,0 +1,112 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Controller; + +use \OCA\Files_external\Controller\UserStoragesController; +use \OCA\Files_external\Service\UserStoragesService; +use \OCP\AppFramework\Http; +use \OCA\Files_external\NotFoundException; + +class UserStoragesControllerTest extends StoragesControllerTest { + + /** + * @var array + */ + private $oldAllowedBackends; + + public function setUp() { + parent::setUp(); + $this->service = $this->getMockBuilder('\OCA\Files_external\Service\UserStoragesService') + ->disableOriginalConstructor() + ->getMock(); + + $this->controller = new UserStoragesController( + 'files_external', + $this->getMock('\OCP\IRequest'), + $this->getMock('\OCP\IL10N'), + $this->service + ); + + $config = \OC::$server->getConfig(); + + $this->oldAllowedBackends = $config->getAppValue( + 'files_external', + 'user_mounting_backends', + '' + ); + $config->setAppValue( + 'files_external', + 'user_mounting_backends', + '\OC\Files\Storage\SMB' + ); + } + + public function tearDown() { + $config = \OC::$server->getConfig(); + $config->setAppValue( + 'files_external', + 'user_mounting_backends', + $this->oldAllowedBackends + ); + parent::tearDown(); + } + + function disallowedBackendClassProvider() { + return array( + array('\OC\Files\Storage\Local'), + array('\OC\Files\Storage\FTP'), + ); + } + /** + * @dataProvider disallowedBackendClassProvider + */ + public function testAddOrUpdateStorageDisallowedBackend($backendClass) { + $this->service->expects($this->never()) + ->method('addStorage'); + $this->service->expects($this->never()) + ->method('updateStorage'); + + $response = $this->controller->create( + 'mount', + $backendClass, + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + + $response = $this->controller->update( + 1, + 'mount', + $backendClass, + array(), + [], + [], + null + ); + + $this->assertEquals(Http::STATUS_UNPROCESSABLE_ENTITY, $response->getStatus()); + } + +} diff --git a/apps/files_external/tests/js/settingsSpec.js b/apps/files_external/tests/js/settingsSpec.js new file mode 100644 index 00000000000..350840e542c --- /dev/null +++ b/apps/files_external/tests/js/settingsSpec.js @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.External.Settings tests', function() { + var clock; + var select2Stub; + var select2ApplicableUsers; + + beforeEach(function() { + clock = sinon.useFakeTimers(); + select2Stub = sinon.stub($.fn, 'select2', function(args) { + if (args === 'val') { + return select2ApplicableUsers; + } + return { + on: function() {} + }; + }); + + // view still requires an existing DOM table + $('#testArea').append( + '<table id="externalStorage" data-admin="true">' + + '<thead></thead>' + + '<tbody>' + + '<tr id="addMountPoint" data-id="">' + + '<td class="status"></td>' + + '<td class="mountPoint"><input type="text" name="mountPoint"/></td>' + + '<td class="backend">' + + '<select class="selectBackend">' + + '<option disable selected>Add storage</option>' + + '<option value="\\OC\\TestBackend">Test Backend</option>' + + '<option value="\\OC\\AnotherTestBackend">Another Test Backend</option>' + + '</select>' + + '</td>' + + '<td class="configuration"></td>' + + '<td class="applicable">' + + '<input type="hidden" class="applicableUsers">' + + '</td>' + + '<td><img alt="Delete" title="Delete" class="svg action"/></td>' + + '</tr>' + + '</tbody>' + + '</table>' + ); + // these are usually appended into the data attribute + // within the DOM by the server template + $('#externalStorage .selectBackend:first').data('configurations', { + '\\OC\\TestBackend': { + 'backend': 'Test Backend Name', + 'configuration': { + 'field1': 'Display Name 1', + 'field2': '&Display Name 2' + } + }, + '\\OC\\AnotherTestBackend': { + 'backend': 'Another Test Backend Name', + 'configuration': { + 'field1': 'Display Name 1', + 'field2': '&Display Name 2' + } + } + } + ); + }); + afterEach(function() { + select2Stub.restore(); + clock.restore(); + }); + + describe('storage configuration', function() { + var view; + + function selectBackend(backendName) { + view.$el.find('.selectBackend:first').val('\\OC\\TestBackend').trigger('change'); + } + + beforeEach(function() { + var $el = $('#externalStorage'); + view = new OCA.External.Settings.MountConfigListView($el); + }); + afterEach(function() { + view = null; + }); + describe('selecting backend', function() { + it('populates the row and creates a new empty one', function() { + var $firstRow = view.$el.find('tr:first'); + selectBackend('\\OC\\TestBackend'); + expect($firstRow.find('.backend').text()).toEqual('Test Backend'); + expect($firstRow.find('.selectBackend').length).toEqual(0); + + // TODO: check "remove" button visibility + + // the suggested mount point name + expect($firstRow.find('[name=mountPoint]').val()).toEqual('TestBackend'); + + // TODO: check that the options have been created + + // TODO: check select2 call on the ".applicableUsers" element + + var $emptyRow = $firstRow.next('tr'); + expect($emptyRow.length).toEqual(1); + expect($emptyRow.find('.selectBackend').length).toEqual(1); + expect($emptyRow.find('.applicable select').length).toEqual(0); + + // TODO: check "remove" button visibility + }); + // TODO: test with personal mounts (no applicable fields) + // TODO: test suggested mount point logic + }); + describe('saving storages', function() { + it('saves storage after editing config', function() { + var $tr = view.$el.find('tr:first'); + selectBackend('\\OC\\TestBackend'); + + var $field1 = $tr.find('input[data-parameter=field1]'); + expect($field1.length).toEqual(1); + $field1.val('test'); + $field1.trigger(new $.Event('keyup', {keyCode: 97})); + + clock.tick(4000); + + expect(fakeServer.requests.length).toEqual(1); + var request = fakeServer.requests[0]; + expect(request.url).toEqual(OC.webroot + '/index.php/apps/files_external/globalstorages'); + expect(OC.parseQueryString(request.requestBody)).toEqual({ + backendClass: '\\OC\\TestBackend', + 'backendOptions[field1]': 'test', + 'backendOptions[field2]': '', + mountPoint: 'TestBackend' + }); + + // TODO: respond and check data-id + }); + // TODO: tests with "applicableUsers" and "applicableGroups" + // TODO: test with non-optional config parameters + // TODO: test with missing mount point value + // TODO: test with personal mounts (no applicable fields) + // TODO: test save triggers: paste, keyup, checkbox + // TODO: test "custom" field with addScript + // TODO: status indicator + }); + describe('update storage', function() { + // TODO + }); + describe('delete storage', function() { + // TODO + }); + describe('recheck storages', function() { + // TODO + }); + }); + describe('applicable user list', function() { + // TODO: test select2 retrieval logic + }); + describe('allow user mounts section', function() { + // TODO: test allowUserMounting section + }); +}); diff --git a/apps/files_external/tests/service/globalstoragesservicetest.php b/apps/files_external/tests/service/globalstoragesservicetest.php new file mode 100644 index 00000000000..6286865bf43 --- /dev/null +++ b/apps/files_external/tests/service/globalstoragesservicetest.php @@ -0,0 +1,705 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Service; + +use \OC\Files\Filesystem; + +use \OCA\Files_external\Service\GlobalStoragesService; +use \OCA\Files_external\NotFoundException; +use \OCA\Files_external\Lib\StorageConfig; + +class GlobalStoragesServiceTest extends StoragesServiceTest { + public function setUp() { + parent::setUp(); + $this->service = new GlobalStoragesService(); + } + + public function tearDown() { + @unlink($this->dataDir . '/mount.json'); + parent::tearDown(); + } + + protected function makeTestStorageData() { + return $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => [], + 'applicableGroups' => [], + 'priority' => 15, + ]); + } + + function storageDataProvider() { + return [ + // all users + [ + $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => [], + 'applicableGroups' => [], + 'priority' => 15, + ]), + ], + // some users + [ + $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => ['user1', 'user2'], + 'applicableGroups' => [], + 'priority' => 15, + ]), + ], + // some groups + [ + $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => [], + 'applicableGroups' => ['group1', 'group2'], + 'priority' => 15, + ]), + ], + // both users and groups + [ + $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => ['user1', 'user2'], + 'applicableGroups' => ['group1', 'group2'], + 'priority' => 15, + ]), + ], + ]; + } + + /** + * @dataProvider storageDataProvider + */ + public function testAddStorage($storage) { + $newStorage = $this->service->addStorage($storage); + + $this->assertEquals(1, $newStorage->getId()); + + + $newStorage = $this->service->getStorage(1); + + $this->assertEquals($storage->getMountPoint(), $newStorage->getMountPoint()); + $this->assertEquals($storage->getBackendClass(), $newStorage->getBackendClass()); + $this->assertEquals($storage->getBackendOptions(), $newStorage->getBackendOptions()); + $this->assertEquals($storage->getApplicableUsers(), $newStorage->getApplicableUsers()); + $this->assertEquals($storage->getApplicableGroups(), $newStorage->getApplicableGroups()); + $this->assertEquals($storage->getPriority(), $newStorage->getPriority()); + $this->assertEquals(1, $newStorage->getId()); + $this->assertEquals(0, $newStorage->getStatus()); + + // next one gets id 2 + $nextStorage = $this->service->addStorage($storage); + $this->assertEquals(2, $nextStorage->getId()); + } + + /** + * @dataProvider storageDataProvider + */ + public function testUpdateStorage($updatedStorage) { + $storage = $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + 'applicableUsers' => [], + 'applicableGroups' => [], + 'priority' => 15, + ]); + + $newStorage = $this->service->addStorage($storage); + $this->assertEquals(1, $newStorage->getId()); + + $updatedStorage->setId(1); + + $this->service->updateStorage($updatedStorage); + $newStorage = $this->service->getStorage(1); + + $this->assertEquals($updatedStorage->getMountPoint(), $newStorage->getMountPoint()); + $this->assertEquals($updatedStorage->getBackendOptions()['password'], $newStorage->getBackendOptions()['password']); + $this->assertEquals($updatedStorage->getApplicableUsers(), $newStorage->getApplicableUsers()); + $this->assertEquals($updatedStorage->getApplicableGroups(), $newStorage->getApplicableGroups()); + $this->assertEquals($updatedStorage->getPriority(), $newStorage->getPriority()); + $this->assertEquals(1, $newStorage->getId()); + $this->assertEquals(0, $newStorage->getStatus()); + } + + function hooksAddStorageDataProvider() { + return [ + // applicable all + [ + [], + [], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'all' + ], + ], + ], + // single user + [ + ['user1'], + [], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + ], + ], + // single group + [ + [], + ['group1'], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1', + ], + ], + ], + // multiple users + [ + ['user1', 'user2'], + [], + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + ], + ], + // multiple groups + [ + [], + ['group1', 'group2'], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1' + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + // mixed groups and users + [ + ['user1', 'user2'], + ['group1', 'group2'], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1' + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + ]; + } + + /** + * @dataProvider hooksAddStorageDataProvider + */ + public function testHooksAddStorage($applicableUsers, $applicableGroups, $expectedCalls) { + $storage = $this->makeTestStorageData(); + $storage->setApplicableUsers($applicableUsers); + $storage->setApplicableGroups($applicableGroups); + $this->service->addStorage($storage); + + $this->assertCount(count($expectedCalls), self::$hookCalls); + + foreach ($expectedCalls as $index => $call) { + $this->assertHookCall( + self::$hookCalls[$index], + $call[0], + $storage->getMountPoint(), + $call[1], + $call[2] + ); + } + } + + function hooksUpdateStorageDataProvider() { + return [ + [ + // nothing to multiple users and groups + [], + [], + ['user1', 'user2'], + ['group1', 'group2'], + // expected hook calls + [ + // delete the "all entry" + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'all', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1' + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + [ + // adding a user and a group + ['user1'], + ['group1'], + ['user1', 'user2'], + ['group1', 'group2'], + // expected hook calls + [ + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + [ + // removing a user and a group + ['user1', 'user2'], + ['group1', 'group2'], + ['user1'], + ['group1'], + // expected hook calls + [ + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + [ + // removing all + ['user1'], + ['group1'], + [], + [], + // expected hook calls + [ + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1' + ], + // create the "all" entry + [ + Filesystem::signal_create_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'all' + ], + ], + ], + [ + // no changes + ['user1'], + ['group1'], + ['user1'], + ['group1'], + // no hook calls + [] + ] + ]; + } + + /** + * @dataProvider hooksUpdateStorageDataProvider + */ + public function testHooksUpdateStorage( + $sourceApplicableUsers, + $sourceApplicableGroups, + $updatedApplicableUsers, + $updatedApplicableGroups, + $expectedCalls) { + + $storage = $this->makeTestStorageData(); + $storage->setApplicableUsers($sourceApplicableUsers); + $storage->setApplicableGroups($sourceApplicableGroups); + $storage = $this->service->addStorage($storage); + + $storage->setapplicableUsers($updatedApplicableUsers); + $storage->setapplicableGroups($updatedApplicableGroups); + + // reset calls + self::$hookCalls = []; + + $this->service->updateStorage($storage); + + $this->assertCount(count($expectedCalls), self::$hookCalls); + + foreach ($expectedCalls as $index => $call) { + $this->assertHookCall( + self::$hookCalls[$index], + $call[0], + '/mountpoint', + $call[1], + $call[2] + ); + } + } + + /** + */ + public function testHooksRenameMountPoint() { + $storage = $this->makeTestStorageData(); + $storage->setApplicableUsers(['user1', 'user2']); + $storage->setApplicableGroups(['group1', 'group2']); + $storage = $this->service->addStorage($storage); + + $storage->setMountPoint('renamedMountpoint'); + + // reset calls + self::$hookCalls = []; + + $this->service->updateStorage($storage); + + $expectedCalls = [ + // deletes old mount + [ + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1', + ], + [ + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2', + ], + // creates new one + [ + Filesystem::signal_create_mount, + '/renamedMountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_create_mount, + '/renamedMountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_create_mount, + '/renamedMountpoint', + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1', + ], + [ + Filesystem::signal_create_mount, + '/renamedMountpoint', + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2', + ], + ]; + + $this->assertCount(count($expectedCalls), self::$hookCalls); + + foreach ($expectedCalls as $index => $call) { + $this->assertHookCall( + self::$hookCalls[$index], + $call[0], + $call[1], + $call[2], + $call[3] + ); + } + } + + function hooksDeleteStorageDataProvider() { + return [ + [ + ['user1', 'user2'], + ['group1', 'group2'], + // expected hook calls + [ + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user1', + ], + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'user2', + ], + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group1' + ], + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_GROUP, + 'group2' + ], + ], + ], + [ + // deleting "all" entry + [], + [], + [ + [ + Filesystem::signal_delete_mount, + \OC_Mount_Config::MOUNT_TYPE_USER, + 'all', + ], + ], + ], + ]; + } + + /** + * @dataProvider hooksDeleteStorageDataProvider + */ + public function testHooksDeleteStorage( + $sourceApplicableUsers, + $sourceApplicableGroups, + $expectedCalls) { + + $storage = $this->makeTestStorageData(); + $storage->setApplicableUsers($sourceApplicableUsers); + $storage->setApplicableGroups($sourceApplicableGroups); + $storage = $this->service->addStorage($storage); + + // reset calls + self::$hookCalls = []; + + $this->service->removeStorage($storage->getId()); + + $this->assertCount(count($expectedCalls), self::$hookCalls); + + foreach ($expectedCalls as $index => $call) { + $this->assertHookCall( + self::$hookCalls[$index], + $call[0], + '/mountpoint', + $call[1], + $call[2] + ); + } + } + + /** + * Make sure it uses the correct format when reading/writing + * the legacy config + */ + public function testLegacyConfigConversionApplicableAll() { + $configFile = $this->dataDir . '/mount.json'; + + $storage = $this->makeTestStorageData(); + $storage = $this->service->addStorage($storage); + + $json = json_decode(file_get_contents($configFile), true); + + $this->assertCount(1, $json); + + $this->assertEquals([\OC_Mount_Config::MOUNT_TYPE_USER], array_keys($json)); + $this->assertEquals(['all'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER])); + + $mountPointData = $json[\OC_Mount_config::MOUNT_TYPE_USER]['all']; + $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData)); + + $mountPointOptions = current($mountPointData); + $this->assertEquals(1, $mountPointOptions['id']); + $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']); + $this->assertEquals(15, $mountPointOptions['priority']); + + $backendOptions = $mountPointOptions['options']; + $this->assertEquals('value1', $backendOptions['option1']); + $this->assertEquals('value2', $backendOptions['option2']); + $this->assertEquals('', $backendOptions['password']); + $this->assertNotEmpty($backendOptions['password_encrypted']); + } + + /** + * Make sure it uses the correct format when reading/writing + * the legacy config + */ + public function testLegacyConfigConversionApplicableUserAndGroup() { + $configFile = $this->dataDir . '/mount.json'; + + $storage = $this->makeTestStorageData(); + $storage->setApplicableUsers(['user1', 'user2']); + $storage->setApplicableGroups(['group1', 'group2']); + + $storage = $this->service->addStorage($storage); + + $json = json_decode(file_get_contents($configFile), true); + + $this->assertCount(2, $json); + + $this->assertTrue(isset($json[\OC_Mount_Config::MOUNT_TYPE_USER])); + $this->assertTrue(isset($json[\OC_Mount_Config::MOUNT_TYPE_GROUP])); + $this->assertEquals(['user1', 'user2'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER])); + $this->assertEquals(['group1', 'group2'], array_keys($json[\OC_Mount_config::MOUNT_TYPE_GROUP])); + + // check that all options are the same for both users and both groups + foreach ($json[\OC_Mount_Config::MOUNT_TYPE_USER] as $mountPointData) { + $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData)); + + $mountPointOptions = current($mountPointData); + + $this->assertEquals(1, $mountPointOptions['id']); + $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']); + $this->assertEquals(15, $mountPointOptions['priority']); + + $backendOptions = $mountPointOptions['options']; + $this->assertEquals('value1', $backendOptions['option1']); + $this->assertEquals('value2', $backendOptions['option2']); + $this->assertEquals('', $backendOptions['password']); + $this->assertNotEmpty($backendOptions['password_encrypted']); + } + + foreach ($json[\OC_Mount_Config::MOUNT_TYPE_GROUP] as $mountPointData) { + $this->assertEquals(['/$user/files/mountpoint'], array_keys($mountPointData)); + + $mountPointOptions = current($mountPointData); + + $this->assertEquals(1, $mountPointOptions['id']); + $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']); + $this->assertEquals(15, $mountPointOptions['priority']); + + $backendOptions = $mountPointOptions['options']; + $this->assertEquals('value1', $backendOptions['option1']); + $this->assertEquals('value2', $backendOptions['option2']); + $this->assertEquals('', $backendOptions['password']); + $this->assertNotEmpty($backendOptions['password_encrypted']); + } + } + +} diff --git a/apps/files_external/tests/service/storagesservicetest.php b/apps/files_external/tests/service/storagesservicetest.php new file mode 100644 index 00000000000..1e338b3948d --- /dev/null +++ b/apps/files_external/tests/service/storagesservicetest.php @@ -0,0 +1,180 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Service; + +use \OC\Files\Filesystem; + +use \OCA\Files_external\NotFoundException; +use \OCA\Files_external\Lib\StorageConfig; + +abstract class StoragesServiceTest extends \Test\TestCase { + + /** + * @var StoragesService + */ + protected $service; + + /** + * Data directory + * + * @var string + */ + protected $dataDir; + + /** + * Hook calls + * + * @var array + */ + protected static $hookCalls; + + public function setUp() { + self::$hookCalls = array(); + $config = \OC::$server->getConfig(); + $this->dataDir = $config->getSystemValue( + 'datadirectory', + \OC::$SERVERROOT . '/data/' + ); + \OC_Mount_Config::$skipTest = true; + + \OCP\Util::connectHook( + Filesystem::CLASSNAME, + Filesystem::signal_create_mount, + get_class($this), 'createHookCallback'); + \OCP\Util::connectHook( + Filesystem::CLASSNAME, + Filesystem::signal_delete_mount, + get_class($this), 'deleteHookCallback'); + + } + + public function tearDown() { + \OC_Mount_Config::$skipTest = false; + self::$hookCalls = array(); + } + + /** + * Creates a StorageConfig instance based on array data + * + * @param array data + * + * @return StorageConfig storage config instance + */ + protected function makeStorageConfig($data) { + $storage = new StorageConfig(); + if (isset($data['id'])) { + $storage->setId($data['id']); + } + $storage->setMountPoint($data['mountPoint']); + $storage->setBackendClass($data['backendClass']); + $storage->setBackendOptions($data['backendOptions']); + if (isset($data['applicableUsers'])) { + $storage->setApplicableUsers($data['applicableUsers']); + } + if (isset($data['applicableGroups'])) { + $storage->setApplicableGroups($data['applicableGroups']); + } + if (isset($data['priority'])) { + $storage->setPriority($data['priority']); + } + return $storage; + } + + + /** + * @expectedException \OCA\Files_external\NotFoundException + */ + public function testNonExistingStorage() { + $storage = new StorageConfig(255); + $storage->setMountPoint('mountpoint'); + $storage->setBackendClass('\OC\Files\Storage\SMB'); + $this->service->updateStorage($storage); + } + + public function testDeleteStorage() { + $storage = new StorageConfig(255); + $storage->setMountPoint('mountpoint'); + $storage->setBackendClass('\OC\Files\Storage\SMB'); + $storage->setBackendOptions(['password' => 'testPassword']); + + $newStorage = $this->service->addStorage($storage); + $this->assertEquals(1, $newStorage->getId()); + + $newStorage = $this->service->removeStorage(1); + + $caught = false; + try { + $this->service->getStorage(1); + } catch (NotFoundException $e) { + $caught = true; + } + + $this->assertTrue($caught); + } + + /** + * @expectedException \OCA\Files_external\NotFoundException + */ + public function testDeleteUnexistingStorage() { + $this->service->removeStorage(255); + } + + public static function createHookCallback($params) { + self::$hookCalls[] = array( + 'signal' => Filesystem::signal_create_mount, + 'params' => $params + ); + } + + public static function deleteHookCallback($params) { + self::$hookCalls[] = array( + 'signal' => Filesystem::signal_delete_mount, + 'params' => $params + ); + } + + /** + * Asserts hook call + * + * @param array $callData hook call data to check + * @param string $signal signal name + * @param string $mountPath mount path + * @param string $mountType mount type + * @param string $applicable applicable users + */ + protected function assertHookCall($callData, $signal, $mountPath, $mountType, $applicable) { + $this->assertEquals($signal, $callData['signal']); + $params = $callData['params']; + $this->assertEquals( + $mountPath, + $params[Filesystem::signal_param_path] + ); + $this->assertEquals( + $mountType, + $params[Filesystem::signal_param_mount_type] + ); + $this->assertEquals( + $applicable, + $params[Filesystem::signal_param_users] + ); + } +} diff --git a/apps/files_external/tests/service/userstoragesservicetest.php b/apps/files_external/tests/service/userstoragesservicetest.php new file mode 100644 index 00000000000..64d59dc7d03 --- /dev/null +++ b/apps/files_external/tests/service/userstoragesservicetest.php @@ -0,0 +1,200 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files_external\Tests\Service; + +use \OC\Files\Filesystem; + +use \OCA\Files_external\Service\UserStoragesService; +use \OCA\Files_external\NotFoundException; +use \OCA\Files_external\Lib\StorageConfig; + +class UserStoragesServiceTest extends StoragesServiceTest { + + public function setUp() { + parent::setUp(); + + $this->userId = $this->getUniqueID('user_'); + + $this->user = new \OC\User\User($this->userId, null); + $userSession = $this->getMock('\OCP\IUserSession'); + $userSession + ->expects($this->any()) + ->method('getUser') + ->will($this->returnValue($this->user)); + + $this->service = new UserStoragesService($userSession); + + // create home folder + mkdir($this->dataDir . '/' . $this->userId . '/'); + } + + public function tearDown() { + @unlink($this->dataDir . '/' . $this->userId . '/mount.json'); + parent::tearDown(); + } + + private function makeTestStorageData() { + return $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + ]); + } + + public function testAddStorage() { + $storage = $this->makeTestStorageData(); + + $newStorage = $this->service->addStorage($storage); + + $this->assertEquals(1, $newStorage->getId()); + + $newStorage = $this->service->getStorage(1); + + $this->assertEquals($storage->getMountPoint(), $newStorage->getMountPoint()); + $this->assertEquals($storage->getBackendClass(), $newStorage->getBackendClass()); + $this->assertEquals($storage->getBackendOptions(), $newStorage->getBackendOptions()); + $this->assertEquals(1, $newStorage->getId()); + $this->assertEquals(0, $newStorage->getStatus()); + + // hook called once for user + $this->assertHookCall( + current(self::$hookCalls), + Filesystem::signal_create_mount, + $storage->getMountPoint(), + \OC_Mount_Config::MOUNT_TYPE_USER, + $this->userId + ); + + // next one gets id 2 + $nextStorage = $this->service->addStorage($storage); + $this->assertEquals(2, $nextStorage->getId()); + } + + public function testUpdateStorage() { + $storage = $this->makeStorageConfig([ + 'mountPoint' => 'mountpoint', + 'backendClass' => '\OC\Files\Storage\SMB', + 'backendOptions' => [ + 'option1' => 'value1', + 'option2' => 'value2', + 'password' => 'testPassword', + ], + ]); + + $newStorage = $this->service->addStorage($storage); + $this->assertEquals(1, $newStorage->getId()); + + $backendOptions = $newStorage->getBackendOptions(); + $backendOptions['password'] = 'anotherPassword'; + $newStorage->setBackendOptions($backendOptions); + + self::$hookCalls = []; + + $newStorage = $this->service->updateStorage($newStorage); + + $this->assertEquals('anotherPassword', $newStorage->getBackendOptions()['password']); + // these attributes are unused for user storages + $this->assertEmpty($newStorage->getApplicableUsers()); + $this->assertEmpty($newStorage->getApplicableGroups()); + $this->assertEquals(1, $newStorage->getId()); + $this->assertEquals(0, $newStorage->getStatus()); + + // no hook calls + $this->assertEmpty(self::$hookCalls); + } + + public function testDeleteStorage() { + parent::testDeleteStorage(); + + // hook called once for user (first one was during test creation) + $this->assertHookCall( + self::$hookCalls[1], + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + $this->userId + ); + } + + public function testHooksRenameMountPoint() { + $storage = $this->makeTestStorageData(); + $storage = $this->service->addStorage($storage); + + $storage->setMountPoint('renamedMountpoint'); + + // reset calls + self::$hookCalls = []; + + $this->service->updateStorage($storage); + + // hook called twice + $this->assertHookCall( + self::$hookCalls[0], + Filesystem::signal_delete_mount, + '/mountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + $this->userId + ); + $this->assertHookCall( + self::$hookCalls[1], + Filesystem::signal_create_mount, + '/renamedMountpoint', + \OC_Mount_Config::MOUNT_TYPE_USER, + $this->userId + ); + } + + /** + * Make sure it uses the correct format when reading/writing + * the legacy config + */ + public function testLegacyConfigConversion() { + $configFile = $this->dataDir . '/' . $this->userId . '/mount.json'; + + $storage = $this->makeTestStorageData(); + $storage = $this->service->addStorage($storage); + + $json = json_decode(file_get_contents($configFile), true); + + $this->assertCount(1, $json); + + $this->assertEquals([\OC_Mount_Config::MOUNT_TYPE_USER], array_keys($json)); + $this->assertEquals([$this->userId], array_keys($json[\OC_Mount_config::MOUNT_TYPE_USER])); + + $mountPointData = $json[\OC_Mount_config::MOUNT_TYPE_USER][$this->userId]; + $this->assertEquals(['/' . $this->userId . '/files/mountpoint'], array_keys($mountPointData)); + + $mountPointOptions = current($mountPointData); + $this->assertEquals(1, $mountPointOptions['id']); + $this->assertEquals('\OC\Files\Storage\SMB', $mountPointOptions['class']); + + $backendOptions = $mountPointOptions['options']; + $this->assertEquals('value1', $backendOptions['option1']); + $this->assertEquals('value2', $backendOptions['option2']); + $this->assertEquals('', $backendOptions['password']); + $this->assertNotEmpty($backendOptions['password_encrypted']); + } +} diff --git a/apps/files_external/tests/storageconfigtest.php b/apps/files_external/tests/storageconfigtest.php new file mode 100644 index 00000000000..473dc20b387 --- /dev/null +++ b/apps/files_external/tests/storageconfigtest.php @@ -0,0 +1,50 @@ +<?php +/** + * ownCloud + * + * @author Vincent Petry + * Copyright (c) 2015 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library 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 library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_external\Tests; + +use \OCA\Files_external\Lib\StorageConfig; + +class StorageConfigTest extends \Test\TestCase { + + public function testJsonSerialization() { + $storageConfig = new StorageConfig(1); + $storageConfig->setMountPoint('test'); + $storageConfig->setBackendClass('\OC\Files\Storage\SMB'); + $storageConfig->setBackendOptions(['user' => 'test', 'password' => 'password123']); + $storageConfig->setPriority(128); + $storageConfig->setApplicableUsers(['user1', 'user2']); + $storageConfig->setApplicableGroups(['group1', 'group2']); + + $json = $storageConfig->jsonSerialize(); + + $this->assertEquals(1, $json['id']); + $this->assertEquals('/test', $json['mountPoint']); + $this->assertEquals('\OC\Files\Storage\SMB', $json['backendClass']); + $this->assertEquals('test', $json['backendOptions']['user']); + $this->assertEquals('password123', $json['backendOptions']['password']); + $this->assertEquals(128, $json['priority']); + $this->assertEquals(['user1', 'user2'], $json['applicableUsers']); + $this->assertEquals(['group1', 'group2'], $json['applicableGroups']); + } + +} |