summaryrefslogtreecommitdiffstats
path: root/apps/files_external/tests
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2014-10-31 11:41:07 +0100
committerVincent Petry <pvince81@owncloud.com>2015-03-12 18:51:02 +0100
commitce94a998dd5a5801beef7874dd13752095e35de0 (patch)
tree8d91631f709549c40555dcb74e9976519f895ae2 /apps/files_external/tests
parent23cc3cc5f2f42166c37fbe03fa62d3dd1dbfe5ed (diff)
downloadnextcloud-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')
-rw-r--r--apps/files_external/tests/controller/globalstoragescontrollertest.php41
-rw-r--r--apps/files_external/tests/controller/storagescontrollertest.php217
-rw-r--r--apps/files_external/tests/controller/userstoragescontrollertest.php112
-rw-r--r--apps/files_external/tests/js/settingsSpec.js164
-rw-r--r--apps/files_external/tests/service/globalstoragesservicetest.php705
-rw-r--r--apps/files_external/tests/service/storagesservicetest.php180
-rw-r--r--apps/files_external/tests/service/userstoragesservicetest.php200
-rw-r--r--apps/files_external/tests/storageconfigtest.php50
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']);
+ }
+
+}