|
|
|
@ -31,10 +31,18 @@ use OCA\DAV\CalDAV\Calendar;
|
|
|
|
|
use OCA\DAV\CalDAV\CalendarImpl;
|
|
|
|
|
use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer;
|
|
|
|
|
use OCA\DAV\CalDAV\Schedule\Plugin;
|
|
|
|
|
use OCA\DAV\Connector\Sabre\Server;
|
|
|
|
|
use OCP\Calendar\Exceptions\CalendarException;
|
|
|
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
|
|
|
use Sabre\VObject\Component\VCalendar;
|
|
|
|
|
use Sabre\VObject\Component\VEvent;
|
|
|
|
|
use Sabre\VObject\ITip\Message;
|
|
|
|
|
use Sabre\VObject\Reader;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @group DB
|
|
|
|
|
*/
|
|
|
|
|
class CalendarImplTest extends \Test\TestCase {
|
|
|
|
|
|
|
|
|
|
/** @var CalendarImpl */
|
|
|
|
|
private $calendarImpl;
|
|
|
|
|
|
|
|
|
@ -69,7 +77,7 @@ class CalendarImplTest extends \Test\TestCase {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetDisplayname() {
|
|
|
|
|
$this->assertEquals($this->calendarImpl->getDisplayName(),'user readable name 123');
|
|
|
|
|
$this->assertEquals($this->calendarImpl->getDisplayName(), 'user readable name 123');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testGetDisplayColor() {
|
|
|
|
@ -132,52 +140,104 @@ class CalendarImplTest extends \Test\TestCase {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testHandleImipMessage(): void {
|
|
|
|
|
$invitationResponseServer = $this->createConfiguredMock(InvitationResponseServer::class, [
|
|
|
|
|
'server' => $this->createConfiguredMock(CalDavBackend::class, [
|
|
|
|
|
'getPlugin' => [
|
|
|
|
|
'auth' => $this->createMock(CustomPrincipalPlugin::class),
|
|
|
|
|
'schedule' => $this->createMock(Plugin::class)
|
|
|
|
|
]
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$message = <<<EOF
|
|
|
|
|
BEGIN:VCALENDAR
|
|
|
|
|
PRODID:-//Nextcloud/Nextcloud CalDAV Server//EN
|
|
|
|
|
METHOD:REPLY
|
|
|
|
|
VERSION:2.0
|
|
|
|
|
BEGIN:VEVENT
|
|
|
|
|
ATTENDEE;PARTSTAT=mailto:lewis@stardew-tent-living.com:ACCEPTED
|
|
|
|
|
ATTENDEE;PARTSTAT=ACCEPTED:mailto:lewis@stardew-tent-living.com
|
|
|
|
|
ORGANIZER:mailto:pierre@generalstore.com
|
|
|
|
|
UID:aUniqueUid
|
|
|
|
|
SEQUENCE:2
|
|
|
|
|
REQUEST-STATUS:2.0;Success
|
|
|
|
|
%sEND:VEVENT
|
|
|
|
|
END:VEVENT
|
|
|
|
|
END:VCALENDAR
|
|
|
|
|
EOF;
|
|
|
|
|
|
|
|
|
|
/** @var CustomPrincipalPlugin|MockObject $authPlugin */
|
|
|
|
|
$authPlugin = $invitationResponseServer->server->getPlugin('auth');
|
|
|
|
|
$authPlugin = $this->createMock(CustomPrincipalPlugin::class);
|
|
|
|
|
$authPlugin->expects(self::once())
|
|
|
|
|
->method('setPrincipalUri')
|
|
|
|
|
->method('setCurrentPrincipal')
|
|
|
|
|
->with($this->calendar->getPrincipalURI());
|
|
|
|
|
|
|
|
|
|
/** @var \Sabre\DAVACL\Plugin|MockObject $aclPlugin*/
|
|
|
|
|
$aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class);
|
|
|
|
|
|
|
|
|
|
/** @var Plugin|MockObject $schedulingPlugin */
|
|
|
|
|
$schedulingPlugin = $invitationResponseServer->server->getPlugin('caldav-schedule');
|
|
|
|
|
$schedulingPlugin = $this->createMock(Plugin::class);
|
|
|
|
|
$iTipMessage = $this->getITipMessage($message);
|
|
|
|
|
$iTipMessage->recipient = "mailto:lewis@stardew-tent-living.com";
|
|
|
|
|
$schedulingPlugin->expects(self::once())
|
|
|
|
|
->method('setPathOfCalendarObjectChange')
|
|
|
|
|
->with('fullcalendarname');
|
|
|
|
|
->method('scheduleLocalDelivery')
|
|
|
|
|
->with($iTipMessage);
|
|
|
|
|
|
|
|
|
|
$server = $this->createMock(Server::class);
|
|
|
|
|
$server->expects($this->any())
|
|
|
|
|
->method('getPlugin')
|
|
|
|
|
->willReturnMap([
|
|
|
|
|
['auth', $authPlugin],
|
|
|
|
|
['acl', $aclPlugin],
|
|
|
|
|
['caldav-schedule', $schedulingPlugin]
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$invitationResponseServer = $this->createPartialMock(InvitationResponseServer::class, ['getServer', 'isExternalAttendee']);
|
|
|
|
|
$invitationResponseServer->server = $server;
|
|
|
|
|
$invitationResponseServer->expects($this->any())
|
|
|
|
|
->method('getServer')
|
|
|
|
|
->willReturn($server);
|
|
|
|
|
$invitationResponseServer->expects(self::once())
|
|
|
|
|
->method('isExternalAttendee')
|
|
|
|
|
->willReturn(false);
|
|
|
|
|
|
|
|
|
|
$calendarImpl = $this->getMockBuilder(CalendarImpl::class)
|
|
|
|
|
->setConstructorArgs([$this->calendar, $this->calendarInfo, $this->backend])
|
|
|
|
|
->onlyMethods(['getInvitationResponseServer'])
|
|
|
|
|
->getMock();
|
|
|
|
|
$calendarImpl->expects($this->once())
|
|
|
|
|
->method('getInvitationResponseServer')
|
|
|
|
|
->willReturn($invitationResponseServer);
|
|
|
|
|
|
|
|
|
|
$calendarImpl->handleIMipMessage('filename.ics', $message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testHandleImipMessageNoCalendarUri(): void {
|
|
|
|
|
$invitationResponseServer = $this->createConfiguredMock(InvitationResponseServer::class, [
|
|
|
|
|
'server' => $this->createConfiguredMock(CalDavBackend::class, [
|
|
|
|
|
'getPlugin' => [
|
|
|
|
|
'auth' => $this->createMock(CustomPrincipalPlugin::class),
|
|
|
|
|
'schedule' => $this->createMock(Plugin::class)
|
|
|
|
|
]
|
|
|
|
|
])
|
|
|
|
|
]);
|
|
|
|
|
/** @var CustomPrincipalPlugin|MockObject $authPlugin */
|
|
|
|
|
$authPlugin = $this->createMock(CustomPrincipalPlugin::class);
|
|
|
|
|
$authPlugin->expects(self::once())
|
|
|
|
|
->method('setCurrentPrincipal')
|
|
|
|
|
->with($this->calendar->getPrincipalURI());
|
|
|
|
|
unset($this->calendarInfo['uri']);
|
|
|
|
|
|
|
|
|
|
/** @var Plugin|MockObject $schedulingPlugin */
|
|
|
|
|
$schedulingPlugin = $this->createMock(Plugin::class);
|
|
|
|
|
|
|
|
|
|
/** @var \Sabre\DAVACL\Plugin|MockObject $schedulingPlugin */
|
|
|
|
|
$aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class);
|
|
|
|
|
|
|
|
|
|
$server =
|
|
|
|
|
$this->createMock(Server::class);
|
|
|
|
|
$server->expects($this->any())
|
|
|
|
|
->method('getPlugin')
|
|
|
|
|
->willReturnMap([
|
|
|
|
|
['auth', $authPlugin],
|
|
|
|
|
['acl', $aclPlugin],
|
|
|
|
|
['caldav-schedule', $schedulingPlugin]
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
$invitationResponseServer = $this->createPartialMock(InvitationResponseServer::class, ['getServer']);
|
|
|
|
|
$invitationResponseServer->server = $server;
|
|
|
|
|
$invitationResponseServer->expects($this->any())
|
|
|
|
|
->method('getServer')
|
|
|
|
|
->willReturn($server);
|
|
|
|
|
|
|
|
|
|
$calendarImpl = $this->getMockBuilder(CalendarImpl::class)
|
|
|
|
|
->setConstructorArgs([$this->calendar, $this->calendarInfo, $this->backend])
|
|
|
|
|
->onlyMethods(['getInvitationResponseServer'])
|
|
|
|
|
->getMock();
|
|
|
|
|
$calendarImpl->expects($this->once())
|
|
|
|
|
->method('getInvitationResponseServer')
|
|
|
|
|
->willReturn($invitationResponseServer);
|
|
|
|
|
|
|
|
|
|
$message = <<<EOF
|
|
|
|
|
BEGIN:VCALENDAR
|
|
|
|
@ -185,23 +245,35 @@ PRODID:-//Nextcloud/Nextcloud CalDAV Server//EN
|
|
|
|
|
METHOD:REPLY
|
|
|
|
|
VERSION:2.0
|
|
|
|
|
BEGIN:VEVENT
|
|
|
|
|
ATTENDEE;PARTSTAT=mailto:lewis@stardew-tent-living.com:ACCEPTED
|
|
|
|
|
ATTENDEE;PARTSTAT=ACCEPTED:mailto:lewis@stardew-tent-living.com
|
|
|
|
|
ORGANIZER:mailto:pierre@generalstore.com
|
|
|
|
|
UID:aUniqueUid
|
|
|
|
|
SEQUENCE:2
|
|
|
|
|
REQUEST-STATUS:2.0;Success
|
|
|
|
|
%sEND:VEVENT
|
|
|
|
|
END:VEVENT
|
|
|
|
|
END:VCALENDAR
|
|
|
|
|
EOF;
|
|
|
|
|
|
|
|
|
|
/** @var CustomPrincipalPlugin|MockObject $authPlugin */
|
|
|
|
|
$authPlugin = $invitationResponseServer->server->getPlugin('auth');
|
|
|
|
|
$authPlugin->expects(self::once())
|
|
|
|
|
->method('setPrincipalUri')
|
|
|
|
|
->with($this->calendar->getPrincipalURI());
|
|
|
|
|
$this->expectException(CalendarException::class);
|
|
|
|
|
$calendarImpl->handleIMipMessage('filename.ics', $message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unset($this->calendarInfo['uri']);
|
|
|
|
|
$this->expectException('CalendarException');
|
|
|
|
|
$this->calendarImpl->handleIMipMessage('filename.ics', $message);
|
|
|
|
|
private function getITipMessage($calendarData): Message {
|
|
|
|
|
$iTipMessage = new Message();
|
|
|
|
|
/** @var VCalendar $vObject */
|
|
|
|
|
$vObject = Reader::read($calendarData);
|
|
|
|
|
/** @var VEvent $vEvent */
|
|
|
|
|
$vEvent = $vObject->{'VEVENT'};
|
|
|
|
|
$orgaizer = $vEvent->{'ORGANIZER'}->getValue();
|
|
|
|
|
$attendee = $vEvent->{'ATTENDEE'}->getValue();
|
|
|
|
|
|
|
|
|
|
$iTipMessage->method = $vObject->{'METHOD'}->getValue();
|
|
|
|
|
$iTipMessage->recipient = $orgaizer;
|
|
|
|
|
$iTipMessage->sender = $attendee;
|
|
|
|
|
$iTipMessage->uid = isset($vEvent->{'UID'}) ? $vEvent->{'UID'}->getValue() : '';
|
|
|
|
|
$iTipMessage->component = 'VEVENT';
|
|
|
|
|
$iTipMessage->sequence = isset($vEvent->{'SEQUENCE'}) ? (int)$vEvent->{'SEQUENCE'}->getValue() : 0;
|
|
|
|
|
$iTipMessage->message = $vObject;
|
|
|
|
|
return $iTipMessage;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|