2016-11-09 13:52:40 +03:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* @copyright Copyright (c) 2016 Lukas Reschke <lukas@statuscode.ch>
|
|
|
|
*
|
2020-04-29 12:57:22 +03:00
|
|
|
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
2019-12-03 21:57:53 +03:00
|
|
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
2017-11-06 17:56:42 +03:00
|
|
|
* @author Lukas Reschke <lukas@statuscode.ch>
|
2019-12-03 21:57:53 +03:00
|
|
|
* @author Roeland Jago Douma <roeland@famdouma.nl>
|
2020-04-29 12:57:22 +03:00
|
|
|
* @author Thomas Citharel <nextcloud@tcit.fr>
|
2017-11-06 17:56:42 +03:00
|
|
|
*
|
2016-11-09 13:52:40 +03:00
|
|
|
* @license GNU AGPL version 3 or any later version
|
|
|
|
*
|
|
|
|
* This program is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License as
|
|
|
|
* published by the Free Software Foundation, either version 3 of the
|
|
|
|
* License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* 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
|
2019-12-03 21:57:53 +03:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
2016-11-09 13:52:40 +03:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace OCA\DAV\Tests\unit\CalDAV\Schedule;
|
|
|
|
|
2020-03-08 19:33:27 +03:00
|
|
|
use OCA\DAV\CalDAV\CalDavBackend;
|
|
|
|
use OCA\DAV\CalDAV\CalendarHome;
|
|
|
|
use OCA\DAV\CalDAV\Plugin as CalDAVPlugin;
|
2016-11-09 13:52:40 +03:00
|
|
|
use OCA\DAV\CalDAV\Schedule\Plugin;
|
2020-03-08 19:33:27 +03:00
|
|
|
use OCP\IConfig;
|
|
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
|
|
use Sabre\DAV\PropFind;
|
2016-11-09 13:52:40 +03:00
|
|
|
use Sabre\DAV\Server;
|
2020-03-08 19:33:27 +03:00
|
|
|
use Sabre\DAV\Tree;
|
2016-11-09 13:52:40 +03:00
|
|
|
use Sabre\DAV\Xml\Property\Href;
|
2020-03-08 19:33:27 +03:00
|
|
|
use Sabre\DAV\Xml\Property\LocalHref;
|
|
|
|
use Sabre\DAVACL\IPrincipal;
|
|
|
|
use Sabre\HTTP\ResponseInterface;
|
2019-07-30 13:58:35 +03:00
|
|
|
use Sabre\VObject\Parameter;
|
|
|
|
use Sabre\VObject\Property\ICalendar\CalAddress;
|
2020-03-08 19:33:27 +03:00
|
|
|
use Sabre\Xml\Service;
|
2016-11-09 13:52:40 +03:00
|
|
|
use Test\TestCase;
|
|
|
|
|
2020-04-10 15:19:56 +03:00
|
|
|
class PluginTest extends TestCase {
|
2016-11-09 13:52:40 +03:00
|
|
|
/** @var Plugin */
|
|
|
|
private $plugin;
|
2020-03-08 19:33:27 +03:00
|
|
|
/** @var Server|MockObject */
|
2016-11-09 13:52:40 +03:00
|
|
|
private $server;
|
|
|
|
|
2020-03-08 19:33:27 +03:00
|
|
|
/** @var IConfig|MockObject */
|
|
|
|
private $config;
|
|
|
|
|
2019-11-27 17:27:18 +03:00
|
|
|
protected function setUp(): void {
|
2016-11-09 13:52:40 +03:00
|
|
|
parent::setUp();
|
|
|
|
|
|
|
|
$this->server = $this->createMock(Server::class);
|
2020-03-08 19:33:27 +03:00
|
|
|
$this->config = $this->createMock(IConfig::class);
|
|
|
|
|
|
|
|
$response = $this->getMockBuilder(ResponseInterface::class)
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
2016-11-09 13:52:40 +03:00
|
|
|
|
2020-03-08 19:33:27 +03:00
|
|
|
$this->server->httpResponse = $response;
|
|
|
|
$this->server->xml = new Service();
|
|
|
|
|
|
|
|
$this->plugin = new Plugin($this->config);
|
2016-11-09 13:52:40 +03:00
|
|
|
$this->plugin->initialize($this->server);
|
|
|
|
}
|
|
|
|
|
2020-03-08 19:33:27 +03:00
|
|
|
public function testInitialize() {
|
|
|
|
$plugin = new Plugin($this->config);
|
|
|
|
|
|
|
|
$this->server->expects($this->at(7))
|
|
|
|
->method('on')
|
|
|
|
->with('propFind', [$plugin, 'propFindDefaultCalendarUrl'], 90);
|
|
|
|
|
|
|
|
$this->server->expects($this->at(8))
|
|
|
|
->method('on')
|
|
|
|
->with('afterWriteContent', [$plugin, 'dispatchSchedulingResponses']);
|
|
|
|
|
|
|
|
$this->server->expects($this->at(9))
|
|
|
|
->method('on')
|
|
|
|
->with('afterCreateFile', [$plugin, 'dispatchSchedulingResponses']);
|
|
|
|
|
|
|
|
$plugin->initialize($this->server);
|
|
|
|
}
|
|
|
|
|
2016-11-09 13:52:40 +03:00
|
|
|
public function testGetAddressesForPrincipal() {
|
|
|
|
$href = $this->createMock(Href::class);
|
|
|
|
$href
|
|
|
|
->expects($this->once())
|
|
|
|
->method('getHrefs')
|
|
|
|
->willReturn(['lukas@nextcloud.com', 'rullzer@nextcloud.com']);
|
|
|
|
$this->server
|
|
|
|
->expects($this->once())
|
|
|
|
->method('getProperties')
|
|
|
|
->with(
|
|
|
|
'MyPrincipal',
|
|
|
|
[
|
|
|
|
'{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',
|
|
|
|
]
|
|
|
|
)
|
|
|
|
->willReturn([
|
|
|
|
'{urn:ietf:params:xml:ns:caldav}calendar-user-address-set' => $href
|
|
|
|
]);
|
|
|
|
|
|
|
|
$result = $this->invokePrivate($this->plugin, 'getAddressesForPrincipal', ['MyPrincipal']);
|
|
|
|
$this->assertSame(['lukas@nextcloud.com', 'rullzer@nextcloud.com'], $result);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function testGetAddressesForPrincipalEmpty() {
|
|
|
|
$this->server
|
|
|
|
->expects($this->once())
|
|
|
|
->method('getProperties')
|
|
|
|
->with(
|
|
|
|
'MyPrincipal',
|
|
|
|
[
|
|
|
|
'{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',
|
|
|
|
]
|
|
|
|
)
|
|
|
|
->willReturn(null);
|
|
|
|
|
|
|
|
$result = $this->invokePrivate($this->plugin, 'getAddressesForPrincipal', ['MyPrincipal']);
|
|
|
|
$this->assertSame([], $result);
|
|
|
|
}
|
2019-07-30 13:58:35 +03:00
|
|
|
|
|
|
|
public function testStripOffMailTo() {
|
|
|
|
$this->assertEquals('test@example.com', $this->invokePrivate($this->plugin, 'stripOffMailTo', ['test@example.com']));
|
|
|
|
$this->assertEquals('test@example.com', $this->invokePrivate($this->plugin, 'stripOffMailTo', ['mailto:test@example.com']));
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testGetAttendeeRSVP() {
|
|
|
|
$property1 = $this->createMock(CalAddress::class);
|
|
|
|
$parameter1 = $this->createMock(Parameter::class);
|
|
|
|
$property1->expects($this->once())
|
|
|
|
->method('offsetGet')
|
|
|
|
->with('RSVP')
|
|
|
|
->willReturn($parameter1);
|
|
|
|
$parameter1->expects($this->once())
|
|
|
|
->method('getValue')
|
|
|
|
->with()
|
|
|
|
->willReturn('TRUE');
|
|
|
|
|
|
|
|
$property2 = $this->createMock(CalAddress::class);
|
|
|
|
$parameter2 = $this->createMock(Parameter::class);
|
|
|
|
$property2->expects($this->once())
|
|
|
|
->method('offsetGet')
|
|
|
|
->with('RSVP')
|
|
|
|
->willReturn($parameter2);
|
|
|
|
$parameter2->expects($this->once())
|
|
|
|
->method('getValue')
|
|
|
|
->with()
|
|
|
|
->willReturn('FALSE');
|
|
|
|
|
|
|
|
$property3 = $this->createMock(CalAddress::class);
|
|
|
|
$property3->expects($this->once())
|
|
|
|
->method('offsetGet')
|
|
|
|
->with('RSVP')
|
|
|
|
->willReturn(null);
|
|
|
|
|
|
|
|
$this->assertTrue($this->invokePrivate($this->plugin, 'getAttendeeRSVP', [$property1]));
|
|
|
|
$this->assertFalse($this->invokePrivate($this->plugin, 'getAttendeeRSVP', [$property2]));
|
|
|
|
$this->assertFalse($this->invokePrivate($this->plugin, 'getAttendeeRSVP', [$property3]));
|
|
|
|
}
|
2020-03-08 19:33:27 +03:00
|
|
|
|
|
|
|
public function propFindDefaultCalendarUrlProvider(): array {
|
|
|
|
return [
|
|
|
|
[
|
|
|
|
'principals/users/myuser',
|
|
|
|
'calendars/myuser',
|
|
|
|
false,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_URI,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_NAME,
|
|
|
|
true
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/users/myuser',
|
|
|
|
'calendars/myuser',
|
|
|
|
false,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_URI,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_NAME,
|
|
|
|
false
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/users/myuser',
|
|
|
|
null,
|
|
|
|
false,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_URI,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_NAME,
|
|
|
|
true
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/users/myuser',
|
|
|
|
'calendars/myuser',
|
|
|
|
false,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_URI,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_NAME,
|
|
|
|
true,
|
|
|
|
false,
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/users/myuser',
|
|
|
|
'calendars/myuser',
|
|
|
|
false,
|
|
|
|
'my_other_calendar',
|
|
|
|
'My Other Calendar',
|
|
|
|
true
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/calendar-resources',
|
|
|
|
'system-calendars/calendar-resources/myuser',
|
|
|
|
true,
|
|
|
|
CalDavBackend::RESOURCE_BOOKING_CALENDAR_URI,
|
|
|
|
CalDavBackend::RESOURCE_BOOKING_CALENDAR_NAME,
|
|
|
|
true
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/calendar-resources',
|
|
|
|
'system-calendars/calendar-resources/myuser',
|
|
|
|
true,
|
|
|
|
CalDavBackend::RESOURCE_BOOKING_CALENDAR_URI,
|
|
|
|
CalDavBackend::RESOURCE_BOOKING_CALENDAR_NAME,
|
|
|
|
false
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'principals/something-else',
|
|
|
|
'calendars/whatever',
|
|
|
|
false,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_URI,
|
|
|
|
CalDavBackend::PERSONAL_CALENDAR_NAME,
|
|
|
|
true
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider propFindDefaultCalendarUrlProvider
|
|
|
|
* @param string $principalUri
|
|
|
|
* @param string $calendarHome
|
|
|
|
* @param bool $isResource
|
|
|
|
* @param string $calendarUri
|
|
|
|
* @param string $displayName
|
|
|
|
* @param bool $exists
|
|
|
|
* @param bool $propertiesForPath
|
|
|
|
*/
|
|
|
|
public function testPropFindDefaultCalendarUrl(string $principalUri, ?string $calendarHome, bool $isResource, string $calendarUri, string $displayName, bool $exists, bool $propertiesForPath = true) {
|
|
|
|
/** @var PropFind $propFind */
|
|
|
|
$propFind = new PropFind(
|
|
|
|
$principalUri,
|
|
|
|
[
|
|
|
|
Plugin::SCHEDULE_DEFAULT_CALENDAR_URL
|
|
|
|
],
|
|
|
|
0
|
|
|
|
);
|
|
|
|
/** @var IPrincipal|MockObject $node */
|
|
|
|
$node = $this->getMockBuilder(IPrincipal::class)
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
|
|
|
|
|
|
|
$node->expects($this->once())
|
|
|
|
->method('getPrincipalUrl')
|
|
|
|
->with()
|
|
|
|
->willReturn($principalUri);
|
|
|
|
|
|
|
|
$calDAVPlugin = $this->getMockBuilder(CalDAVPlugin::class)
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
|
|
|
|
|
|
|
$calDAVPlugin->expects($this->once())
|
|
|
|
->method('getCalendarHomeForPrincipal')
|
|
|
|
->willReturn($calendarHome);
|
|
|
|
|
|
|
|
$this->server->expects($this->once())
|
|
|
|
->method('getPlugin')
|
|
|
|
->with('caldav')
|
|
|
|
->willReturn($calDAVPlugin);
|
|
|
|
if (!$calendarHome) {
|
|
|
|
$this->plugin->propFindDefaultCalendarUrl($propFind, $node);
|
|
|
|
|
|
|
|
$this->assertNull($propFind->get(Plugin::SCHEDULE_DEFAULT_CALENDAR_URL));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if ($principalUri === 'principals/something-else') {
|
|
|
|
$this->plugin->propFindDefaultCalendarUrl($propFind, $node);
|
|
|
|
|
|
|
|
$this->assertNull($propFind->get(Plugin::SCHEDULE_DEFAULT_CALENDAR_URL));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!$isResource) {
|
|
|
|
$this->config->expects($this->once())
|
|
|
|
->method('getUserValue')
|
|
|
|
->with('myuser', 'dav', 'defaultCalendar', CalDavBackend::PERSONAL_CALENDAR_URI)
|
|
|
|
->willReturn($calendarUri);
|
|
|
|
}
|
|
|
|
|
|
|
|
$calendarHomeObject = $this->createMock(CalendarHome::class);
|
|
|
|
$calendarHomeObject->expects($this->once())
|
|
|
|
->method('childExists')
|
|
|
|
->with($calendarUri)
|
|
|
|
->willReturn($exists);
|
|
|
|
|
|
|
|
if (!$exists) {
|
|
|
|
$calendarBackend = $this->createMock(CalDavBackend::class);
|
|
|
|
$calendarBackend->expects($this->once())
|
|
|
|
->method('createCalendar')
|
|
|
|
->with($principalUri, $calendarUri, [
|
|
|
|
'{DAV:}displayname' => $displayName,
|
|
|
|
]);
|
|
|
|
|
|
|
|
$calendarHomeObject->expects($this->once())
|
|
|
|
->method('getCalDAVBackend')
|
|
|
|
->with()
|
|
|
|
->willReturn($calendarBackend);
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @var Tree|MockObject $tree */
|
|
|
|
$tree = $this->createMock(Tree::class);
|
|
|
|
$tree->expects($this->once())
|
|
|
|
->method('getNodeForPath')
|
|
|
|
->with($calendarHome)
|
|
|
|
->willReturn($calendarHomeObject);
|
|
|
|
$this->server->tree = $tree;
|
|
|
|
|
|
|
|
$properties = $propertiesForPath ? [
|
|
|
|
['href' => '/remote.php/dav/' . $calendarHome . '/' . $calendarUri]
|
|
|
|
] : [];
|
|
|
|
|
|
|
|
$this->server->expects($this->once())
|
|
|
|
->method('getPropertiesForPath')
|
|
|
|
->with($calendarHome .'/' . $calendarUri, [], 1)
|
|
|
|
->willReturn($properties);
|
|
|
|
|
|
|
|
$this->plugin->propFindDefaultCalendarUrl($propFind, $node);
|
|
|
|
|
|
|
|
if (!$propertiesForPath) {
|
|
|
|
$this->assertNull($propFind->get(Plugin::SCHEDULE_DEFAULT_CALENDAR_URL));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** @var LocalHref $result */
|
|
|
|
$result = $propFind->get(Plugin::SCHEDULE_DEFAULT_CALENDAR_URL);
|
|
|
|
$this->assertEquals('/remote.php/dav/'. $calendarHome . '/' . $calendarUri, $result->getHref());
|
|
|
|
}
|
2016-11-09 13:52:40 +03:00
|
|
|
}
|