diff options
author | Roeland Jago Douma <rullzer@owncloud.com> | 2015-10-30 13:10:08 +0100 |
---|---|---|
committer | Roeland Jago Douma <rullzer@owncloud.com> | 2015-11-05 15:59:09 +0100 |
commit | 6624fa212a4627217c9c95771f7bb933baaddbc1 (patch) | |
tree | ad1b76abd52b609dc41f40cdc05cc0b316d34038 /tests/lib/share20 | |
parent | 8b5179459afe1a7355e48f60545bcb76f1cf4699 (diff) | |
download | nextcloud-server-6624fa212a4627217c9c95771f7bb933baaddbc1.tar.gz nextcloud-server-6624fa212a4627217c9c95771f7bb933baaddbc1.zip |
The new sharing code now handles deletion
OCS -> ShareManager -> DefaultShareProvider
Diffstat (limited to 'tests/lib/share20')
-rw-r--r-- | tests/lib/share20/defaultshareprovidertest.php | 543 | ||||
-rw-r--r-- | tests/lib/share20/managertest.php | 198 |
2 files changed, 741 insertions, 0 deletions
diff --git a/tests/lib/share20/defaultshareprovidertest.php b/tests/lib/share20/defaultshareprovidertest.php new file mode 100644 index 00000000000..bf8306bf26c --- /dev/null +++ b/tests/lib/share20/defaultshareprovidertest.php @@ -0,0 +1,543 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace Test\Share20; + +use OCP\IDBConnection; +use OCP\IUserManager; +use OCP\IGroupManager; +use OCP\Files\Folder; +use OC\Share20\DefaultShareProvider; + +class DefaultShareProviderTest extends \Test\TestCase { + + /** @var IDBConnection */ + protected $dbConn; + + /** @var IUserManager */ + protected $userManager; + + /** @var IGroupManager */ + protected $groupManager; + + /** @var Folder */ + protected $userFolder; + + /** @var DefaultShareProvider */ + protected $provider; + + public function setUp() { + $this->dbConn = \OC::$server->getDatabaseConnection(); + $this->userManager = $this->getMock('OCP\IUserManager'); + $this->groupManager = $this->getMock('OCP\IGroupManager'); + $this->userFolder = $this->getMock('OCP\Files\Folder'); + + //Empty share table + $this->dbConn->getQueryBuilder()->delete('share')->execute(); + + $this->provider = new DefaultShareProvider( + $this->dbConn, + $this->userManager, + $this->groupManager, + $this->userFolder + ); + } + + public function tearDown() { + $this->dbConn->getQueryBuilder()->delete('share')->execute(); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotExist() { + $this->provider->getShareById(1); + } + + public function testGetShareByIdUserShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IUser'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedWith', $sharedWith], + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_USER, $share->getShareType()); + $this->assertEquals($sharedWith, $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testGetShareByIdGroupShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_GROUP), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IGroup'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + $this->groupManager + ->expects($this->once()) + ->method('get') + ->with('sharedWith') + ->willReturn($sharedWith); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_GROUP, $share->getShareType()); + $this->assertEquals($sharedWith, $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testGetShareByIdLinkShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'token' => $qb->expr()->literal('token'), + 'expiration' => $qb->expr()->literal('2000-01-02 00:00:00'), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_LINK, $share->getShareType()); + $this->assertEquals('sharedWith', $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals('token', $share->getToken()); + $this->assertEquals(\DateTime::createFromFormat('Y-m-d H:i:s', '2000-01-02 00:00:00'), $share->getExpirationDate()); + } + + public function testGetShareByIdRemoteShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_REMOTE), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + + $this->assertEquals(1, $share->getId()); + $this->assertEquals(\OCP\Share::SHARE_TYPE_REMOTE, $share->getShareType()); + $this->assertEquals('sharedWith', $share->getSharedWith()); + $this->assertEquals($sharedBy, $share->getSharedBy()); + $this->assertEquals($shareOwner, $share->getShareOwner()); + $this->assertEquals($path, $share->getPath()); + $this->assertEquals(13, $share->getPermissions()); + $this->assertEquals(null, $share->getToken()); + $this->assertEquals(null, $share->getExpirationDate()); + } + + public function testDeleteSingleShare() { + $qb = $this->dbConn->getQueryBuilder(); + + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IUser'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedWith', $sharedWith], + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + $this->provider->delete($share); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share'); + + $cursor = $qb->execute(); + $result = $cursor->fetchAll(); + $cursor->closeCursor(); + + $this->assertEmpty($result); + } + + public function testDeleteSingleShareKeepOther() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(2), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->once()) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->once()) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->once()) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IUser'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedWith', $sharedWith], + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + $this->provider->delete($share); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share'); + + $cursor = $qb->execute(); + $result = $cursor->fetchAll(); + $cursor->closeCursor(); + + $this->assertCount(1, $result); + } + + public function testDeleteNestedShares() { + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(1), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith'), + 'uid_owner' => $qb->expr()->literal('sharedBy'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + ]); + $qb->execute(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(2), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith2'), + 'uid_owner' => $qb->expr()->literal('sharedBy2'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'parent' => $qb->expr()->literal(1), + ]); + $qb->execute(); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->insert('share') + ->values([ + 'id' => $qb->expr()->literal(3), + 'share_type' => $qb->expr()->literal(\OCP\Share::SHARE_TYPE_USER), + 'share_with' => $qb->expr()->literal('sharedWith2'), + 'uid_owner' => $qb->expr()->literal('sharedBy2'), + 'file_source' => $qb->expr()->literal(42), + 'permissions' => $qb->expr()->literal(13), + 'parent' => $qb->expr()->literal(2), + ]); + $qb->execute(); + + + $storage = $this->getMock('OC\Files\Storage\Storage'); + $storage + ->expects($this->exactly(3)) + ->method('getOwner') + ->willReturn('shareOwner'); + $path = $this->getMock('OCP\Files\Node'); + $path + ->expects($this->exactly(3)) + ->method('getStorage') + ->wilLReturn($storage); + $this->userFolder + ->expects($this->exactly(3)) + ->method('getById') + ->with(42) + ->willReturn([$path]); + + $sharedWith = $this->getMock('OCP\IUser'); + $sharedBy = $this->getMock('OCP\IUser'); + $shareOwner = $this->getMock('OCP\IUser'); + $this->userManager + ->method('get') + ->will($this->returnValueMap([ + ['sharedWith', $sharedWith], + ['sharedBy', $sharedBy], + ['shareOwner', $shareOwner], + ])); + + $share = $this->provider->getShareById(1); + $this->provider->delete($share); + + $qb = $this->dbConn->getQueryBuilder(); + $qb->select('*') + ->from('share'); + + $cursor = $qb->execute(); + $result = $cursor->fetchAll(); + $cursor->closeCursor(); + + $this->assertEmpty($result); + } + + /** + * @expectedException \OC\Share20\Exception\BackendError + */ + public function testDeleteFails() { + $share = $this->getMock('OC\Share20\IShare'); + $expr = $this->getMock('OCP\DB\QueryBuilder\IExpressionBuilder'); + $qb = $this->getMock('OCP\DB\QueryBuilder\IQueryBuilder'); + $qb->expects($this->once()) + ->method('delete') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('expr') + ->willReturn($expr); + $qb->expects($this->once()) + ->method('where') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('setParameter') + ->will($this->returnSelf()); + $qb->expects($this->once()) + ->method('execute') + ->will($this->throwException(new \Exception)); + + $db = $this->getMock('OCP\IDBConnection'); + $db->expects($this->once()) + ->method('getQueryBuilder') + ->with() + ->willReturn($qb); + + $provider = $this->getMockBuilder('OC\Share20\DefaultShareProvider') + ->setConstructorArgs([ + $db, + $this->userManager, + $this->groupManager, + $this->userFolder, + ] + ) + ->setMethods(['deleteChildren']) + ->getMock(); + $provider + ->expects($this->once()) + ->method('deleteChildren') + ->with($share); + + + $provider->delete($share); + } + +} diff --git a/tests/lib/share20/managertest.php b/tests/lib/share20/managertest.php new file mode 100644 index 00000000000..fc6c30692f5 --- /dev/null +++ b/tests/lib/share20/managertest.php @@ -0,0 +1,198 @@ +<?php +/** + * @author Roeland Jago Douma <rullzer@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License, version 3, + * along with this program. If not, see <http://www.gnu.org/licenses/> + * + */ +namespace Test\Share20; + +use OC\Share20\Manager; +use OC\Share20\Exception; + + +use OCP\IUser; +use OCP\IUserManager; +use OCP\IGroupManager; +use OCP\ILogger; +use OCP\IAppConfig; +use OCP\Files\Folder; +use OCP\Share20\IShareProvider; + +class ManagerTest extends \Test\TestCase { + + /** @var Manager */ + protected $manager; + + /** @var IUser */ + protected $user; + + /** @var IUserManager */ + protected $userManager; + + /** @var IGroupManager */ + protected $groupManager; + + /** @var ILogger */ + protected $logger; + + /** @var IAppConfig */ + protected $appConfig; + + /** @var Folder */ + protected $userFolder; + + /** @var IShareProvider */ + protected $defaultProvider; + + public function setUp() { + + $this->user = $this->getMock('\OCP\IUser'); + $this->userManager = $this->getMock('\OCP\IUserManager'); + $this->groupManager = $this->getMock('\OCP\IGroupManager'); + $this->logger = $this->getMock('\OCP\ILogger'); + $this->appConfig = $this->getMock('\OCP\IAppConfig'); + $this->userFolder = $this->getMock('\OCP\Files\Folder'); + $this->defaultProvider = $this->getMock('\OC\Share20\IShareProvider'); + + $this->manager = new Manager( + $this->user, + $this->userManager, + $this->groupManager, + $this->logger, + $this->appConfig, + $this->userFolder, + $this->defaultProvider + ); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testDeleteNoShareId() { + $share = $this->getMock('\OC\Share20\IShare'); + + $share + ->expects($this->once()) + ->method('getId') + ->with() + ->willReturn(null); + + $this->manager->deleteShare($share); + } + + public function testDelete() { + $share = $this->getMock('\OC\Share20\IShare'); + + $share + ->expects($this->once()) + ->method('getId') + ->with() + ->willReturn(42); + $this->defaultProvider + ->expects($this->once()) + ->method('delete') + ->with($share); + + $this->manager->deleteShare($share); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotFoundInBackend() { + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->will($this->throwException(new \OC\Share20\Exception\ShareNotFound())); + + $this->manager->getShareById(42); + } + + /** + * @expectedException OC\Share20\Exception\ShareNotFound + */ + public function testGetShareByIdNotAuthorized() { + $otherUser1 = $this->getMock('\OCP\IUser'); + $otherUser2 = $this->getMock('\OCP\IUser'); + $otherUser3 = $this->getMock('\OCP\IUser'); + + $share = $this->getMock('\OC\Share20\IShare'); + $share + ->expects($this->once()) + ->method('getSharedWith') + ->with() + ->willReturn($otherUser1); + $share + ->expects($this->once()) + ->method('getSharedBy') + ->with() + ->willReturn($otherUser2); + $share + ->expects($this->once()) + ->method('getShareOwner') + ->with() + ->willReturn($otherUser3); + + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + + $this->manager->getShareById(42); + } + + public function dataGetShareById() { + return [ + ['getSharedWith'], + ['getSharedBy'], + ['getShareOwner'], + ]; + } + + /** + * @dataProvider dataGetShareById + */ + public function testGetShareById($currentUserIs) { + $otherUser1 = $this->getMock('\OCP\IUser'); + $otherUser2 = $this->getMock('\OCP\IUser'); + $otherUser3 = $this->getMock('\OCP\IUser'); + + $share = $this->getMock('\OC\Share20\IShare'); + $share + ->method('getSharedWith') + ->with() + ->willReturn($currentUserIs === 'getSharedWith' ? $this->user : $otherUser1); + $share + ->method('getSharedBy') + ->with() + ->willReturn($currentUserIs === 'getSharedBy' ? $this->user : $otherUser2); + $share + ->method('getShareOwner') + ->with() + ->willReturn($currentUserIs === 'getShareOwner' ? $this->user : $otherUser3); + + $this->defaultProvider + ->expects($this->once()) + ->method('getShareById') + ->with(42) + ->willReturn($share); + + $this->assertEquals($share, $this->manager->getShareById(42)); + } +} |