0
0
mirror of https://github.com/nextcloud/server.git synced 2025-01-01 18:00:09 +00:00
nextcloud_server/apps/dav/tests/unit/CalDAV/DefaultCalendarValidatorTest.php
Richard Steinmetz cbea787233
fix(caldav): stricter default calendar checks
Reject calendars that
- are subscriptions
- are not writable
- are shared with a user
- are deleted
- don't support VEVENTs

Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2024-07-22 15:24:39 +02:00

172 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\DAV\Tests\unit\CalDAV;
use OCA\DAV\CalDAV\Calendar;
use OCA\DAV\CalDAV\DefaultCalendarValidator;
use Sabre\CalDAV\Xml\Property\SupportedCalendarComponentSet;
use Test\TestCase;
class DefaultCalendarValidatorTest extends TestCase {
private DefaultCalendarValidator $validator;
protected function setUp(): void {
parent::setUp();
$this->validator = new DefaultCalendarValidator();
}
public function testValidateScheduleDefaultCalendar(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(true);
$node->expects(self::once())
->method('isShared')
->willReturn(false);
$node->expects(self::once())
->method('isDeleted')
->willReturn(false);
$node->expects(self::once())
->method('getProperties')
->willReturn([
'{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new SupportedCalendarComponentSet(['VEVENT']),
]);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithEmptyProperties(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(true);
$node->expects(self::once())
->method('isShared')
->willReturn(false);
$node->expects(self::once())
->method('isDeleted')
->willReturn(false);
$node->expects(self::once())
->method('getProperties')
->willReturn([]);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithSubscription(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(true);
$node->expects(self::never())
->method('canWrite');
$node->expects(self::never())
->method('isShared');
$node->expects(self::never())
->method('isDeleted');
$node->expects(self::never())
->method('getProperties');
$this->expectException(\Sabre\DAV\Exception::class);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithoutWrite(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(false);
$node->expects(self::never())
->method('isShared');
$node->expects(self::never())
->method('isDeleted');
$node->expects(self::never())
->method('getProperties');
$this->expectException(\Sabre\DAV\Exception::class);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithShared(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(true);
$node->expects(self::once())
->method('isShared')
->willReturn(true);
$node->expects(self::never())
->method('isDeleted');
$node->expects(self::never())
->method('getProperties');
$this->expectException(\Sabre\DAV\Exception::class);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithDeleted(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(true);
$node->expects(self::once())
->method('isShared')
->willReturn(false);
$node->expects(self::once())
->method('isDeleted')
->willReturn(true);
$node->expects(self::never())
->method('getProperties');
$this->expectException(\Sabre\DAV\Exception::class);
$this->validator->validateScheduleDefaultCalendar($node);
}
public function testValidateScheduleDefaultCalendarWithoutVeventSupport(): void {
$node = $this->createMock(Calendar::class);
$node->expects(self::once())
->method('isSubscription')
->willReturn(false);
$node->expects(self::once())
->method('canWrite')
->willReturn(true);
$node->expects(self::once())
->method('isShared')
->willReturn(false);
$node->expects(self::once())
->method('isDeleted')
->willReturn(false);
$node->expects(self::once())
->method('getProperties')
->willReturn([
'{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new SupportedCalendarComponentSet(['VTODO']),
]);
$this->expectException(\Sabre\DAV\Exception::class);
$this->validator->validateScheduleDefaultCalendar($node);
}
}