]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add unit tests for getting shares including subfiles
authorDaniel Calviño Sánchez <danxuliu@gmail.com>
Fri, 25 Oct 2019 04:31:40 +0000 (06:31 +0200)
committerDaniel Calviño Sánchez <danxuliu@gmail.com>
Fri, 25 Oct 2019 19:27:30 +0000 (21:27 +0200)
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
apps/files_sharing/tests/Controller/ShareAPIControllerTest.php

index 5a84897fe91737fbed7233e9c6fb5b56139a58fe..5fd5e7c4a46774b4e1b09b32b55fa25b8fb79241 100644 (file)
@@ -784,6 +784,427 @@ class ShareAPIControllerTest extends TestCase {
                $this->ocs->getShare(42);
        }
 
+       public function dataGetShares() {
+               $folder = $this->getMockBuilder(Folder::class)->getMock();
+               $file1 = $this->getMockBuilder(File::class)->getMock();
+               $file1->method('getName')
+                       ->willReturn('file1');
+               $file2 = $this->getMockBuilder(File::class)->getMock();
+               $file2->method('getName')
+                       ->willReturn('file2');
+
+               $folder->method('getDirectoryListing')
+                       ->willReturn([$file1, $file2]);
+
+               $file1UserShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1UserShareOwner->setShareType(IShare::TYPE_USER)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(4);
+
+               $file1UserShareOwnerExpected = [
+                       'id' => 4,
+                       'share_type' => IShare::TYPE_USER,
+               ];
+
+               $file1UserShareInitiator = \OC::$server->getShareManager()->newShare();
+               $file1UserShareInitiator->setShareType(IShare::TYPE_USER)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('currentUser')
+                       ->setShareOwner('owner')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(8);
+
+               $file1UserShareInitiatorExpected = [
+                       'id' => 8,
+                       'share_type' => IShare::TYPE_USER,
+               ];
+
+               $file1UserShareRecipient = \OC::$server->getShareManager()->newShare();
+               $file1UserShareRecipient->setShareType(IShare::TYPE_USER)
+                       ->setSharedWith('currentUser')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('owner')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(15);
+
+               $file1UserShareOther = \OC::$server->getShareManager()->newShare();
+               $file1UserShareOther->setShareType(IShare::TYPE_USER)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('owner')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(16);
+
+               $file1UserShareOtherExpected = [
+                       'id' => 16,
+                       'share_type' => IShare::TYPE_USER,
+               ];
+
+               $file1GroupShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1GroupShareOwner->setShareType(IShare::TYPE_GROUP)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(23);
+
+               $file1GroupShareOwnerExpected = [
+                       'id' => 23,
+                       'share_type' => IShare::TYPE_GROUP,
+               ];
+
+               $file1GroupShareRecipient = \OC::$server->getShareManager()->newShare();
+               $file1GroupShareRecipient->setShareType(IShare::TYPE_GROUP)
+                       ->setSharedWith('currentUserGroup')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('owner')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(42);
+
+               $file1GroupShareRecipientExpected = [
+                       'id' => 42,
+                       'share_type' => IShare::TYPE_GROUP,
+               ];
+
+               $file1GroupShareOther = \OC::$server->getShareManager()->newShare();
+               $file1GroupShareOther->setShareType(IShare::TYPE_GROUP)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('owner')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(108);
+
+               $file1LinkShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1LinkShareOwner->setShareType(IShare::TYPE_LINK)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(415);
+
+               $file1LinkShareOwnerExpected = [
+                       'id' => 415,
+                       'share_type' => IShare::TYPE_LINK,
+               ];
+
+               $file1EmailShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1EmailShareOwner->setShareType(IShare::TYPE_EMAIL)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(416);
+
+               $file1EmailShareOwnerExpected = [
+                       'id' => 416,
+                       'share_type' => IShare::TYPE_EMAIL,
+               ];
+
+               $file1RoomShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1RoomShareOwner->setShareType(IShare::TYPE_ROOM)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(423);
+
+               $file1RoomShareOwnerExpected = [
+                       'id' => 423,
+                       'share_type' => IShare::TYPE_ROOM,
+               ];
+
+               $file1RemoteShareOwner = \OC::$server->getShareManager()->newShare();
+               $file1RemoteShareOwner->setShareType(IShare::TYPE_REMOTE)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file1)
+                       ->setId(442);
+
+               $file1RemoteShareOwnerExpected = [
+                       'id' => 442,
+                       'share_type' => IShare::TYPE_REMOTE,
+               ];
+
+               $file2UserShareOwner = \OC::$server->getShareManager()->newShare();
+               $file2UserShareOwner->setShareType(IShare::TYPE_USER)
+                       ->setSharedWith('recipient')
+                       ->setSharedBy('initiator')
+                       ->setShareOwner('currentUser')
+                       ->setPermissions(\OCP\Constants::PERMISSION_READ)
+                       ->setNode($file2)
+                       ->setId(815);
+
+               $file2UserShareOwnerExpected = [
+                       'id' => 815,
+                       'share_type' => IShare::TYPE_USER,
+               ];
+
+               $data = [
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner],
+                                       ],
+                                       'file2' => [
+                                               IShare::TYPE_USER => [$file2UserShareOwner],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected,
+                                       $file2UserShareOwnerExpected,
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner, $file1UserShareOwner, $file1UserShareOwner],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected,
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner, $file1UserShareRecipient],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareRecipient, $file1UserShareInitiator, $file1UserShareOther],
+                                       ],
+                                       'file2' => [
+                                               IShare::TYPE_USER => [$file2UserShareOwner],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareInitiatorExpected,
+                                       $file1UserShareOtherExpected,
+                                       $file2UserShareOwnerExpected,
+                               ]
+                       ],
+                       // This might not happen in a real environment, as the combination
+                       // of shares does not seem to be possible on a folder without
+                       // resharing rights; if the folder has resharing rights then the
+                       // share with others would be included too in the results.
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareRecipient, $file1UserShareInitiator, $file1UserShareOther],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareInitiatorExpected,
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner],
+                                               IShare::TYPE_GROUP => [$file1GroupShareRecipient],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected,
+                                       $file1GroupShareRecipientExpected,
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner],
+                                               IShare::TYPE_GROUP => [$file1GroupShareOwner],
+                                               IShare::TYPE_LINK => [$file1LinkShareOwner],
+                                               IShare::TYPE_EMAIL => [$file1EmailShareOwner],
+                                               IShare::TYPE_ROOM => [$file1RoomShareOwner],
+                                               IShare::TYPE_REMOTE => [$file1RemoteShareOwner],
+                                       ],
+                               ],
+                               [
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected,
+                                       $file1GroupShareOwnerExpected,
+                                       $file1LinkShareOwnerExpected,
+                                       $file1RoomShareOwnerExpected,
+                               ]
+                       ],
+                       [
+                               [
+                                       'path' => $folder,
+                                       'subfiles' => 'true',
+                               ],
+                               [
+                                       'file1' => [
+                                               IShare::TYPE_USER => [$file1UserShareOwner],
+                                               IShare::TYPE_GROUP => [$file1GroupShareOwner],
+                                               IShare::TYPE_LINK => [$file1LinkShareOwner],
+                                               IShare::TYPE_EMAIL => [$file1EmailShareOwner],
+                                               IShare::TYPE_ROOM => [$file1RoomShareOwner],
+                                               IShare::TYPE_REMOTE => [$file1RemoteShareOwner],
+                                       ],
+                               ],
+                               [
+                                       IShare::TYPE_EMAIL => true,
+                                       IShare::TYPE_REMOTE => true,
+                               ],
+                               [
+                                       $file1UserShareOwnerExpected,
+                                       $file1GroupShareOwnerExpected,
+                                       $file1LinkShareOwnerExpected,
+                                       $file1EmailShareOwnerExpected,
+                                       $file1RemoteShareOwnerExpected,
+                                       $file1RoomShareOwnerExpected,
+                               ]
+                       ],
+               ];
+
+               return $data;
+       }
+
+       /**
+        * @dataProvider dataGetShares
+        */
+       public function testGetShares(array $getSharesParameters, array $shares, array $extraShareTypes, array $expected) {
+               /** @var \OCA\Files_Sharing\Controller\ShareAPIController $ocs */
+               $ocs = $this->getMockBuilder(ShareAPIController::class)
+                       ->setConstructorArgs([
+                               $this->appName,
+                               $this->request,
+                               $this->shareManager,
+                               $this->groupManager,
+                               $this->userManager,
+                               $this->rootFolder,
+                               $this->urlGenerator,
+                               $this->currentUser,
+                               $this->l,
+                               $this->config,
+                               $this->appManager,
+                               $this->serverContainer
+                       ])->setMethods(['formatShare'])
+                       ->getMock();
+
+               $ocs->method('formatShare')
+                       ->will($this->returnCallback(
+                               function($share) {
+                                       return [
+                                               'id' => $share->getId(),
+                                               'share_type' => $share->getShareType()
+                                       ];
+                               }
+                       ));
+
+               $userFolder = $this->getMockBuilder('OCP\Files\Folder')->getMock();
+               $userFolder->method('get')
+                       ->with('path')
+                       ->willReturn($getSharesParameters['path']);
+
+               $this->rootFolder->method('getUserFolder')
+                       ->with($this->currentUser)
+                       ->willReturn($userFolder);
+
+               $this->shareManager
+                       ->method('getSharesBy')
+                       ->will($this->returnCallback(
+                               function($user, $shareType, $node) use ($shares) {
+                                       if (!isset($shares[$node->getName()]) || !isset($shares[$node->getName()][$shareType])) {
+                                               return [];
+                                       }
+                                       return $shares[$node->getName()][$shareType];
+                               }
+                       ));
+
+               $shareProviderExistsMap = [
+                       [IShare::TYPE_EMAIL, $extraShareTypes[IShare::TYPE_EMAIL] ?? false],
+               ];
+
+               $this->shareManager
+                       ->method('shareProviderExists')
+                       ->will($this->returnValueMap($shareProviderExistsMap));
+
+               $this->shareManager
+                       ->method('outgoingServer2ServerSharesAllowed')
+                       ->willReturn($extraShareTypes[ISHARE::TYPE_REMOTE] ?? false);
+
+               $this->groupManager
+                       ->method('isInGroup')
+                       ->will($this->returnCallback(
+                               function($user, $group) {
+                                       return $group === 'currentUserGroup';
+                               }
+                       ));
+
+               $result = $ocs->getShares(
+                       $getSharesParameters['sharedWithMe'] ?? 'false',
+                       $getSharesParameters['reshares'] ?? 'false',
+                       $getSharesParameters['subfiles'] ?? 'false',
+                       'path'
+               );
+
+               $this->assertEquals($expected, $result->getData());
+       }
+
        public function testCanAccessShare() {
                $share = $this->getMockBuilder(IShare::class)->getMock();
                $share->method('getShareOwner')->willReturn($this->currentUser);