Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-05-25 18:26:32 +0300
committerVincent Petry <pvince81@owncloud.com>2016-05-25 18:26:32 +0300
commitfa5fd68d751322c4281a991c0c2afa81a874afac (patch)
treefad8374ef5ab79e786db9c72f69524e49248a86e /apps/dav/tests/unit/SystemTag
parent379f8a1e4538a76d4b9bbc4adf0ebe7b12b1d104 (diff)
parent5882e21b3bff0afe2152eb3971d674bdb91e45a2 (diff)
Merge pull request #24844 from owncloud/dav-test-psr4
Move DAV Tests to PSR-4
Diffstat (limited to 'apps/dav/tests/unit/SystemTag')
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagMappingNodeTest.php160
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php312
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagPluginTest.php734
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagsByIdCollectionTest.php233
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagsObjectMappingCollectionTest.php348
-rw-r--r--apps/dav/tests/unit/SystemTag/SystemTagsObjectTypeCollectionTest.php160
6 files changed, 1947 insertions, 0 deletions
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagMappingNodeTest.php b/apps/dav/tests/unit/SystemTag/SystemTagMappingNodeTest.php
new file mode 100644
index 00000000000..28f8c93a611
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagMappingNodeTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+use Sabre\DAV\Exception\NotFound;
+use OC\SystemTag\SystemTag;
+use OCP\SystemTag\TagNotFoundException;
+use OCP\SystemTag\ISystemTag;
+
+class SystemTagMappingNodeTest extends \Test\TestCase {
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagObjectMapper
+ */
+ private $tagMapper;
+
+ /**
+ * @var \OCP\IUser
+ */
+ private $user;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper');
+ $this->user = $this->getMock('\OCP\IUser');
+ }
+
+ public function getMappingNode($tag = null) {
+ if ($tag === null) {
+ $tag = new SystemTag(1, 'Test', true, true);
+ }
+ return new \OCA\DAV\SystemTag\SystemTagMappingNode(
+ $tag,
+ 123,
+ 'files',
+ $this->user,
+ $this->tagManager,
+ $this->tagMapper
+ );
+ }
+
+ public function testGetters() {
+ $tag = new SystemTag(1, 'Test', true, false);
+ $node = $this->getMappingNode($tag);
+ $this->assertEquals('1', $node->getName());
+ $this->assertEquals($tag, $node->getSystemTag());
+ $this->assertEquals(123, $node->getObjectId());
+ $this->assertEquals('files', $node->getObjectType());
+ }
+
+ public function testDeleteTag() {
+ $node = $this->getMappingNode();
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($node->getSystemTag())
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('canUserAssignTag')
+ ->with($node->getSystemTag())
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->never())
+ ->method('deleteTags');
+ $this->tagMapper->expects($this->once())
+ ->method('unassignTags')
+ ->with(123, 'files', 1);
+
+ $node->delete();
+ }
+
+ public function tagNodeDeleteProviderPermissionException() {
+ return [
+ [
+ // cannot unassign invisible tag
+ new SystemTag(1, 'Original', false, true),
+ 'Sabre\DAV\Exception\NotFound',
+ ],
+ [
+ // cannot unassign non-assignable tag
+ new SystemTag(1, 'Original', true, false),
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider tagNodeDeleteProviderPermissionException
+ */
+ public function testDeleteTagExpectedException(ISystemTag $tag, $expectedException) {
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserVisible()));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserAssignable()));
+ $this->tagManager->expects($this->never())
+ ->method('deleteTags');
+ $this->tagMapper->expects($this->never())
+ ->method('unassignTags');
+
+ $thrown = null;
+ try {
+ $this->getMappingNode($tag)->delete();
+ } catch (\Exception $e) {
+ $thrown = $e;
+ }
+
+ $this->assertInstanceOf($expectedException, $thrown);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testDeleteTagNotFound() {
+ // assuming the tag existed at the time the node was created,
+ // but got deleted concurrently in the database
+ $tag = new SystemTag(1, 'Test', true, true);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserVisible()));
+ $this->tagManager->expects($this->once())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserAssignable()));
+ $this->tagMapper->expects($this->once())
+ ->method('unassignTags')
+ ->with(123, 'files', 1)
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->getMappingNode($tag)->delete();
+ }
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php b/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php
new file mode 100644
index 00000000000..ff5f6d1aa02
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagNodeTest.php
@@ -0,0 +1,312 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+use Sabre\DAV\Exception\NotFound;
+use Sabre\DAV\Exception\MethodNotAllowed;
+use Sabre\DAV\Exception\Conflict;
+
+use OC\SystemTag\SystemTag;
+use OCP\SystemTag\TagNotFoundException;
+use OCP\SystemTag\TagAlreadyExistsException;
+use OCP\SystemTag\ISystemTag;
+
+class SystemTagNodeTest extends \Test\TestCase {
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var \OCP\IUser
+ */
+ private $user;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->user = $this->getMock('\OCP\IUser');
+ }
+
+ protected function getTagNode($isAdmin = true, $tag = null) {
+ if ($tag === null) {
+ $tag = new SystemTag(1, 'Test', true, true);
+ }
+ return new \OCA\DAV\SystemTag\SystemTagNode(
+ $tag,
+ $this->user,
+ $isAdmin,
+ $this->tagManager
+ );
+ }
+
+ public function adminFlagProvider() {
+ return [[true], [false]];
+ }
+
+ /**
+ * @dataProvider adminFlagProvider
+ */
+ public function testGetters($isAdmin) {
+ $tag = new SystemTag('1', 'Test', true, true);
+ $node = $this->getTagNode($isAdmin, $tag);
+ $this->assertEquals('1', $node->getName());
+ $this->assertEquals($tag, $node->getSystemTag());
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testSetName() {
+ $this->getTagNode()->setName('2');
+ }
+
+ public function tagNodeProvider() {
+ return [
+ // admin
+ [
+ true,
+ new SystemTag(1, 'Original', true, true),
+ ['Renamed', true, true]
+ ],
+ [
+ true,
+ new SystemTag(1, 'Original', true, true),
+ ['Original', false, false]
+ ],
+ // non-admin
+ [
+ // renaming allowed
+ false,
+ new SystemTag(1, 'Original', true, true),
+ ['Rename', true, true]
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider tagNodeProvider
+ */
+ public function testUpdateTag($isAdmin, $originalTag, $changedArgs) {
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($originalTag)
+ ->will($this->returnValue($originalTag->isUserVisible() || $isAdmin));
+ $this->tagManager->expects($this->once())
+ ->method('canUserAssignTag')
+ ->with($originalTag)
+ ->will($this->returnValue($originalTag->isUserAssignable() || $isAdmin));
+ $this->tagManager->expects($this->once())
+ ->method('updateTag')
+ ->with(1, $changedArgs[0], $changedArgs[1], $changedArgs[2]);
+ $this->getTagNode($isAdmin, $originalTag)
+ ->update($changedArgs[0], $changedArgs[1], $changedArgs[2]);
+ }
+
+ public function tagNodeProviderPermissionException() {
+ return [
+ [
+ // changing permissions not allowed
+ new SystemTag(1, 'Original', true, true),
+ ['Original', false, true],
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ [
+ // changing permissions not allowed
+ new SystemTag(1, 'Original', true, true),
+ ['Original', true, false],
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ [
+ // changing permissions not allowed
+ new SystemTag(1, 'Original', true, true),
+ ['Original', false, false],
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ [
+ // changing non-assignable not allowed
+ new SystemTag(1, 'Original', true, false),
+ ['Rename', true, false],
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ [
+ // changing non-assignable not allowed
+ new SystemTag(1, 'Original', true, false),
+ ['Original', true, true],
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ [
+ // invisible tag does not exist
+ new SystemTag(1, 'Original', false, false),
+ ['Rename', false, false],
+ 'Sabre\DAV\Exception\NotFound',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider tagNodeProviderPermissionException
+ */
+ public function testUpdateTagPermissionException($originalTag, $changedArgs, $expectedException = null) {
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($originalTag)
+ ->will($this->returnValue($originalTag->isUserVisible()));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($originalTag)
+ ->will($this->returnValue($originalTag->isUserAssignable()));
+ $this->tagManager->expects($this->never())
+ ->method('updateTag');
+
+ $thrown = null;
+
+ try {
+ $this->getTagNode(false, $originalTag)
+ ->update($changedArgs[0], $changedArgs[1], $changedArgs[2]);
+ } catch (\Exception $e) {
+ $thrown = $e;
+ }
+
+ $this->assertInstanceOf($expectedException, $thrown);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Conflict
+ */
+ public function testUpdateTagAlreadyExists() {
+ $tag = new SystemTag(1, 'tag1', true, true);
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('updateTag')
+ ->with(1, 'Renamed', true, true)
+ ->will($this->throwException(new TagAlreadyExistsException()));
+ $this->getTagNode(false, $tag)->update('Renamed', true, true);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testUpdateTagNotFound() {
+ $tag = new SystemTag(1, 'tag1', true, true);
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('updateTag')
+ ->with(1, 'Renamed', true, true)
+ ->will($this->throwException(new TagNotFoundException()));
+ $this->getTagNode(false, $tag)->update('Renamed', true, true);
+ }
+
+ /**
+ * @dataProvider adminFlagProvider
+ */
+ public function testDeleteTag($isAdmin) {
+ $tag = new SystemTag(1, 'tag1', true, true);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('deleteTags')
+ ->with('1');
+ $this->getTagNode($isAdmin, $tag)->delete();
+ }
+
+ public function tagNodeDeleteProviderPermissionException() {
+ return [
+ [
+ // cannot delete invisible tag
+ new SystemTag(1, 'Original', false, true),
+ 'Sabre\DAV\Exception\NotFound',
+ ],
+ [
+ // cannot delete non-assignable tag
+ new SystemTag(1, 'Original', true, false),
+ 'Sabre\DAV\Exception\Forbidden',
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider tagNodeDeleteProviderPermissionException
+ */
+ public function testDeleteTagPermissionException(ISystemTag $tag, $expectedException) {
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserVisible()));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserAssignable()));
+ $this->tagManager->expects($this->never())
+ ->method('deleteTags');
+
+ try {
+ $this->getTagNode(false, $tag)->delete();
+ } catch (\Exception $e) {
+ $thrown = $e;
+ }
+
+ $this->assertInstanceOf($expectedException, $thrown);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testDeleteTagNotFound() {
+ $tag = new SystemTag(1, 'tag1', true, true);
+ $this->tagManager->expects($this->any())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserVisible()));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue($tag->isUserAssignable()));
+ $this->tagManager->expects($this->once())
+ ->method('deleteTags')
+ ->with('1')
+ ->will($this->throwException(new TagNotFoundException()));
+ $this->getTagNode(false, $tag)->delete();
+ }
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagPluginTest.php b/apps/dav/tests/unit/SystemTag/SystemTagPluginTest.php
new file mode 100644
index 00000000000..154aa619866
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagPluginTest.php
@@ -0,0 +1,734 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ * @author Lukas Reschke <lukas@owncloud.com>
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+use OC\SystemTag\SystemTag;
+use OCP\IGroupManager;
+use OCP\IUserSession;
+use OCP\SystemTag\TagAlreadyExistsException;
+use OCP\IUser;
+use OCP\SystemTag\ISystemTag;
+
+class SystemTagPluginTest extends \Test\TestCase {
+
+ const ID_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::ID_PROPERTYNAME;
+ const DISPLAYNAME_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::DISPLAYNAME_PROPERTYNAME;
+ const USERVISIBLE_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::USERVISIBLE_PROPERTYNAME;
+ const USERASSIGNABLE_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::USERASSIGNABLE_PROPERTYNAME;
+ const CANASSIGN_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::CANASSIGN_PROPERTYNAME;
+ const GROUPS_PROPERTYNAME = \OCA\DAV\SystemTag\SystemTagPlugin::GROUPS_PROPERTYNAME;
+
+ /**
+ * @var \Sabre\DAV\Server
+ */
+ private $server;
+
+ /**
+ * @var \Sabre\DAV\Tree
+ */
+ private $tree;
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var IGroupManager
+ */
+ private $groupManager;
+
+ /**
+ * @var IUserSession
+ */
+ private $userSession;
+
+ /**
+ * @var IUser
+ */
+ private $user;
+
+ /**
+ * @var \OCA\DAV\SystemTag\SystemTagPlugin
+ */
+ private $plugin;
+
+ public function setUp() {
+ parent::setUp();
+ $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->server = new \Sabre\DAV\Server($this->tree);
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->groupManager = $this->getMock('\OCP\IGroupManager');
+ $this->user = $this->getMock('\OCP\IUser');
+ $this->userSession = $this->getMock('\OCP\IUserSession');
+ $this->userSession
+ ->expects($this->any())
+ ->method('getUser')
+ ->willReturn($this->user);
+ $this->userSession
+ ->expects($this->any())
+ ->method('isLoggedIn')
+ ->willReturn(true);
+
+ $this->plugin = new \OCA\DAV\SystemTag\SystemTagPlugin(
+ $this->tagManager,
+ $this->groupManager,
+ $this->userSession
+ );
+ $this->plugin->initialize($this->server);
+ }
+
+ public function getPropertiesDataProvider() {
+ return [
+ [
+ new SystemTag(1, 'Test', true, true),
+ [],
+ [
+ self::ID_PROPERTYNAME,
+ self::DISPLAYNAME_PROPERTYNAME,
+ self::USERVISIBLE_PROPERTYNAME,
+ self::USERASSIGNABLE_PROPERTYNAME,
+ self::CANASSIGN_PROPERTYNAME,
+ ],
+ [
+ self::ID_PROPERTYNAME => '1',
+ self::DISPLAYNAME_PROPERTYNAME => 'Test',
+ self::USERVISIBLE_PROPERTYNAME => 'true',
+ self::USERASSIGNABLE_PROPERTYNAME => 'true',
+ self::CANASSIGN_PROPERTYNAME => 'true',
+ ]
+ ],
+ [
+ new SystemTag(1, 'Test', true, false),
+ [],
+ [
+ self::ID_PROPERTYNAME,
+ self::DISPLAYNAME_PROPERTYNAME,
+ self::USERVISIBLE_PROPERTYNAME,
+ self::USERASSIGNABLE_PROPERTYNAME,
+ self::CANASSIGN_PROPERTYNAME,
+ ],
+ [
+ self::ID_PROPERTYNAME => '1',
+ self::DISPLAYNAME_PROPERTYNAME => 'Test',
+ self::USERVISIBLE_PROPERTYNAME => 'true',
+ self::USERASSIGNABLE_PROPERTYNAME => 'false',
+ self::CANASSIGN_PROPERTYNAME => 'false',
+ ]
+ ],
+ [
+ new SystemTag(1, 'Test', true, false),
+ ['group1', 'group2'],
+ [
+ self::ID_PROPERTYNAME,
+ self::GROUPS_PROPERTYNAME,
+ ],
+ [
+ self::ID_PROPERTYNAME => '1',
+ self::GROUPS_PROPERTYNAME => 'group1|group2',
+ ]
+ ],
+ [
+ new SystemTag(1, 'Test', true, true),
+ ['group1', 'group2'],
+ [
+ self::ID_PROPERTYNAME,
+ self::GROUPS_PROPERTYNAME,
+ ],
+ [
+ self::ID_PROPERTYNAME => '1',
+ // groups only returned when userAssignable is false
+ self::GROUPS_PROPERTYNAME => '',
+ ]
+ ],
+ ];
+ }
+
+ /**
+ * @dataProvider getPropertiesDataProvider
+ */
+ public function testGetProperties(ISystemTag $systemTag, $groups, $requestedProperties, $expectedProperties) {
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->any())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->any())
+ ->method('getSystemTag')
+ ->will($this->returnValue($systemTag));
+
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->will($this->returnValue($systemTag->isUserAssignable()));
+
+ $this->tagManager->expects($this->any())
+ ->method('getTagGroups')
+ ->will($this->returnValue($groups));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtag/1')
+ ->will($this->returnValue($node));
+
+ $propFind = new \Sabre\DAV\PropFind(
+ '/systemtag/1',
+ $requestedProperties,
+ 0
+ );
+
+ $this->plugin->handleGetProperties(
+ $propFind,
+ $node
+ );
+
+ $result = $propFind->getResultForMultiStatus();
+
+ $this->assertEmpty($result[404]);
+ $this->assertEquals($expectedProperties, $result[200]);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\Forbidden
+ */
+ public function testGetPropertiesForbidden() {
+ $systemTag = new SystemTag(1, 'Test', true, false);
+ $requestedProperties = [
+ self::ID_PROPERTYNAME,
+ self::GROUPS_PROPERTYNAME,
+ ];
+ $this->user->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(false);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->any())
+ ->method('getSystemTag')
+ ->will($this->returnValue($systemTag));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtag/1')
+ ->will($this->returnValue($node));
+
+ $propFind = new \Sabre\DAV\PropFind(
+ '/systemtag/1',
+ $requestedProperties,
+ 0
+ );
+
+ $this->plugin->handleGetProperties(
+ $propFind,
+ $node
+ );
+ }
+
+ public function testUpdatePropertiesAdmin() {
+ $systemTag = new SystemTag(1, 'Test', true, false);
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->any())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->any())
+ ->method('getSystemTag')
+ ->will($this->returnValue($systemTag));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtag/1')
+ ->will($this->returnValue($node));
+
+ $node->expects($this->once())
+ ->method('update')
+ ->with('Test changed', false, true);
+
+ $this->tagManager->expects($this->once())
+ ->method('setTagGroups')
+ ->with($systemTag, ['group1', 'group2']);
+
+ // properties to set
+ $propPatch = new \Sabre\DAV\PropPatch(array(
+ self::DISPLAYNAME_PROPERTYNAME => 'Test changed',
+ self::USERVISIBLE_PROPERTYNAME => 'false',
+ self::USERASSIGNABLE_PROPERTYNAME => 'true',
+ self::GROUPS_PROPERTYNAME => 'group1|group2',
+ ));
+
+ $this->plugin->handleUpdateProperties(
+ '/systemtag/1',
+ $propPatch
+ );
+
+ $propPatch->commit();
+
+ // all requested properties removed, as they were processed already
+ $this->assertEmpty($propPatch->getRemainingMutations());
+
+ $result = $propPatch->getResult();
+ $this->assertEquals(200, $result[self::DISPLAYNAME_PROPERTYNAME]);
+ $this->assertEquals(200, $result[self::USERASSIGNABLE_PROPERTYNAME]);
+ $this->assertEquals(200, $result[self::USERVISIBLE_PROPERTYNAME]);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\Forbidden
+ */
+ public function testUpdatePropertiesForbidden() {
+ $systemTag = new SystemTag(1, 'Test', true, false);
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->any())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(false);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagNode')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->any())
+ ->method('getSystemTag')
+ ->will($this->returnValue($systemTag));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtag/1')
+ ->will($this->returnValue($node));
+
+ $node->expects($this->never())
+ ->method('update');
+
+ $this->tagManager->expects($this->never())
+ ->method('setTagGroups');
+
+ // properties to set
+ $propPatch = new \Sabre\DAV\PropPatch(array(
+ self::GROUPS_PROPERTYNAME => 'group1|group2',
+ ));
+
+ $this->plugin->handleUpdateProperties(
+ '/systemtag/1',
+ $propPatch
+ );
+
+ $propPatch->commit();
+ }
+
+ public function createTagInsufficientPermissionsProvider() {
+ return [
+ [true, false, ''],
+ [false, true, ''],
+ [true, true, 'group1|group2'],
+ ];
+ }
+ /**
+ * @dataProvider createTagInsufficientPermissionsProvider
+ * @expectedException \Sabre\DAV\Exception\BadRequest
+ * @expectedExceptionMessage Not sufficient permissions
+ */
+ public function testCreateNotAssignableTagAsRegularUser($userVisible, $userAssignable, $groups) {
+ $this->user->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(false);
+
+ $requestData = [
+ 'name' => 'Test',
+ 'userVisible' => $userVisible,
+ 'userAssignable' => $userAssignable,
+ ];
+ if (!empty($groups)) {
+ $requestData['groups'] = $groups;
+ }
+ $requestData = json_encode($requestData);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsByIdCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tagManager->expects($this->never())
+ ->method('createTag');
+ $this->tagManager->expects($this->never())
+ ->method('setTagGroups');
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtags')
+ ->will($this->returnValue($node));
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags'));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ public function testCreateTagInByIdCollectionAsRegularUser() {
+ $systemTag = new SystemTag(1, 'Test', true, false);
+
+ $requestData = json_encode([
+ 'name' => 'Test',
+ 'userVisible' => true,
+ 'userAssignable' => true,
+ ]);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsByIdCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tagManager->expects($this->once())
+ ->method('createTag')
+ ->with('Test', true, true)
+ ->will($this->returnValue($systemTag));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtags')
+ ->will($this->returnValue($node));
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags'));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $request->expects($this->once())
+ ->method('getUrl')
+ ->will($this->returnValue('http://example.com/dav/systemtags'));
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Location', 'http://example.com/dav/systemtags/1');
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ public function createTagProvider() {
+ return [
+ [true, false, ''],
+ [false, false, ''],
+ [true, false, 'group1|group2'],
+ ];
+ }
+
+ /**
+ * @dataProvider createTagProvider
+ */
+ public function testCreateTagInByIdCollection($userVisible, $userAssignable, $groups) {
+ $this->user->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $systemTag = new SystemTag(1, 'Test', true, false);
+
+ $requestData = [
+ 'name' => 'Test',
+ 'userVisible' => $userVisible,
+ 'userAssignable' => $userAssignable,
+ ];
+ if (!empty($groups)) {
+ $requestData['groups'] = $groups;
+ }
+ $requestData = json_encode($requestData);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsByIdCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tagManager->expects($this->once())
+ ->method('createTag')
+ ->with('Test', $userVisible, $userAssignable)
+ ->will($this->returnValue($systemTag));
+
+ if (!empty($groups)) {
+ $this->tagManager->expects($this->once())
+ ->method('setTagGroups')
+ ->with($systemTag, explode('|', $groups))
+ ->will($this->returnValue($systemTag));
+ } else {
+ $this->tagManager->expects($this->never())
+ ->method('setTagGroups');
+ }
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtags')
+ ->will($this->returnValue($node));
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags'));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $request->expects($this->once())
+ ->method('getUrl')
+ ->will($this->returnValue('http://example.com/dav/systemtags'));
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Location', 'http://example.com/dav/systemtags/1');
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ public function nodeClassProvider() {
+ return [
+ ['\OCA\DAV\SystemTag\SystemTagsByIdCollection'],
+ ['\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection'],
+ ];
+ }
+
+ public function testCreateTagInMappingCollection() {
+ $this->user->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $systemTag = new SystemTag(1, 'Test', true, false);
+
+ $requestData = json_encode([
+ 'name' => 'Test',
+ 'userVisible' => true,
+ 'userAssignable' => false,
+ ]);
+
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->tagManager->expects($this->once())
+ ->method('createTag')
+ ->with('Test', true, false)
+ ->will($this->returnValue($systemTag));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtags-relations/files/12')
+ ->will($this->returnValue($node));
+
+ $node->expects($this->once())
+ ->method('createFile')
+ ->with(1);
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags-relations/files/12'));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $request->expects($this->once())
+ ->method('getBaseUrl')
+ ->will($this->returnValue('http://example.com/dav/'));
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Location', 'http://example.com/dav/systemtags/1');
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotFound
+ */
+ public function testCreateTagToUnknownNode() {
+ $node = $this->getMockBuilder('\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->will($this->throwException(new \Sabre\DAV\Exception\NotFound()));
+
+ $this->tagManager->expects($this->never())
+ ->method('createTag');
+
+ $node->expects($this->never())
+ ->method('createFile');
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags-relations/files/12'));
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ /**
+ * @dataProvider nodeClassProvider
+ * @expectedException \Sabre\DAV\Exception\Conflict
+ */
+ public function testCreateTagConflict($nodeClass) {
+ $this->user->expects($this->once())
+ ->method('getUID')
+ ->willReturn('admin');
+ $this->groupManager
+ ->expects($this->once())
+ ->method('isAdmin')
+ ->with('admin')
+ ->willReturn(true);
+
+ $requestData = json_encode([
+ 'name' => 'Test',
+ 'userVisible' => true,
+ 'userAssignable' => false,
+ ]);
+
+ $node = $this->getMockBuilder($nodeClass)
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->tagManager->expects($this->once())
+ ->method('createTag')
+ ->with('Test', true, false)
+ ->will($this->throwException(new TagAlreadyExistsException('Tag already exists')));
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/systemtags')
+ ->will($this->returnValue($node));
+
+ $request = $this->getMockBuilder('Sabre\HTTP\RequestInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $request->expects($this->once())
+ ->method('getPath')
+ ->will($this->returnValue('/systemtags'));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagsByIdCollectionTest.php b/apps/dav/tests/unit/SystemTag/SystemTagsByIdCollectionTest.php
new file mode 100644
index 00000000000..7722ac08df5
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagsByIdCollectionTest.php
@@ -0,0 +1,233 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+
+use OC\SystemTag\SystemTag;
+use OCP\SystemTag\TagNotFoundException;
+
+class SystemTagsByIdCollectionTest extends \Test\TestCase {
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var \OCP\IUser
+ */
+ private $user;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ }
+
+ public function getNode($isAdmin = true) {
+ $this->user = $this->getMock('\OCP\IUser');
+ $this->user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('testuser'));
+ $userSession = $this->getMock('\OCP\IUserSession');
+ $userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($this->user));
+ $groupManager = $this->getMock('\OCP\IGroupManager');
+ $groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->with('testuser')
+ ->will($this->returnValue($isAdmin));
+ return new \OCA\DAV\SystemTag\SystemTagsByIdCollection(
+ $this->tagManager,
+ $userSession,
+ $groupManager
+ );
+ }
+
+ public function adminFlagProvider() {
+ return [[true], [false]];
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testForbiddenCreateFile() {
+ $this->getNode()->createFile('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testForbiddenCreateDirectory() {
+ $this->getNode()->createDirectory('789');
+ }
+
+ public function testGetChild() {
+ $tag = new SystemTag(123, 'Test', true, false);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123'])
+ ->will($this->returnValue([$tag]));
+
+ $childNode = $this->getNode()->getChild('123');
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $childNode);
+ $this->assertEquals('123', $childNode->getName());
+ $this->assertEquals($tag, $childNode->getSystemTag());
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testGetChildInvalidName() {
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['invalid'])
+ ->will($this->throwException(new \InvalidArgumentException()));
+
+ $this->getNode()->getChild('invalid');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildNotFound() {
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['444'])
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->getNode()->getChild('444');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildUserNotVisible() {
+ $tag = new SystemTag(123, 'Test', false, false);
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123'])
+ ->will($this->returnValue([$tag]));
+
+ $this->getNode(false)->getChild('123');
+ }
+
+ public function testGetChildrenAdmin() {
+ $tag1 = new SystemTag(123, 'One', true, false);
+ $tag2 = new SystemTag(456, 'Two', true, true);
+
+ $this->tagManager->expects($this->once())
+ ->method('getAllTags')
+ ->with(null)
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $children = $this->getNode(true)->getChildren();
+
+ $this->assertCount(2, $children);
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[0]);
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[1]);
+ $this->assertEquals($tag1, $children[0]->getSystemTag());
+ $this->assertEquals($tag2, $children[1]->getSystemTag());
+ }
+
+ public function testGetChildrenNonAdmin() {
+ $tag1 = new SystemTag(123, 'One', true, false);
+ $tag2 = new SystemTag(456, 'Two', true, true);
+
+ $this->tagManager->expects($this->once())
+ ->method('getAllTags')
+ ->with(true)
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $children = $this->getNode(false)->getChildren();
+
+ $this->assertCount(2, $children);
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[0]);
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagNode', $children[1]);
+ $this->assertEquals($tag1, $children[0]->getSystemTag());
+ $this->assertEquals($tag2, $children[1]->getSystemTag());
+ }
+
+ public function testGetChildrenEmpty() {
+ $this->tagManager->expects($this->once())
+ ->method('getAllTags')
+ ->with(null)
+ ->will($this->returnValue([]));
+ $this->assertCount(0, $this->getNode()->getChildren());
+ }
+
+ public function childExistsProvider() {
+ return [
+ [true, true],
+ [false, false],
+ ];
+ }
+
+ /**
+ * @dataProvider childExistsProvider
+ */
+ public function testChildExists($userVisible, $expectedResult) {
+ $tag = new SystemTag(123, 'One', $userVisible, false);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($userVisible));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123'])
+ ->will($this->returnValue([$tag]));
+
+ $this->assertEquals($expectedResult, $this->getNode()->childExists('123'));
+ }
+
+ public function testChildExistsNotFound() {
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123'])
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->assertFalse($this->getNode()->childExists('123'));
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testChildExistsBadRequest() {
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['invalid'])
+ ->will($this->throwException(new \InvalidArgumentException()));
+
+ $this->getNode()->childExists('invalid');
+ }
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagsObjectMappingCollectionTest.php b/apps/dav/tests/unit/SystemTag/SystemTagsObjectMappingCollectionTest.php
new file mode 100644
index 00000000000..63ab6032f7a
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagsObjectMappingCollectionTest.php
@@ -0,0 +1,348 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+
+use OC\SystemTag\SystemTag;
+use OCP\SystemTag\TagNotFoundException;
+
+class SystemTagsObjectMappingCollectionTest extends \Test\TestCase {
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagObjectMapper
+ */
+ private $tagMapper;
+
+ /**
+ * @var \OCP\IUser
+ */
+ private $user;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper');
+
+ $this->user = $this->getMock('\OCP\IUser');
+ }
+
+ public function getNode() {
+ return new \OCA\DAV\SystemTag\SystemTagsObjectMappingCollection (
+ 111,
+ 'files',
+ $this->user,
+ $this->tagManager,
+ $this->tagMapper
+ );
+ }
+
+ public function testAssignTag() {
+ $tag = new SystemTag('1', 'Test', true, true);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+ $this->tagManager->expects($this->once())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue([$tag]));
+ $this->tagMapper->expects($this->once())
+ ->method('assignTags')
+ ->with(111, 'files', '555');
+
+ $this->getNode()->createFile('555');
+ }
+
+ public function permissionsProvider() {
+ return [
+ // invisible, tag does not exist for user
+ [false, true, '\Sabre\DAV\Exception\PreconditionFailed'],
+ // visible but static, cannot assign tag
+ [true, false, '\Sabre\DAV\Exception\Forbidden'],
+ ];
+ }
+
+ /**
+ * @dataProvider permissionsProvider
+ */
+ public function testAssignTagNoPermission($userVisible, $userAssignable, $expectedException) {
+ $tag = new SystemTag('1', 'Test', $userVisible, $userAssignable);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue($userVisible));
+ $this->tagManager->expects($this->any())
+ ->method('canUserAssignTag')
+ ->with($tag)
+ ->will($this->returnValue($userAssignable));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue([$tag]));
+ $this->tagMapper->expects($this->never())
+ ->method('assignTags');
+
+ $thrown = null;
+ try {
+ $this->getNode()->createFile('555');
+ } catch (\Exception $e) {
+ $thrown = $e;
+ }
+
+ $this->assertInstanceOf($expectedException, $thrown);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testAssignTagNotFound() {
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->getNode()->createFile('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testForbiddenCreateDirectory() {
+ $this->getNode()->createDirectory('789');
+ }
+
+ public function testGetChild() {
+ $tag = new SystemTag(555, 'TheTag', true, false);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555', true)
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue(['555' => $tag]));
+
+ $childNode = $this->getNode()->getChild('555');
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagMappingNode', $childNode);
+ $this->assertEquals('555', $childNode->getName());
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildNonVisible() {
+ $tag = new SystemTag(555, 'TheTag', false, false);
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(false));
+
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555', true)
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue(['555' => $tag]));
+
+ $this->getNode()->getChild('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildRelationNotFound() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '777')
+ ->will($this->returnValue(false));
+
+ $this->getNode()->getChild('777');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testGetChildInvalidId() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', 'badid')
+ ->will($this->throwException(new \InvalidArgumentException()));
+
+ $this->getNode()->getChild('badid');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildTagDoesNotExist() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '777')
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->getNode()->getChild('777');
+ }
+
+ public function testGetChildren() {
+ $tag1 = new SystemTag(555, 'TagOne', true, false);
+ $tag2 = new SystemTag(556, 'TagTwo', true, true);
+ $tag3 = new SystemTag(557, 'InvisibleTag', false, true);
+
+ $this->tagMapper->expects($this->once())
+ ->method('getTagIdsForObjects')
+ ->with([111], 'files')
+ ->will($this->returnValue(['111' => ['555', '556', '557']]));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555', '556', '557'])
+ ->will($this->returnValue(['555' => $tag1, '556' => $tag2, '557' => $tag3]));
+
+ $this->tagManager->expects($this->exactly(3))
+ ->method('canUserSeeTag')
+ ->will($this->returnCallback(function($tag) {
+ return $tag->isUserVisible();
+ }));
+
+ $children = $this->getNode()->getChildren();
+
+ $this->assertCount(2, $children);
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagMappingNode', $children[0]);
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagMappingNode', $children[1]);
+
+ $this->assertEquals(111, $children[0]->getObjectId());
+ $this->assertEquals('files', $children[0]->getObjectType());
+ $this->assertEquals($tag1, $children[0]->getSystemTag());
+
+ $this->assertEquals(111, $children[1]->getObjectId());
+ $this->assertEquals('files', $children[1]->getObjectType());
+ $this->assertEquals($tag2, $children[1]->getSystemTag());
+ }
+
+ public function testChildExistsWithVisibleTag() {
+ $tag = new SystemTag(555, 'TagOne', true, false);
+
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555')
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('canUserSeeTag')
+ ->with($tag)
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue([$tag]));
+
+ $this->assertTrue($this->getNode()->childExists('555'));
+ }
+
+ public function testChildExistsWithInvisibleTag() {
+ $tag = new SystemTag(555, 'TagOne', false, false);
+
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555')
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['555'])
+ ->will($this->returnValue([$tag]));
+
+ $this->assertFalse($this->getNode()->childExists('555'));
+ }
+
+ public function testChildExistsNotFound() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555')
+ ->will($this->returnValue(false));
+
+ $this->assertFalse($this->getNode()->childExists('555'));
+ }
+
+ public function testChildExistsTagNotFound() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555')
+ ->will($this->throwException(new TagNotFoundException()));
+
+ $this->assertFalse($this->getNode()->childExists('555'));
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testChildExistsInvalidId() {
+ $this->tagMapper->expects($this->once())
+ ->method('haveTag')
+ ->with([111], 'files', '555')
+ ->will($this->throwException(new \InvalidArgumentException()));
+
+ $this->getNode()->childExists('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testDelete() {
+ $this->getNode()->delete();
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testSetName() {
+ $this->getNode()->setName('somethingelse');
+ }
+
+ public function testGetName() {
+ $this->assertEquals('111', $this->getNode()->getName());
+ }
+}
diff --git a/apps/dav/tests/unit/SystemTag/SystemTagsObjectTypeCollectionTest.php b/apps/dav/tests/unit/SystemTag/SystemTagsObjectTypeCollectionTest.php
new file mode 100644
index 00000000000..036b4150426
--- /dev/null
+++ b/apps/dav/tests/unit/SystemTag/SystemTagsObjectTypeCollectionTest.php
@@ -0,0 +1,160 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, 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 OCA\DAV\Tests\unit\SystemTag;
+
+class SystemTagsObjectTypeCollectionTest extends \Test\TestCase {
+
+ /**
+ * @var \OCA\DAV\SystemTag\SystemTagsObjectTypeCollection
+ */
+ private $node;
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagManager
+ */
+ private $tagManager;
+
+ /**
+ * @var \OCP\SystemTag\ISystemTagObjectMapper
+ */
+ private $tagMapper;
+
+ /**
+ * @var \OCP\Files\Folder
+ */
+ private $userFolder;
+
+ protected function setUp() {
+ parent::setUp();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper');
+
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('testuser'));
+ $userSession = $this->getMock('\OCP\IUserSession');
+ $userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+ $groupManager = $this->getMock('\OCP\IGroupManager');
+ $groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->with('testuser')
+ ->will($this->returnValue(true));
+
+ $this->userFolder = $this->getMock('\OCP\Files\Folder');
+
+ $fileRoot = $this->getMock('\OCP\Files\IRootFolder');
+ $fileRoot->expects($this->any())
+ ->method('getUserfolder')
+ ->with('testuser')
+ ->will($this->returnValue($this->userFolder));
+
+ $this->node = new \OCA\DAV\SystemTag\SystemTagsObjectTypeCollection(
+ 'files',
+ $this->tagManager,
+ $this->tagMapper,
+ $userSession,
+ $groupManager,
+ $fileRoot
+ );
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testForbiddenCreateFile() {
+ $this->node->createFile('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testForbiddenCreateDirectory() {
+ $this->node->createDirectory('789');
+ }
+
+ public function testGetChild() {
+ $this->userFolder->expects($this->once())
+ ->method('getById')
+ ->with('555')
+ ->will($this->returnValue([true]));
+ $childNode = $this->node->getChild('555');
+
+ $this->assertInstanceOf('\OCA\DAV\SystemTag\SystemTagsObjectMappingCollection', $childNode);
+ $this->assertEquals('555', $childNode->getName());
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChildWithoutAccess() {
+ $this->userFolder->expects($this->once())
+ ->method('getById')
+ ->with('555')
+ ->will($this->returnValue([]));
+ $this->node->getChild('555');
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testGetChildren() {
+ $this->node->getChildren();
+ }
+
+ public function testChildExists() {
+ $this->userFolder->expects($this->once())
+ ->method('getById')
+ ->with('123')
+ ->will($this->returnValue([true]));
+ $this->assertTrue($this->node->childExists('123'));
+ }
+
+ public function testChildExistsWithoutAccess() {
+ $this->userFolder->expects($this->once())
+ ->method('getById')
+ ->with('555')
+ ->will($this->returnValue([]));
+ $this->assertFalse($this->node->childExists('555'));
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testDelete() {
+ $this->node->delete();
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testSetName() {
+ $this->node->setName('somethingelse');
+ }
+
+ public function testGetName() {
+ $this->assertEquals('files', $this->node->getName());
+ }
+}