2015-10-31 03:28:21 +03:00
< ? php
/**
2016-07-21 17:49:16 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
2017-04-25 20:26:47 +03:00
* @ copyright Copyright ( c ) 2017 Georg Ehrke
2016-07-21 17:49:16 +03:00
*
* @ author Joas Schilling < coding @ schilljs . com >
* @ author Thomas Citharel < tcit @ tcit . fr >
2016-01-12 17:02:16 +03:00
* @ author Thomas Müller < thomas . mueller @ tmit . eu >
2017-04-25 20:26:47 +03:00
* @ author Georg Ehrke < oc . list @ georgehrke . com >
2015-10-31 03:28:21 +03:00
*
* @ 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 />
*
*/
2016-05-25 17:04:15 +03:00
namespace OCA\DAV\Tests\unit\CalDAV ;
2015-10-31 03:28:21 +03:00
use DateTime ;
use DateTimeZone ;
use OCA\DAV\CalDAV\CalDavBackend ;
2016-01-28 19:16:11 +03:00
use OCA\DAV\CalDAV\Calendar ;
2016-04-21 14:36:52 +03:00
use OCP\IL10N ;
2015-10-31 03:28:21 +03:00
use Sabre\DAV\PropPatch ;
2015-11-20 15:35:23 +03:00
use Sabre\DAV\Xml\Property\Href ;
2016-01-28 22:30:40 +03:00
use Sabre\DAVACL\IACL ;
2015-10-31 03:28:21 +03:00
/**
* Class CalDavBackendTest
*
* @ group DB
*
2016-05-25 17:04:15 +03:00
* @ package OCA\DAV\Tests\unit\CalDAV
2015-10-31 03:28:21 +03:00
*/
2016-05-31 18:16:28 +03:00
class CalDavBackendTest extends AbstractCalDavBackendTest {
2015-10-31 03:28:21 +03:00
public function testCalendarOperations () {
$calendarId = $this -> createTestCalendar ();
// update it's display name
$patch = new PropPatch ([
'{DAV:}displayname' => 'Unit test' ,
'{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar used for unit testing'
]);
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::updateCalendar' );
2015-10-31 03:28:21 +03:00
$this -> backend -> updateCalendar ( $calendarId , $patch );
$patch -> commit ();
2016-08-30 16:11:33 +03:00
$this -> assertEquals ( 1 , $this -> backend -> getCalendarsForUserCount ( self :: UNIT_TEST_USER ));
2017-03-02 13:45:07 +03:00
$calendars = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER );
$this -> assertCount ( 1 , $calendars );
$this -> assertEquals ( 'Unit test' , $calendars [ 0 ][ '{DAV:}displayname' ]);
$this -> assertEquals ( 'Calendar used for unit testing' , $calendars [ 0 ][ '{urn:ietf:params:xml:ns:caldav}calendar-description' ]);
2017-04-19 17:18:44 +03:00
$this -> assertEquals ( 'User\'s displayname' , $calendars [ 0 ][ '{http://nextcloud.com/ns}owner-displayname' ]);
2015-10-31 03:28:21 +03:00
// delete the address book
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar' );
2017-03-02 13:45:07 +03:00
$this -> backend -> deleteCalendar ( $calendars [ 0 ][ 'id' ]);
$calendars = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER );
$this -> assertCount ( 0 , $calendars );
2015-10-31 03:28:21 +03:00
}
2016-01-28 22:30:40 +03:00
public function providesSharingData () {
return [
[ true , true , true , false , [
[
'href' => 'principal:' . self :: UNIT_TEST_USER1 ,
'readOnly' => false
],
[
'href' => 'principal:' . self :: UNIT_TEST_GROUP ,
'readOnly' => true
]
]],
2017-03-02 14:27:59 +03:00
[ true , true , true , false , [
[
'href' => 'principal:' . self :: UNIT_TEST_GROUP ,
'readOnly' => true ,
],
[
'href' => 'principal:' . self :: UNIT_TEST_GROUP2 ,
'readOnly' => false ,
],
]],
[ true , true , true , true , [
[
'href' => 'principal:' . self :: UNIT_TEST_GROUP ,
'readOnly' => false ,
],
[
'href' => 'principal:' . self :: UNIT_TEST_GROUP2 ,
'readOnly' => true ,
],
]],
2016-01-28 22:30:40 +03:00
[ true , false , false , false , [
[
'href' => 'principal:' . self :: UNIT_TEST_USER1 ,
'readOnly' => true
],
]],
];
}
/**
* @ dataProvider providesSharingData
*/
public function testCalendarSharing ( $userCanRead , $userCanWrite , $groupCanRead , $groupCanWrite , $add ) {
2016-01-28 19:16:11 +03:00
2017-03-02 13:45:07 +03:00
/** @var IL10N|\PHPUnit_Framework_MockObject_MockObject $l10n */
$l10n = $this -> createMock ( IL10N :: class );
2016-04-14 16:38:00 +03:00
$l10n
-> expects ( $this -> any ())
-> method ( 't' )
-> will ( $this -> returnCallback ( function ( $text , $parameters = array ()) {
return vsprintf ( $text , $parameters );
}));
2016-01-28 22:30:40 +03:00
$calendarId = $this -> createTestCalendar ();
2017-03-02 13:45:07 +03:00
$calendars = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER );
$this -> assertCount ( 1 , $calendars );
$calendar = new Calendar ( $this -> backend , $calendars [ 0 ], $l10n );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::updateShares' );
2016-01-28 22:30:40 +03:00
$this -> backend -> updateShares ( $calendar , $add , []);
2017-03-02 13:45:07 +03:00
$calendars = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER1 );
$this -> assertCount ( 1 , $calendars );
$calendar = new Calendar ( $this -> backend , $calendars [ 0 ], $l10n );
2016-01-28 22:30:40 +03:00
$acl = $calendar -> getACL ();
$this -> assertAcl ( self :: UNIT_TEST_USER , '{DAV:}read' , $acl );
$this -> assertAcl ( self :: UNIT_TEST_USER , '{DAV:}write' , $acl );
$this -> assertAccess ( $userCanRead , self :: UNIT_TEST_USER1 , '{DAV:}read' , $acl );
$this -> assertAccess ( $userCanWrite , self :: UNIT_TEST_USER1 , '{DAV:}write' , $acl );
$this -> assertEquals ( self :: UNIT_TEST_USER , $calendar -> getOwner ());
// test acls on the child
2017-03-02 13:45:07 +03:00
$uri = static :: getUniqueID ( 'calobj' );
2016-01-28 22:30:40 +03:00
$calData = <<< 'EOD'
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
SUMMARY : Test Event
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
CLASS : PUBLIC
END : VEVENT
END : VCALENDAR
EOD ;
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject' );
2016-01-28 22:30:40 +03:00
$this -> backend -> createCalendarObject ( $calendarId , $uri , $calData );
/** @var IACL $child */
$child = $calendar -> getChild ( $uri );
$acl = $child -> getACL ();
$this -> assertAcl ( self :: UNIT_TEST_USER , '{DAV:}read' , $acl );
$this -> assertAcl ( self :: UNIT_TEST_USER , '{DAV:}write' , $acl );
$this -> assertAccess ( $userCanRead , self :: UNIT_TEST_USER1 , '{DAV:}read' , $acl );
$this -> assertAccess ( $userCanWrite , self :: UNIT_TEST_USER1 , '{DAV:}write' , $acl );
2016-01-28 19:16:11 +03:00
// delete the address book
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendar' );
2017-03-02 13:45:07 +03:00
$this -> backend -> deleteCalendar ( $calendars [ 0 ][ 'id' ]);
$calendars = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER );
$this -> assertCount ( 0 , $calendars );
2016-01-28 19:16:11 +03:00
}
2015-10-31 03:28:21 +03:00
public function testCalendarObjectsOperations () {
$calendarId = $this -> createTestCalendar ();
// create a card
2017-03-02 13:45:07 +03:00
$uri = static :: getUniqueID ( 'calobj' );
2015-10-31 03:28:21 +03:00
$calData = <<< 'EOD'
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
SUMMARY : Test Event
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
CLASS : PUBLIC
END : VEVENT
END : VCALENDAR
EOD ;
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> createCalendarObject ( $calendarId , $uri , $calData );
// get all the cards
$calendarObjects = $this -> backend -> getCalendarObjects ( $calendarId );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 1 , $calendarObjects );
2015-10-31 03:28:21 +03:00
$this -> assertEquals ( $calendarId , $calendarObjects [ 0 ][ 'calendarid' ]);
2016-05-31 18:16:28 +03:00
$this -> assertArrayHasKey ( 'classification' , $calendarObjects [ 0 ]);
2015-10-31 03:28:21 +03:00
// get the cards
$calendarObject = $this -> backend -> getCalendarObject ( $calendarId , $uri );
$this -> assertNotNull ( $calendarObject );
$this -> assertArrayHasKey ( 'id' , $calendarObject );
$this -> assertArrayHasKey ( 'uri' , $calendarObject );
$this -> assertArrayHasKey ( 'lastmodified' , $calendarObject );
$this -> assertArrayHasKey ( 'etag' , $calendarObject );
$this -> assertArrayHasKey ( 'size' , $calendarObject );
2016-05-31 18:16:28 +03:00
$this -> assertArrayHasKey ( 'classification' , $calendarObject );
2015-10-31 03:28:21 +03:00
$this -> assertEquals ( $calData , $calendarObject [ 'calendardata' ]);
// update the card
$calData = <<< 'EOD'
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
SUMMARY : Test Event
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
END : VEVENT
END : VCALENDAR
EOD ;
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::updateCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> updateCalendarObject ( $calendarId , $uri , $calData );
$calendarObject = $this -> backend -> getCalendarObject ( $calendarId , $uri );
$this -> assertEquals ( $calData , $calendarObject [ 'calendardata' ]);
// delete the card
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> deleteCalendarObject ( $calendarId , $uri );
$calendarObjects = $this -> backend -> getCalendarObjects ( $calendarId );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 0 , $calendarObjects );
2015-10-31 03:28:21 +03:00
}
public function testMultiCalendarObjects () {
$calendarId = $this -> createTestCalendar ();
// create an event
$calData = <<< 'EOD'
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
SUMMARY : Test Event
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
CLASS : PUBLIC
END : VEVENT
END : VCALENDAR
EOD ;
2017-03-02 13:45:07 +03:00
$uri0 = static :: getUniqueID ( 'card' );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> createCalendarObject ( $calendarId , $uri0 , $calData );
2017-03-02 13:45:07 +03:00
$uri1 = static :: getUniqueID ( 'card' );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> createCalendarObject ( $calendarId , $uri1 , $calData );
2017-03-02 13:45:07 +03:00
$uri2 = static :: getUniqueID ( 'card' );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> createCalendarObject ( $calendarId , $uri2 , $calData );
// get all the cards
$calendarObjects = $this -> backend -> getCalendarObjects ( $calendarId );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 3 , $calendarObjects );
2015-10-31 03:28:21 +03:00
// get the cards
$calendarObjects = $this -> backend -> getMultipleCalendarObjects ( $calendarId , [ $uri1 , $uri2 ]);
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 2 , $calendarObjects );
2015-10-31 03:28:21 +03:00
foreach ( $calendarObjects as $card ) {
$this -> assertArrayHasKey ( 'id' , $card );
$this -> assertArrayHasKey ( 'uri' , $card );
$this -> assertArrayHasKey ( 'lastmodified' , $card );
$this -> assertArrayHasKey ( 'etag' , $card );
$this -> assertArrayHasKey ( 'size' , $card );
2016-05-31 18:16:28 +03:00
$this -> assertArrayHasKey ( 'classification' , $card );
2015-10-31 03:28:21 +03:00
$this -> assertEquals ( $calData , $card [ 'calendardata' ]);
}
// delete the card
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> deleteCalendarObject ( $calendarId , $uri0 );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> deleteCalendarObject ( $calendarId , $uri1 );
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::deleteCalendarObject' );
2015-10-31 03:28:21 +03:00
$this -> backend -> deleteCalendarObject ( $calendarId , $uri2 );
$calendarObjects = $this -> backend -> getCalendarObjects ( $calendarId );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 0 , $calendarObjects );
2015-10-31 03:28:21 +03:00
}
/**
* @ dataProvider providesCalendarQueryParameters
*/
public function testCalendarQuery ( $expectedEventsInResult , $propFilters , $compFilter ) {
$calendarId = $this -> createTestCalendar ();
$events = [];
$events [ 0 ] = $this -> createEvent ( $calendarId , '20130912T130000Z' , '20130912T140000Z' );
$events [ 1 ] = $this -> createEvent ( $calendarId , '20130912T150000Z' , '20130912T170000Z' );
$events [ 2 ] = $this -> createEvent ( $calendarId , '20130912T173000Z' , '20130912T220000Z' );
2016-04-25 15:32:41 +03:00
$events [ 3 ] = $this -> createEvent ( $calendarId , '21130912T130000Z' , '22130912T130000Z' );
2015-10-31 03:28:21 +03:00
$result = $this -> backend -> calendarQuery ( $calendarId , [
'name' => '' ,
'prop-filters' => $propFilters ,
'comp-filters' => $compFilter
]);
$expectedEventsInResult = array_map ( function ( $index ) use ( $events ) {
return $events [ $index ];
}, $expectedEventsInResult );
$this -> assertEquals ( $expectedEventsInResult , $result , '' , 0.0 , 10 , true );
}
public function testGetCalendarObjectByUID () {
$calendarId = $this -> createTestCalendar ();
$this -> createEvent ( $calendarId , '20130912T130000Z' , '20130912T140000Z' );
$co = $this -> backend -> getCalendarObjectByUID ( self :: UNIT_TEST_USER , '47d15e3ec8' );
$this -> assertNotNull ( $co );
}
public function providesCalendarQueryParameters () {
return [
2016-04-25 15:32:41 +03:00
'all' => [[ 0 , 1 , 2 , 3 ], [], []],
2015-10-31 03:28:21 +03:00
'only-todos' => [[], [ 'name' => 'VTODO' ], []],
2016-04-25 15:32:41 +03:00
'only-events' => [[ 0 , 1 , 2 , 3 ], [], [[ 'name' => 'VEVENT' , 'is-not-defined' => false , 'comp-filters' => [], 'time-range' => [ 'start' => null , 'end' => null ], 'prop-filters' => []]],],
'start' => [[ 1 , 2 , 3 ], [], [[ 'name' => 'VEVENT' , 'is-not-defined' => false , 'comp-filters' => [], 'time-range' => [ 'start' => new DateTime ( '2013-09-12 14:00:00' , new DateTimeZone ( 'UTC' )), 'end' => null ], 'prop-filters' => []]],],
2015-10-31 03:28:21 +03:00
'end' => [[ 0 ], [], [[ 'name' => 'VEVENT' , 'is-not-defined' => false , 'comp-filters' => [], 'time-range' => [ 'start' => null , 'end' => new DateTime ( '2013-09-12 14:00:00' , new DateTimeZone ( 'UTC' ))], 'prop-filters' => []]],],
2016-04-25 15:32:41 +03:00
'future' => [[ 3 ], [], [[ 'name' => 'VEVENT' , 'is-not-defined' => false , 'comp-filters' => [], 'time-range' => [ 'start' => new DateTime ( '2099-09-12 14:00:00' , new DateTimeZone ( 'UTC' )), 'end' => null ], 'prop-filters' => []]],],
2015-10-31 03:28:21 +03:00
];
}
public function testSyncSupport () {
$calendarId = $this -> createTestCalendar ();
// fist call without synctoken
$changes = $this -> backend -> getChangesForCalendar ( $calendarId , '' , 1 );
$syncToken = $changes [ 'syncToken' ];
// add a change
$event = $this -> createEvent ( $calendarId , '20130912T130000Z' , '20130912T140000Z' );
// look for changes
$changes = $this -> backend -> getChangesForCalendar ( $calendarId , $syncToken , 1 );
$this -> assertEquals ( $event , $changes [ 'added' ][ 0 ]);
}
2016-07-20 15:08:45 +03:00
public function testPublications () {
2016-11-03 14:28:12 +03:00
$this -> dispatcher -> expects ( $this -> at ( 0 ))
-> method ( 'dispatch' )
-> with ( '\OCA\DAV\CalDAV\CalDavBackend::createCalendar' );
2016-07-20 15:08:45 +03:00
$this -> backend -> createCalendar ( self :: UNIT_TEST_USER , 'Example' , []);
$calendarInfo = $this -> backend -> getCalendarsForUser ( self :: UNIT_TEST_USER )[ 0 ];
2017-03-02 13:45:07 +03:00
/** @var IL10N|\PHPUnit_Framework_MockObject_MockObject $l10n */
$l10n = $this -> createMock ( IL10N :: class );
2016-07-20 15:08:45 +03:00
$calendar = new Calendar ( $this -> backend , $calendarInfo , $l10n );
2016-08-14 20:08:01 +03:00
$calendar -> setPublishStatus ( true );
2016-09-15 18:09:24 +03:00
$this -> assertNotEquals ( false , $calendar -> getPublishStatus ());
2016-07-20 15:08:45 +03:00
$publicCalendars = $this -> backend -> getPublicCalendars ();
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 1 , $publicCalendars );
2016-07-20 15:08:45 +03:00
$this -> assertEquals ( true , $publicCalendars [ 0 ][ '{http://owncloud.org/ns}public' ]);
2017-04-19 17:18:44 +03:00
$this -> assertEquals ( 'User\'s displayname' , $publicCalendars [ 0 ][ '{http://nextcloud.com/ns}owner-displayname' ]);
2016-07-20 15:08:45 +03:00
2016-09-03 11:52:05 +03:00
$publicCalendarURI = $publicCalendars [ 0 ][ 'uri' ];
2016-08-14 20:08:01 +03:00
$publicCalendar = $this -> backend -> getPublicCalendar ( $publicCalendarURI );
$this -> assertEquals ( true , $publicCalendar [ '{http://owncloud.org/ns}public' ]);
$calendar -> setPublishStatus ( false );
$this -> assertEquals ( false , $calendar -> getPublishStatus ());
$this -> setExpectedException ( 'Sabre\DAV\Exception\NotFound' );
2016-10-13 12:04:22 +03:00
$this -> backend -> getPublicCalendar ( $publicCalendarURI );
2016-07-20 15:08:45 +03:00
}
2015-10-31 03:28:21 +03:00
public function testSubscriptions () {
$id = $this -> backend -> createSubscription ( self :: UNIT_TEST_USER , 'Subscription' , [
2016-07-01 14:42:35 +03:00
'{http://calendarserver.org/ns/}source' => new Href ( 'test-source' ),
'{http://apple.com/ns/ical/}calendar-color' => '#1C4587' ,
'{http://calendarserver.org/ns/}subscribed-strip-todos' => ''
2015-10-31 03:28:21 +03:00
]);
$subscriptions = $this -> backend -> getSubscriptionsForUser ( self :: UNIT_TEST_USER );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 1 , $subscriptions );
2016-07-01 14:42:35 +03:00
$this -> assertEquals ( '#1C4587' , $subscriptions [ 0 ][ '{http://apple.com/ns/ical/}calendar-color' ]);
$this -> assertEquals ( true , $subscriptions [ 0 ][ '{http://calendarserver.org/ns/}subscribed-strip-todos' ]);
2015-10-31 03:28:21 +03:00
$this -> assertEquals ( $id , $subscriptions [ 0 ][ 'id' ]);
$patch = new PropPatch ([
'{DAV:}displayname' => 'Unit test' ,
2016-07-01 14:42:35 +03:00
'{http://apple.com/ns/ical/}calendar-color' => '#ac0606' ,
2015-10-31 03:28:21 +03:00
]);
$this -> backend -> updateSubscription ( $id , $patch );
$patch -> commit ();
$subscriptions = $this -> backend -> getSubscriptionsForUser ( self :: UNIT_TEST_USER );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 1 , $subscriptions );
2015-10-31 03:28:21 +03:00
$this -> assertEquals ( $id , $subscriptions [ 0 ][ 'id' ]);
$this -> assertEquals ( 'Unit test' , $subscriptions [ 0 ][ '{DAV:}displayname' ]);
2016-07-01 14:42:35 +03:00
$this -> assertEquals ( '#ac0606' , $subscriptions [ 0 ][ '{http://apple.com/ns/ical/}calendar-color' ]);
2015-10-31 03:28:21 +03:00
$this -> backend -> deleteSubscription ( $id );
$subscriptions = $this -> backend -> getSubscriptionsForUser ( self :: UNIT_TEST_USER );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 0 , $subscriptions );
2015-10-31 03:28:21 +03:00
}
2015-11-16 17:49:46 +03:00
public function testScheduling () {
$this -> backend -> createSchedulingObject ( self :: UNIT_TEST_USER , 'Sample Schedule' , '' );
$sos = $this -> backend -> getSchedulingObjects ( self :: UNIT_TEST_USER );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 1 , $sos );
2015-11-16 17:49:46 +03:00
$so = $this -> backend -> getSchedulingObject ( self :: UNIT_TEST_USER , 'Sample Schedule' );
$this -> assertNotNull ( $so );
$this -> backend -> deleteSchedulingObject ( self :: UNIT_TEST_USER , 'Sample Schedule' );
$sos = $this -> backend -> getSchedulingObjects ( self :: UNIT_TEST_USER );
2017-03-02 13:45:07 +03:00
$this -> assertCount ( 0 , $sos );
2015-11-16 17:49:46 +03:00
}
2016-01-28 22:30:40 +03:00
2016-03-09 20:13:34 +03:00
/**
* @ dataProvider providesCalDataForGetDenormalizedData
*/
2016-04-19 12:33:37 +03:00
public function testGetDenormalizedData ( $expected , $key , $calData ) {
$actual = $this -> backend -> getDenormalizedData ( $calData );
$this -> assertEquals ( $expected , $actual [ $key ]);
2016-03-09 20:13:34 +03:00
}
public function providesCalDataForGetDenormalizedData () {
return [
2016-10-13 13:15:10 +03:00
'first occurrence before unix epoch starts' => [ 0 , 'firstOccurence' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//Sabre//Sabre VObject 4.1.1//EN \r \n CALSCALE:GREGORIAN \r \n BEGIN:VEVENT \r \n UID:413F269B-B51B-46B1-AFB6-40055C53A4DC \r \n DTSTAMP:20160309T095056Z \r \n DTSTART;VALUE=DATE:16040222 \r \n DTEND;VALUE=DATE:16040223 \r \n RRULE:FREQ=YEARLY \r \n SUMMARY:SUMMARY \r \n TRANSP:TRANSPARENT \r \n END:VEVENT \r \n END:VCALENDAR \r \n " ],
'no first occurrence because yearly' => [ null , 'firstOccurence' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//Sabre//Sabre VObject 4.1.1//EN \r \n CALSCALE:GREGORIAN \r \n BEGIN:VEVENT \r \n UID:413F269B-B51B-46B1-AFB6-40055C53A4DC \r \n DTSTAMP:20160309T095056Z \r \n RRULE:FREQ=YEARLY \r \n SUMMARY:SUMMARY \r \n TRANSP:TRANSPARENT \r \n END:VEVENT \r \n END:VCALENDAR \r \n " ],
2016-04-19 12:33:37 +03:00
'CLASS:PRIVATE' => [ CalDavBackend :: CLASSIFICATION_PRIVATE , 'classification' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//dmfs.org//mimedir.icalendar//EN \r \n BEGIN:VTIMEZONE \r \n TZID:Europe/Berlin \r \n X-LIC-LOCATION:Europe/Berlin \r \n BEGIN:DAYLIGHT \r \n TZOFFSETFROM:+0100 \r \n TZOFFSETTO:+0200 \r \n TZNAME:CEST \r \n DTSTART:19700329T020000 \r \n RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU \r \n END:DAYLIGHT \r \n BEGIN:STANDARD \r \n TZOFFSETFROM:+0200 \r \n TZOFFSETTO:+0100 \r \n TZNAME:CET \r \n DTSTART:19701025T030000 \r \n RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU \r \n END:STANDARD \r \n END:VTIMEZONE \r \n BEGIN:VEVENT \r \n DTSTART;TZID=Europe/Berlin:20160419T130000 \r \n SUMMARY:Test \r \n CLASS:PRIVATE \r \n TRANSP:OPAQUE \r \n STATUS:CONFIRMED \r \n DTEND;TZID=Europe/Berlin:20160419T140000 \r \n LAST-MODIFIED:20160419T074202Z \r \n DTSTAMP:20160419T074202Z \r \n CREATED:20160419T074202Z \r \n UID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310 \r \n END:VEVENT \r \n END:VCALENDAR " ],
'CLASS:PUBLIC' => [ CalDavBackend :: CLASSIFICATION_PUBLIC , 'classification' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//dmfs.org//mimedir.icalendar//EN \r \n BEGIN:VTIMEZONE \r \n TZID:Europe/Berlin \r \n X-LIC-LOCATION:Europe/Berlin \r \n BEGIN:DAYLIGHT \r \n TZOFFSETFROM:+0100 \r \n TZOFFSETTO:+0200 \r \n TZNAME:CEST \r \n DTSTART:19700329T020000 \r \n RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU \r \n END:DAYLIGHT \r \n BEGIN:STANDARD \r \n TZOFFSETFROM:+0200 \r \n TZOFFSETTO:+0100 \r \n TZNAME:CET \r \n DTSTART:19701025T030000 \r \n RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU \r \n END:STANDARD \r \n END:VTIMEZONE \r \n BEGIN:VEVENT \r \n DTSTART;TZID=Europe/Berlin:20160419T130000 \r \n SUMMARY:Test \r \n CLASS:PUBLIC \r \n TRANSP:OPAQUE \r \n STATUS:CONFIRMED \r \n DTEND;TZID=Europe/Berlin:20160419T140000 \r \n LAST-MODIFIED:20160419T074202Z \r \n DTSTAMP:20160419T074202Z \r \n CREATED:20160419T074202Z \r \n UID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310 \r \n END:VEVENT \r \n END:VCALENDAR " ],
'CLASS:CONFIDENTIAL' => [ CalDavBackend :: CLASSIFICATION_CONFIDENTIAL , 'classification' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//dmfs.org//mimedir.icalendar//EN \r \n BEGIN:VTIMEZONE \r \n TZID:Europe/Berlin \r \n X-LIC-LOCATION:Europe/Berlin \r \n BEGIN:DAYLIGHT \r \n TZOFFSETFROM:+0100 \r \n TZOFFSETTO:+0200 \r \n TZNAME:CEST \r \n DTSTART:19700329T020000 \r \n RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU \r \n END:DAYLIGHT \r \n BEGIN:STANDARD \r \n TZOFFSETFROM:+0200 \r \n TZOFFSETTO:+0100 \r \n TZNAME:CET \r \n DTSTART:19701025T030000 \r \n RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU \r \n END:STANDARD \r \n END:VTIMEZONE \r \n BEGIN:VEVENT \r \n DTSTART;TZID=Europe/Berlin:20160419T130000 \r \n SUMMARY:Test \r \n CLASS:CONFIDENTIAL \r \n TRANSP:OPAQUE \r \n STATUS:CONFIRMED \r \n DTEND;TZID=Europe/Berlin:20160419T140000 \r \n LAST-MODIFIED:20160419T074202Z \r \n DTSTAMP:20160419T074202Z \r \n CREATED:20160419T074202Z \r \n UID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310 \r \n END:VEVENT \r \n END:VCALENDAR " ],
'no class set -> public' => [ CalDavBackend :: CLASSIFICATION_PUBLIC , 'classification' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//dmfs.org//mimedir.icalendar//EN \r \n BEGIN:VTIMEZONE \r \n TZID:Europe/Berlin \r \n X-LIC-LOCATION:Europe/Berlin \r \n BEGIN:DAYLIGHT \r \n TZOFFSETFROM:+0100 \r \n TZOFFSETTO:+0200 \r \n TZNAME:CEST \r \n DTSTART:19700329T020000 \r \n RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU \r \n END:DAYLIGHT \r \n BEGIN:STANDARD \r \n TZOFFSETFROM:+0200 \r \n TZOFFSETTO:+0100 \r \n TZNAME:CET \r \n DTSTART:19701025T030000 \r \n RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU \r \n END:STANDARD \r \n END:VTIMEZONE \r \n BEGIN:VEVENT \r \n DTSTART;TZID=Europe/Berlin:20160419T130000 \r \n SUMMARY:Test \r \n TRANSP:OPAQUE \r \n DTEND;TZID=Europe/Berlin:20160419T140000 \r \n LAST-MODIFIED:20160419T074202Z \r \n DTSTAMP:20160419T074202Z \r \n CREATED:20160419T074202Z \r \n UID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310 \r \n END:VEVENT \r \n END:VCALENDAR " ],
'unknown class -> private' => [ CalDavBackend :: CLASSIFICATION_PRIVATE , 'classification' , " BEGIN:VCALENDAR \r \n VERSION:2.0 \r \n PRODID:-//dmfs.org//mimedir.icalendar//EN \r \n BEGIN:VTIMEZONE \r \n TZID:Europe/Berlin \r \n X-LIC-LOCATION:Europe/Berlin \r \n BEGIN:DAYLIGHT \r \n TZOFFSETFROM:+0100 \r \n TZOFFSETTO:+0200 \r \n TZNAME:CEST \r \n DTSTART:19700329T020000 \r \n RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU \r \n END:DAYLIGHT \r \n BEGIN:STANDARD \r \n TZOFFSETFROM:+0200 \r \n TZOFFSETTO:+0100 \r \n TZNAME:CET \r \n DTSTART:19701025T030000 \r \n RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU \r \n END:STANDARD \r \n END:VTIMEZONE \r \n BEGIN:VEVENT \r \n DTSTART;TZID=Europe/Berlin:20160419T130000 \r \n SUMMARY:Test \r \n CLASS:VERTRAULICH \r \n TRANSP:OPAQUE \r \n STATUS:CONFIRMED \r \n DTEND;TZID=Europe/Berlin:20160419T140000 \r \n LAST-MODIFIED:20160419T074202Z \r \n DTSTAMP:20160419T074202Z \r \n CREATED:20160419T074202Z \r \n UID:2e468c48-7860-492e-bc52-92fa0daeeccf.1461051722310 \r \n END:VEVENT \r \n END:VCALENDAR " ],
2016-03-09 20:13:34 +03:00
];
}
2017-04-25 20:26:47 +03:00
public function testCalendarSearch () {
$calendarId = $this -> createTestCalendar ();
$uri = static :: getUniqueID ( 'calobj' );
$calData = <<< EOD
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
SUMMARY : Test Event
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
CLASS : PUBLIC
END : VEVENT
END : VCALENDAR
EOD ;
$this -> backend -> createCalendarObject ( $calendarId , $uri , $calData );
$search1 = $this -> backend -> calendarSearch ( self :: UNIT_TEST_USER , [
'comps' => [
'VEVENT' ,
'VTODO'
],
'props' => [
'SUMMARY' ,
'LOCATION'
],
'search-term' => 'Test' ,
]);
$this -> assertEquals ( count ( $search1 ), 1 );
// update the card
$calData = <<< 'EOD'
BEGIN : VCALENDAR
VERSION : 2.0
PRODID : ownCloud Calendar
BEGIN : VEVENT
CREATED ; VALUE = DATE - TIME : 20130910 T125139Z
UID : 47 d15e3ec8
LAST - MODIFIED ; VALUE = DATE - TIME : 20130910 T125139Z
DTSTAMP ; VALUE = DATE - TIME : 20130910 T125139Z
2017-05-21 14:18:58 +03:00
SUMMARY : 123 Event 🙈
2017-04-25 20:26:47 +03:00
DTSTART ; VALUE = DATE - TIME : 20130912 T130000Z
DTEND ; VALUE = DATE - TIME : 20130912 T140000Z
ATTENDEE ; CN = test : mailto : foo @ bar . com
END : VEVENT
END : VCALENDAR
EOD ;
$this -> backend -> updateCalendarObject ( $calendarId , $uri , $calData );
$search2 = $this -> backend -> calendarSearch ( self :: UNIT_TEST_USER , [
'comps' => [
'VEVENT' ,
'VTODO'
],
'props' => [
'SUMMARY' ,
'LOCATION'
],
'search-term' => 'Test' ,
]);
$this -> assertEquals ( count ( $search2 ), 0 );
$search3 = $this -> backend -> calendarSearch ( self :: UNIT_TEST_USER , [
'comps' => [
'VEVENT' ,
'VTODO'
],
'props' => [
'SUMMARY' ,
'LOCATION'
],
'params' => [
[
'property' => 'ATTENDEE' ,
'parameter' => 'CN'
]
],
'search-term' => 'Test' ,
]);
$this -> assertEquals ( count ( $search3 ), 1 );
// t matches both summary and attendee's CN, but we want unique results
$search4 = $this -> backend -> calendarSearch ( self :: UNIT_TEST_USER , [
'comps' => [
'VEVENT' ,
'VTODO'
],
'props' => [
'SUMMARY' ,
'LOCATION'
],
'params' => [
[
'property' => 'ATTENDEE' ,
'parameter' => 'CN'
]
],
'search-term' => 't' ,
]);
$this -> assertEquals ( count ( $search4 ), 1 );
$this -> backend -> deleteCalendarObject ( $calendarId , $uri );
$search5 = $this -> backend -> calendarSearch ( self :: UNIT_TEST_USER , [
'comps' => [
'VEVENT' ,
'VTODO'
],
'props' => [
'SUMMARY' ,
'LOCATION'
],
'params' => [
[
'property' => 'ATTENDEE' ,
'parameter' => 'CN'
]
],
'search-term' => 't' ,
]);
$this -> assertEquals ( count ( $search5 ), 0 );
}
2015-10-31 03:28:21 +03:00
}