summaryrefslogtreecommitdiffstats
path: root/apps/dav/tests
diff options
context:
space:
mode:
Diffstat (limited to 'apps/dav/tests')
-rw-r--r--apps/dav/tests/unit/comments/commentnode.php39
-rw-r--r--apps/dav/tests/unit/comments/commentsplugin.php93
-rw-r--r--apps/dav/tests/unit/connector/sabre/filesreportplugin.php602
-rw-r--r--apps/dav/tests/unit/connector/sabre/principal.php14
-rw-r--r--apps/dav/tests/unit/migration/calendar_schema.xml191
-rw-r--r--apps/dav/tests/unit/migration/calendaradaptertest.php131
-rw-r--r--apps/dav/tests/unit/migration/migratecalendartest.php76
7 files changed, 1144 insertions, 2 deletions
diff --git a/apps/dav/tests/unit/comments/commentnode.php b/apps/dav/tests/unit/comments/commentnode.php
index 8d1bf06ab60..8ebc5c2ff2c 100644
--- a/apps/dav/tests/unit/comments/commentnode.php
+++ b/apps/dav/tests/unit/comments/commentnode.php
@@ -22,6 +22,8 @@
namespace OCA\DAV\Tests\Unit\Comments;
use OCA\DAV\Comments\CommentNode;
+use OCP\Comments\IComment;
+use OCP\Comments\MessageTooLongException;
class CommentsNode extends \Test\TestCase {
@@ -199,6 +201,43 @@ class CommentsNode extends \Test\TestCase {
}
/**
+ * @expectedException \Sabre\DAV\Exception\BadRequest
+ * @expectedExceptionMessage Message exceeds allowed character limit of
+ */
+ public function testUpdateCommentMessageTooLongException() {
+ $user = $this->getMock('\OCP\IUser');
+
+ $user->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('alice'));
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+
+ $this->comment->expects($this->once())
+ ->method('setMessage')
+ ->will($this->throwException(new MessageTooLongException()));
+
+ $this->comment->expects($this->any())
+ ->method('getActorType')
+ ->will($this->returnValue('users'));
+
+ $this->comment->expects($this->any())
+ ->method('getActorId')
+ ->will($this->returnValue('alice'));
+
+ $this->commentsManager->expects($this->never())
+ ->method('save');
+
+ $this->logger->expects($this->once())
+ ->method('logException');
+
+ // imagine 'foo' has >1k characters. comment is mocked anyway.
+ $this->node->updateComment('foo');
+ }
+
+ /**
* @expectedException \Sabre\DAV\Exception\Forbidden
*/
public function testUpdateForbiddenByUser() {
diff --git a/apps/dav/tests/unit/comments/commentsplugin.php b/apps/dav/tests/unit/comments/commentsplugin.php
index 9822137bbea..d6f489f5e80 100644
--- a/apps/dav/tests/unit/comments/commentsplugin.php
+++ b/apps/dav/tests/unit/comments/commentsplugin.php
@@ -23,6 +23,7 @@ namespace OCA\DAV\Tests\Unit\Comments;
use OC\Comments\Comment;
use OCA\DAV\Comments\CommentsPlugin as CommentsPluginImplementation;
+use OCP\Comments\IComment;
use Sabre\DAV\Exception\NotFound;
class CommentsPlugin extends \Test\TestCase {
@@ -506,6 +507,98 @@ class CommentsPlugin extends \Test\TestCase {
}
/**
+ * @expectedException \Sabre\DAV\Exception\BadRequest
+ * @expectedExceptionMessage Message exceeds allowed character limit of
+ */
+ public function testCreateCommentMessageTooLong() {
+ $commentData = [
+ 'actorType' => 'users',
+ 'verb' => 'comment',
+ 'message' => str_pad('', IComment::MAX_MESSAGE_LENGTH + 1, 'x'),
+ ];
+
+ $comment = new Comment([
+ 'objectType' => 'files',
+ 'objectId' => '42',
+ 'actorType' => 'users',
+ 'actorId' => 'alice',
+ 'verb' => 'comment',
+ ]);
+ $comment->setId('23');
+
+ $path = 'comments/files/42';
+
+ $requestData = json_encode($commentData);
+
+ $user = $this->getMock('OCP\IUser');
+ $user->expects($this->once())
+ ->method('getUID')
+ ->will($this->returnValue('alice'));
+
+ $node = $this->getMockBuilder('\OCA\DAV\Comments\EntityCollection')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('files'));
+ $node->expects($this->once())
+ ->method('getId')
+ ->will($this->returnValue('42'));
+
+ $node->expects($this->never())
+ ->method('setReadMarker');
+
+ $this->commentsManager->expects($this->once())
+ ->method('create')
+ ->with('users', 'alice', 'files', '42')
+ ->will($this->returnValue($comment));
+
+ $this->userSession->expects($this->once())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+
+ // technically, this is a shortcut. Inbetween EntityTypeCollection would
+ // be returned, but doing it exactly right would not be really
+ // unit-testing like, as it would require to haul in a lot of other
+ // things.
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->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('/' . $path));
+
+ $request->expects($this->once())
+ ->method('getBodyAsString')
+ ->will($this->returnValue($requestData));
+
+ $request->expects($this->once())
+ ->method('getHeader')
+ ->with('Content-Type')
+ ->will($this->returnValue('application/json'));
+
+ $response->expects($this->never())
+ ->method('setHeader');
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->httpPost($request, $response);
+ }
+
+ /**
* @expectedException \Sabre\DAV\Exception\ReportNotSupported
*/
public function testOnReportInvalidNode() {
diff --git a/apps/dav/tests/unit/connector/sabre/filesreportplugin.php b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
new file mode 100644
index 00000000000..b528e2d2427
--- /dev/null
+++ b/apps/dav/tests/unit/connector/sabre/filesreportplugin.php
@@ -0,0 +1,602 @@
+<?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\Sabre\Connector;
+
+use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
+use Sabre\DAV\Exception\NotFound;
+use OCP\SystemTag\ISystemTagObjectMapper;
+use OC\Files\View;
+use OCP\Files\Folder;
+use OCP\IGroupManager;
+use OCP\SystemTag\ISystemTagManager;
+
+class FilesReportPlugin extends \Test\TestCase {
+ /** @var \Sabre\DAV\Server|\PHPUnit_Framework_MockObject_MockObject */
+ private $server;
+
+ /** @var \Sabre\DAV\Tree|\PHPUnit_Framework_MockObject_MockObject */
+ private $tree;
+
+ /** @var ISystemTagObjectMapper|\PHPUnit_Framework_MockObject_MockObject */
+ private $tagMapper;
+
+ /** @var ISystemTagManager|\PHPUnit_Framework_MockObject_MockObject */
+ private $tagManager;
+
+ /** @var \OCP\IUserSession */
+ private $userSession;
+
+ /** @var FilesReportPluginImplementation */
+ private $plugin;
+
+ /** @var View|\PHPUnit_Framework_MockObject_MockObject **/
+ private $view;
+
+ /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject **/
+ private $groupManager;
+
+ /** @var Folder|\PHPUnit_Framework_MockObject_MockObject **/
+ private $userFolder;
+
+ public function setUp() {
+ parent::setUp();
+ $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->view = $this->getMockBuilder('\OC\Files\View')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->server = $this->getMockBuilder('\Sabre\DAV\Server')
+ ->setConstructorArgs([$this->tree])
+ ->setMethods(['getRequestUri'])
+ ->getMock();
+
+ $this->groupManager = $this->getMockBuilder('\OCP\IGroupManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->tagManager = $this->getMock('\OCP\SystemTag\ISystemTagManager');
+ $this->tagMapper = $this->getMock('\OCP\SystemTag\ISystemTagObjectMapper');
+ $this->userSession = $this->getMock('\OCP\IUserSession');
+
+ $user = $this->getMock('\OCP\IUser');
+ $user->expects($this->any())
+ ->method('getUID')
+ ->will($this->returnValue('testuser'));
+ $this->userSession->expects($this->any())
+ ->method('getUser')
+ ->will($this->returnValue($user));
+
+ $this->plugin = new FilesReportPluginImplementation(
+ $this->tree,
+ $this->view,
+ $this->tagManager,
+ $this->tagMapper,
+ $this->userSession,
+ $this->groupManager,
+ $this->userFolder
+ );
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\ReportNotSupported
+ */
+ public function testOnReportInvalidNode() {
+ $path = 'totally/unrelated/13';
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($this->getMock('\Sabre\DAV\INode')));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport(FilesReportPluginImplementation::REPORT_NAME, [], '/' . $path);
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\ReportNotSupported
+ */
+ public function testOnReportInvalidReportName() {
+ $path = 'test';
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($this->getMock('\Sabre\DAV\INode')));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport('{whoever}whatever', [], '/' . $path);
+ }
+
+ public function testOnReport() {
+ $path = 'test';
+
+ $parameters = [
+ [
+ 'name' => '{DAV:}prop',
+ 'value' => [
+ ['name' => '{DAV:}getcontentlength', 'value' => ''],
+ ['name' => '{http://owncloud.org/ns}size', 'value' => ''],
+ ],
+ ],
+ [
+ 'name' => '{http://owncloud.org/ns}filter-rules',
+ 'value' => [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ],
+ ],
+ ];
+
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123', 'files')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456', 'files')
+ ->will($this->returnValue(['111', '222', '333']));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $response = $this->getMockBuilder('Sabre\HTTP\ResponseInterface')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $response->expects($this->once())
+ ->method('setHeader')
+ ->with('Content-Type', 'application/xml; charset=utf-8');
+
+ $response->expects($this->once())
+ ->method('setStatus')
+ ->with(207);
+
+ $response->expects($this->once())
+ ->method('setBody');
+
+ $this->tree->expects($this->any())
+ ->method('getNodeForPath')
+ ->with('/' . $path)
+ ->will($this->returnValue($reportTargetNode));
+
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $this->userFolder->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ $this->server->expects($this->any())
+ ->method('getRequestUri')
+ ->will($this->returnValue($path));
+ $this->server->httpResponse = $response;
+ $this->plugin->initialize($this->server);
+
+ $this->plugin->onReport(FilesReportPluginImplementation::REPORT_NAME, $parameters, '/' . $path);
+ }
+
+ public function testFindNodesByFileIdsRoot() {
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode1->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('first node'));
+
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('second node'));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $reportTargetNode->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/'));
+
+ $this->userFolder->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $this->userFolder->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ /** @var \OCA\DAV\Connector\Sabre\Directory|\PHPUnit_Framework_MockObject_MockObject $reportTargetNode */
+ $result = $this->plugin->findNodesByFileIds($reportTargetNode, ['111', '222']);
+
+ $this->assertCount(2, $result);
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\Directory', $result[0]);
+ $this->assertEquals('first node', $result[0]->getName());
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\File', $result[1]);
+ $this->assertEquals('second node', $result[1]->getName());
+ }
+
+ public function testFindNodesByFileIdsSubDir() {
+ $filesNode1 = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode1->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('first node'));
+
+ $filesNode2 = $this->getMockBuilder('\OCP\Files\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $filesNode2->expects($this->once())
+ ->method('getName')
+ ->will($this->returnValue('second node'));
+
+ $reportTargetNode = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $reportTargetNode->expects($this->any())
+ ->method('getPath')
+ ->will($this->returnValue('/sub1/sub2'));
+
+
+ $subNode = $this->getMockBuilder('\OCP\Files\Folder')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $this->userFolder->expects($this->at(0))
+ ->method('get')
+ ->with('/sub1/sub2')
+ ->will($this->returnValue($subNode));
+
+ $subNode->expects($this->at(0))
+ ->method('getById')
+ ->with('111')
+ ->will($this->returnValue([$filesNode1]));
+ $subNode->expects($this->at(1))
+ ->method('getById')
+ ->with('222')
+ ->will($this->returnValue([$filesNode2]));
+
+ /** @var \OCA\DAV\Connector\Sabre\Directory|\PHPUnit_Framework_MockObject_MockObject $reportTargetNode */
+ $result = $this->plugin->findNodesByFileIds($reportTargetNode, ['111', '222']);
+
+ $this->assertCount(2, $result);
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\Directory', $result[0]);
+ $this->assertEquals('first node', $result[0]->getName());
+ $this->assertInstanceOf('\OCA\DAV\Connector\Sabre\File', $result[1]);
+ $this->assertEquals('second node', $result[1]->getName());
+ }
+
+ public function testPrepareResponses() {
+ $requestedProps = ['{DAV:}getcontentlength', '{http://owncloud.org/ns}fileid', '{DAV:}resourcetype'];
+
+ $node1 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\Directory')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $node2 = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ $node1->expects($this->once())
+ ->method('getInternalFileId')
+ ->will($this->returnValue('111'));
+ $node2->expects($this->once())
+ ->method('getInternalFileId')
+ ->will($this->returnValue('222'));
+ $node2->expects($this->once())
+ ->method('getSize')
+ ->will($this->returnValue(1024));
+
+ $this->server->addPlugin(new \OCA\DAV\Connector\Sabre\FilesPlugin($this->tree, $this->view));
+ $this->plugin->initialize($this->server);
+ $responses = $this->plugin->prepareResponses($requestedProps, [$node1, $node2]);
+
+ $this->assertCount(2, $responses);
+
+ $this->assertEquals(200, $responses[0]->getHttpStatus());
+ $this->assertEquals(200, $responses[1]->getHttpStatus());
+
+ $props1 = $responses[0]->getResponseProperties();
+ $this->assertEquals('111', $props1[200]['{http://owncloud.org/ns}fileid']);
+ $this->assertNull($props1[404]['{DAV:}getcontentlength']);
+ $this->assertInstanceOf('\Sabre\DAV\Xml\Property\ResourceType', $props1[200]['{DAV:}resourcetype']);
+ $resourceType1 = $props1[200]['{DAV:}resourcetype']->getValue();
+ $this->assertEquals('{DAV:}collection', $resourceType1[0]);
+
+ $props2 = $responses[1]->getResponseProperties();
+ $this->assertEquals('1024', $props2[200]['{DAV:}getcontentlength']);
+ $this->assertEquals('222', $props2[200]['{http://owncloud.org/ns}fileid']);
+ $this->assertInstanceOf('\Sabre\DAV\Xml\Property\ResourceType', $props2[200]['{DAV:}resourcetype']);
+ $this->assertCount(0, $props2[200]['{DAV:}resourcetype']->getValue());
+ }
+
+ public function testProcessFilterRulesSingle() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->exactly(1))
+ ->method('getObjectIdsForTags')
+ ->withConsecutive(
+ ['123', 'files']
+ )
+ ->willReturnMap([
+ ['123', 'files', ['111', '222']],
+ ]);
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ];
+
+ $this->assertEquals(['111', '222'], $this->plugin->processFilterRules($rules));
+ }
+
+ public function testProcessFilterRulesAndCondition() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->exactly(2))
+ ->method('getObjectIdsForTags')
+ ->withConsecutive(
+ ['123', 'files'],
+ ['456', 'files']
+ )
+ ->willReturnMap([
+ ['123', 'files', ['111', '222']],
+ ['456', 'files', ['222', '333']],
+ ]);
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ public function testProcessFilterRulesAndConditionWithOneEmptyResult() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->exactly(2))
+ ->method('getObjectIdsForTags')
+ ->withConsecutive(
+ ['123', 'files'],
+ ['456', 'files']
+ )
+ ->willReturnMap([
+ ['123', 'files', ['111', '222']],
+ ['456', 'files', []],
+ ]);
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals([], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ public function testProcessFilterRulesAndConditionWithFirstEmptyResult() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->exactly(1))
+ ->method('getObjectIdsForTags')
+ ->withConsecutive(
+ ['123', 'files'],
+ ['456', 'files']
+ )
+ ->willReturnMap([
+ ['123', 'files', []],
+ ['456', 'files', ['111', '222']],
+ ]);
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals([], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ public function testProcessFilterRulesAndConditionWithEmptyMidResult() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $this->tagMapper->expects($this->exactly(2))
+ ->method('getObjectIdsForTags')
+ ->withConsecutive(
+ ['123', 'files'],
+ ['456', 'files'],
+ ['789', 'files']
+ )
+ ->willReturnMap([
+ ['123', 'files', ['111', '222']],
+ ['456', 'files', ['333']],
+ ['789', 'files', ['111', '222']],
+ ]);
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '789'],
+ ];
+
+ $this->assertEquals([], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ public function testProcessFilterRulesInvisibleTagAsAdmin() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(true));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(false));
+
+ // no need to fetch tags to check permissions
+ $this->tagManager->expects($this->never())
+ ->method('getTagsByIds');
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456')
+ ->will($this->returnValue(['222', '333']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+
+ /**
+ * @expectedException \OCP\SystemTag\TagNotFoundException
+ */
+ public function testProcessFilterRulesInvisibleTagAsUser() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(false));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(false)); // invisible
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123', '456'])
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->plugin->processFilterRules($rules);
+ }
+
+ public function testProcessFilterRulesVisibleTagAsUser() {
+ $this->groupManager->expects($this->any())
+ ->method('isAdmin')
+ ->will($this->returnValue(false));
+
+ $tag1 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag1->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag1->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $tag2 = $this->getMock('\OCP\SystemTag\ISystemTag');
+ $tag2->expects($this->any())
+ ->method('getId')
+ ->will($this->returnValue('123'));
+ $tag2->expects($this->any())
+ ->method('isUserVisible')
+ ->will($this->returnValue(true));
+
+ $this->tagManager->expects($this->once())
+ ->method('getTagsByIds')
+ ->with(['123', '456'])
+ ->will($this->returnValue([$tag1, $tag2]));
+
+ $this->tagMapper->expects($this->at(0))
+ ->method('getObjectIdsForTags')
+ ->with('123')
+ ->will($this->returnValue(['111', '222']));
+ $this->tagMapper->expects($this->at(1))
+ ->method('getObjectIdsForTags')
+ ->with('456')
+ ->will($this->returnValue(['222', '333']));
+
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '123'],
+ ['name' => '{http://owncloud.org/ns}systemtag', 'value' => '456'],
+ ];
+
+ $this->assertEquals(['222'], array_values($this->plugin->processFilterRules($rules)));
+ }
+}
diff --git a/apps/dav/tests/unit/connector/sabre/principal.php b/apps/dav/tests/unit/connector/sabre/principal.php
index 07bfd5d263b..1747885240a 100644
--- a/apps/dav/tests/unit/connector/sabre/principal.php
+++ b/apps/dav/tests/unit/connector/sabre/principal.php
@@ -202,16 +202,26 @@ class Principal extends TestCase {
public function testGetGroupMembership() {
$fooUser = $this->getMockBuilder('\OC\User\User')
->disableOriginalConstructor()->getMock();
+ $group = $this->getMockBuilder('\OCP\IGroup')
+ ->disableOriginalConstructor()->getMock();
+ $group->expects($this->once())
+ ->method('getGID')
+ ->willReturn('group1');
$this->userManager
->expects($this->once())
->method('get')
->with('foo')
->willReturn($fooUser);
$this->groupManager
+ ->expects($this->once())
->method('getUserGroups')
- ->willReturn([]);
+ ->willReturn([
+ $group
+ ]);
- $expectedResponse = [];
+ $expectedResponse = [
+ 'principals/groups/group1'
+ ];
$response = $this->connector->getGroupMembership('principals/users/foo');
$this->assertSame($expectedResponse, $response);
}
diff --git a/apps/dav/tests/unit/migration/calendar_schema.xml b/apps/dav/tests/unit/migration/calendar_schema.xml
new file mode 100644
index 00000000000..6c88b596a3f
--- /dev/null
+++ b/apps/dav/tests/unit/migration/calendar_schema.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<database>
+
+ <name>*dbname*</name>
+ <create>true</create>
+ <overwrite>false</overwrite>
+
+ <charset>utf8</charset>
+
+ <table>
+
+ <name>*dbprefix*clndr_objects</name>
+
+ <declaration>
+
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarid</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>objecttype</name>
+ <type>text</type>
+ <default></default>
+ <notnull>true</notnull>
+ <length>40</length>
+ </field>
+
+ <field>
+ <name>startdate</name>
+ <type>timestamp</type>
+ <default>1970-01-01 00:00:00</default>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>enddate</name>
+ <type>timestamp</type>
+ <default>1970-01-01 00:00:00</default>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>repeating</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>summary</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>calendardata</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>lastmodified</name>
+ <type>integer</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>4</length>
+ </field>
+
+ </declaration>
+
+ </table>
+
+ <table>
+
+ <name>*dbprefix*clndr_calendars</name>
+
+ <declaration>
+
+ <field>
+ <name>id</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <autoincrement>1</autoincrement>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>userid</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>displayname</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>100</length>
+ </field>
+
+ <field>
+ <name>uri</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>255</length>
+ </field>
+
+ <field>
+ <name>active</name>
+ <type>integer</type>
+ <default>1</default>
+ <notnull>true</notnull>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>ctag</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarorder</name>
+ <type>integer</type>
+ <default>0</default>
+ <notnull>true</notnull>
+ <unsigned>true</unsigned>
+ <length>4</length>
+ </field>
+
+ <field>
+ <name>calendarcolor</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>10</length>
+ </field>
+
+ <field>
+ <name>timezone</name>
+ <type>clob</type>
+ <notnull>false</notnull>
+ </field>
+
+ <field>
+ <name>components</name>
+ <type>text</type>
+ <default></default>
+ <notnull>false</notnull>
+ <length>100</length>
+ </field>
+
+ </declaration>
+
+ </table>
+
+</database>
diff --git a/apps/dav/tests/unit/migration/calendaradaptertest.php b/apps/dav/tests/unit/migration/calendaradaptertest.php
new file mode 100644
index 00000000000..f92774ef6ad
--- /dev/null
+++ b/apps/dav/tests/unit/migration/calendaradaptertest.php
@@ -0,0 +1,131 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Migration;
+
+use DomainException;
+use OCA\Dav\Migration\AddressBookAdapter;
+use OCA\Dav\Migration\CalendarAdapter;
+use OCP\IDBConnection;
+use Test\TestCase;
+
+/**
+ * Class CalendarAdapterTest
+ *
+ * @group DB
+ *
+ * @package OCA\DAV\Tests\Unit\Migration
+ */
+class CalendarAdapterTest extends TestCase {
+
+ /** @var IDBConnection */
+ private $db;
+ /** @var CalendarAdapter */
+ private $adapter;
+ /** @var array */
+ private $cals = [];
+ /** @var array */
+ private $calObjs = [];
+
+ public function setUp() {
+ parent::setUp();
+ $this->db = \OC::$server->getDatabaseConnection();
+
+ $manager = new \OC\DB\MDB2SchemaManager($this->db);
+ $manager->createDbFromStructure(__DIR__ . '/calendar_schema.xml');
+
+ $this->adapter = new CalendarAdapter($this->db);
+ }
+
+ public function tearDown() {
+ $this->db->dropTable('clndr_calendars');
+ $this->db->dropTable('clndr_objects');
+ parent::tearDown();
+ }
+
+ /**
+ * @expectedException DomainException
+ */
+ public function testOldTablesDoNotExist() {
+ $adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
+ $adapter->setup();
+ }
+
+ public function test() {
+
+ // insert test data
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('clndr_calendars')
+ ->values([
+ 'userid' => $builder->createNamedParameter('test-user-666'),
+ 'displayname' => $builder->createNamedParameter('Display Name'),
+ 'uri' => $builder->createNamedParameter('events'),
+ 'ctag' => $builder->createNamedParameter('112233'),
+ 'active' => $builder->createNamedParameter('1')
+ ])
+ ->execute();
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('clndr_objects')
+ ->values([
+ 'calendarid' => $builder->createNamedParameter(6666),
+ 'objecttype' => $builder->createNamedParameter('VEVENT'),
+ 'startdate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
+ 'enddate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
+ 'repeating' => $builder->createNamedParameter(0),
+ 'summary' => $builder->createNamedParameter('Something crazy will happen'),
+ 'uri' => $builder->createNamedParameter('event.ics'),
+ 'lastmodified' => $builder->createNamedParameter('112233'),
+ ])
+ ->execute();
+ $builder = $this->db->getQueryBuilder();
+ $builder->insert('share')
+ ->values([
+ 'share_type' => $builder->createNamedParameter(1),
+ 'share_with' => $builder->createNamedParameter('user01'),
+ 'uid_owner' => $builder->createNamedParameter('user02'),
+ 'item_type' => $builder->createNamedParameter('calendar'),
+ 'item_source' => $builder->createNamedParameter(6666),
+ 'item_target' => $builder->createNamedParameter('Contacts (user02)'),
+ ])
+ ->execute();
+
+ // test the adapter
+ $this->adapter->foreachCalendar('test-user-666', function($row) {
+ $this->cals[] = $row;
+ });
+ $this->assertArrayHasKey('id', $this->cals[0]);
+ $this->assertEquals('test-user-666', $this->cals[0]['userid']);
+ $this->assertEquals('Display Name', $this->cals[0]['displayname']);
+ $this->assertEquals('events', $this->cals[0]['uri']);
+ $this->assertEquals('112233', $this->cals[0]['ctag']);
+
+ $this->adapter->foreachCalendarObject(6666, function($row) {
+ $this->calObjs[]= $row;
+ });
+ $this->assertArrayHasKey('id', $this->calObjs[0]);
+ $this->assertEquals(6666, $this->calObjs[0]['calendarid']);
+
+ // test getShares
+ $shares = $this->adapter->getShares(6666);
+ $this->assertEquals(1, count($shares));
+
+ }
+
+}
diff --git a/apps/dav/tests/unit/migration/migratecalendartest.php b/apps/dav/tests/unit/migration/migratecalendartest.php
new file mode 100644
index 00000000000..1058773ffff
--- /dev/null
+++ b/apps/dav/tests/unit/migration/migratecalendartest.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ *
+ * @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\Migration;
+
+use OCA\DAV\CalDAV\CalDavBackend;
+use OCA\Dav\Migration\CalendarAdapter;
+use Test\TestCase;
+
+class MigrateCalendarTest extends TestCase {
+
+ public function testMigration() {
+ /** @var CalendarAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
+ $adapter = $this->mockAdapter();
+
+ /** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
+ $cardDav = $this->getMockBuilder('\OCA\Dav\CalDAV\CalDAVBackend')->disableOriginalConstructor()->getMock();
+ $cardDav->method('createCalendar')->willReturn(666);
+ $cardDav->expects($this->once())->method('createCalendar')->with('principals/users/test01', 'test_contacts');
+ $cardDav->expects($this->once())->method('createCalendarObject')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics', 'BEGIN:VCARD');
+
+ $m = new \OCA\Dav\Migration\MigrateCalendars($adapter, $cardDav);
+ $m->migrateForUser('test01');
+ }
+
+ /**
+ * @return \PHPUnit_Framework_MockObject_MockObject
+ */
+ private function mockAdapter($shares = []) {
+ $adapter = $this->getMockBuilder('\OCA\Dav\Migration\CalendarAdapter')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $adapter->method('foreachCalendar')->willReturnCallback(function ($user, \Closure $callBack) {
+ $callBack([
+ // calendarorder | calendarcolor | timezone | components
+ 'id' => 0,
+ 'userid' => $user,
+ 'displayname' => 'Test Contacts',
+ 'uri' => 'test_contacts',
+ 'ctag' => 1234567890,
+ 'active' => 1,
+ 'calendarorder' => '0',
+ 'calendarcolor' => '#b3dc6c',
+ 'timezone' => null,
+ 'components' => 'VEVENT,VTODO,VJOURNAL'
+ ]);
+ });
+ $adapter->method('foreachCalendarObject')->willReturnCallback(function ($addressBookId, \Closure $callBack) {
+ $callBack([
+ 'userid' => $addressBookId,
+ 'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics',
+ 'calendardata' => 'BEGIN:VCARD'
+ ]);
+ });
+ $adapter->method('getShares')->willReturn($shares);
+ return $adapter;
+ }
+
+}