diff --git a/apps/dav/lib/CalDAV/Status/Status.php b/apps/dav/lib/CalDAV/Status/Status.php deleted file mode 100644 index 46ddf7e47f302..0000000000000 --- a/apps/dav/lib/CalDAV/Status/Status.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * @author Anna Larch - * - * @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 - * along with this program. If not, see . - * - */ - -namespace OCA\DAV\CalDAV\Status; - -class Status { - public function __construct(private string $status = '', private ?string $message = null, private ?string $customMessage = null, private ?int $timestamp = null, private ?string $customEmoji = null) { - } - - public function getStatus(): string { - return $this->status; - } - - public function setStatus(string $status): void { - $this->status = $status; - } - - public function getMessage(): ?string { - return $this->message; - } - - public function setMessage(?string $message): void { - $this->message = $message; - } - - public function getCustomMessage(): ?string { - return $this->customMessage; - } - - public function setCustomMessage(?string $customMessage): void { - $this->customMessage = $customMessage; - } - - public function setEndTime(?int $timestamp): void { - $this->timestamp = $timestamp; - } - - public function getEndTime(): ?int { - return $this->timestamp; - } - - public function getCustomEmoji(): ?string { - return $this->customEmoji; - } - - public function setCustomEmoji(?string $emoji): void { - $this->customEmoji = $emoji; - } -} diff --git a/apps/dav/lib/CalDAV/Status/StatusService.php b/apps/dav/lib/CalDAV/Status/StatusService.php index add8a668f7a41..82e45dff8c955 100644 --- a/apps/dav/lib/CalDAV/Status/StatusService.php +++ b/apps/dav/lib/CalDAV/Status/StatusService.php @@ -25,83 +25,103 @@ */ namespace OCA\DAV\CalDAV\Status; +use DateTimeImmutable; use OC\Calendar\CalendarQuery; use OCA\DAV\CalDAV\CalendarImpl; -use OCA\DAV\CalDAV\FreeBusy\FreeBusyGenerator; -use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer; -use OCA\DAV\CalDAV\Schedule\Plugin as SchedulePlugin; +use OCA\UserStatus\Service\StatusService as UserStatusService; +use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Calendar\IManager; -use OCP\IL10N; +use OCP\ICache; +use OCP\ICacheFactory; use OCP\IUser as User; +use OCP\IUserManager; use OCP\UserStatus\IUserStatus; use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp; -use Sabre\DAV\Exception\NotAuthenticated; -use Sabre\DAVACL\Exception\NeedPrivileges; -use Sabre\DAVACL\Plugin as AclPlugin; -use Sabre\VObject\Component; -use Sabre\VObject\Component\VEvent; -use Sabre\VObject\Parameter; -use Sabre\VObject\Property; class StatusService { + private ICache $cache; public function __construct(private ITimeFactory $timeFactory, private IManager $calendarManager, - private InvitationResponseServer $server, - private IL10N $l10n, - private FreeBusyGenerator $generator) { + private IUserManager $userManager, + private UserStatusService $userStatusService, + private ICacheFactory $cacheFactory) { + $this->cache = $cacheFactory->createLocal('CalendarStatusService'); } - public function processCalendarAvailability(User $user): ?Status { - $userId = $user->getUID(); - $email = $user->getEMailAddress(); - if($email === null) { - return null; + public function processCalendarStatus(string $userId): void { + $user = $this->userManager->get($userId); + if($user === null) { + return; + } + $calendarEvents = $this->cache->get($user->getUID()); + if($calendarEvents === null) { + $calendarEvents = $this->getCalendarEvents($user); + $this->cache->set($user->getUID(), $calendarEvents, 300); } - $server = $this->server->getServer(); - - /** @var SchedulePlugin $schedulingPlugin */ - $schedulingPlugin = $server->getPlugin('caldav-schedule'); - $caldavNS = '{'.$schedulingPlugin::NS_CALDAV.'}'; - - /** @var AclPlugin $aclPlugin */ - $aclPlugin = $server->getPlugin('acl'); - if ('mailto:' === substr($email, 0, 7)) { - $email = substr($email, 7); + if(empty($calendarEvents)) { + $this->userStatusService->revertUserStatus($user->getUID(), IUserStatus::MESSAGE_CALENDAR_BUSY); + return; } - $result = $aclPlugin->principalSearch( - ['{http://sabredav.org/ns}email-address' => $email], - [ - '{DAV:}principal-URL', - $caldavNS.'calendar-home-set', - $caldavNS.'schedule-inbox-URL', - '{http://sabredav.org/ns}email-address', - ] - ); + $userStatusTimestamp = $currentStatus = null; + try { + $currentStatus = $this->userStatusService->findByUserId($user->getUID()); + $userStatusTimestamp = $currentStatus->getIsUserDefined() ? $currentStatus->getStatusTimestamp() : null; + } catch (DoesNotExistException) { + } - if (!count($result) || !isset($result[0][200][$caldavNS.'schedule-inbox-URL'])) { - return null; + if($currentStatus !== null && $currentStatus->getMessageId() === IUserStatus::MESSAGE_CALL) { + // We don't overwrite the call status + return; } - $inboxUrl = $result[0][200][$caldavNS.'schedule-inbox-URL']->getHref(); + // Filter events to see if we have any that apply to the calendar status + $applicableEvents = array_filter($calendarEvents, function ($calendarEvent) use ($userStatusTimestamp) { + $component = $calendarEvent['objects'][0]; + if(isset($component['X-NEXTCLOUD-OUT-OF-OFFICE'])) { + return false; + } + if(isset($component['DTSTART']) && $userStatusTimestamp !== null) { + /** @var DateTimeImmutable $dateTime */ + $dateTime = $component['DTSTART'][0]; + $timestamp = $dateTime->getTimestamp(); + if($userStatusTimestamp > $timestamp) { + return false; + } + } + // Ignore events that are transparent + if(isset($component['TRANSP']) && strcasecmp($component['TRANSP'][0], 'TRANSPARENT') === 0) { + return false; + } + return true; + }); - // Do we have permission? - try { - $aclPlugin->checkPrivileges($inboxUrl, $caldavNS.'schedule-query-freebusy'); - } catch (NeedPrivileges | NotAuthenticated $exception) { - return null; + if(empty($applicableEvents)) { + $this->userStatusService->revertUserStatus($user->getUID(), IUserStatus::MESSAGE_CALENDAR_BUSY); + return; } - $now = $this->timeFactory->now(); - $calendarTimeZone = $now->getTimezone(); - $calendars = $this->calendarManager->getCalendarsForPrincipal('principals/users/' . $userId); + // One event that fulfills all status conditions is enough + // 1. Not an OOO event + // 2. Current user status was not set after the start of this event + // 3. Event is not set to be transparent + $this->userStatusService->setUserStatus( + $user->getUID(), + IUserStatus::AWAY, + IUserStatus::MESSAGE_CALENDAR_BUSY, + true + ); + } + + private function getCalendarEvents(User $user): array { + $calendars = $this->calendarManager->getCalendarsForPrincipal('principals/users/' . $user->getUID()); if(empty($calendars)) { - return null; + return []; } - $query = $this->calendarManager->newQuery('principals/users/' . $userId); + $query = $this->calendarManager->newQuery('principals/users/' . $user->getUID()); foreach ($calendars as $calendarObject) { // We can only work with a calendar if it exposes its scheduling information if (!$calendarObject instanceof CalendarImpl) { @@ -114,83 +134,20 @@ public function processCalendarAvailability(User $user): ?Status { // ignore it for free-busy purposes. continue; } - - /** @var Component\VTimeZone|null $ctz */ - $ctz = $calendarObject->getSchedulingTimezone(); - if ($ctz !== null) { - $calendarTimeZone = $ctz->getTimeZone(); - } $query->addSearchCalendar($calendarObject->getUri()); } - $calendarEvents = []; - $dtStart = $now; - $dtEnd = \DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime('+10 minutes')); + $dtStart = DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime()); + $dtEnd = DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime('+10 minutes')); // Only query the calendars when there's any to search if($query instanceof CalendarQuery && !empty($query->getCalendarUris())) { // Query the next hour $query->setTimerangeStart($dtStart); $query->setTimerangeEnd($dtEnd); - $calendarEvents = $this->calendarManager->searchForPrincipal($query); + return $this->calendarManager->searchForPrincipal($query); } - // @todo we can cache that - if(empty($calendarEvents)) { - return null; - } - - $calendar = $this->generator->getVCalendar(); - foreach ($calendarEvents as $calendarEvent) { - $vEvent = new VEvent($calendar, 'VEVENT'); - foreach($calendarEvent['objects'] as $component) { - foreach ($component as $key => $value) { - $vEvent->add($key, $value[0]); - } - } - $calendar->add($vEvent); - } - - $calendar->METHOD = 'REQUEST'; - - $this->generator->setObjects($calendar); - $this->generator->setTimeRange($dtStart, $dtEnd); - $this->generator->setTimeZone($calendarTimeZone); - $result = $this->generator->getResult(); - - if (!isset($result->VFREEBUSY)) { - return null; - } - - /** @var Component $freeBusyComponent */ - $freeBusyComponent = $result->VFREEBUSY; - $freeBusyProperties = $freeBusyComponent->select('FREEBUSY'); - // If there is no FreeBusy property, the time-range is empty and available - if (count($freeBusyProperties) === 0) { - return null; - } - - /** @var Property $freeBusyProperty */ - $freeBusyProperty = $freeBusyProperties[0]; - if (!$freeBusyProperty->offsetExists('FBTYPE')) { - // If there is no FBTYPE, it means it's busy from a regular event - return new Status(IUserStatus::BUSY, IUserStatus::MESSAGE_CALENDAR_BUSY); - } - - // If we can't deal with the FBTYPE (custom properties are a possibility) - // we should ignore it and leave the current status - $fbTypeParameter = $freeBusyProperty->offsetGet('FBTYPE'); - if (!($fbTypeParameter instanceof Parameter)) { - return null; - } - $fbType = $fbTypeParameter->getValue(); - switch ($fbType) { - // Ignore BUSY-UNAVAILABLE, that's for the automation - case 'BUSY': - case 'BUSY-TENTATIVE': - return new Status(IUserStatus::BUSY, IUserStatus::MESSAGE_CALENDAR_BUSY, $this->l10n->t('In a meeting')); - default: - return null; - } + return []; } } diff --git a/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php b/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php index 705298de125ad..90cd1cca4f93d 100644 --- a/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php +++ b/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php @@ -22,33 +22,22 @@ */ namespace OCA\DAV\Tests\unit\CalDAV\Status; -use OC\Calendar\CalendarQuery; -use OCA\DAV\CalDAV\CalendarImpl; -use OCA\DAV\CalDAV\FreeBusy\FreeBusyGenerator; -use OCA\DAV\CalDAV\InvitationResponse\InvitationResponseServer; -use OCA\DAV\CalDAV\Schedule\Plugin; use OCA\DAV\CalDAV\Status\StatusService; -use OCA\DAV\Connector\Sabre\Server; +use OCA\UserStatus\Service\StatusService as UserStatusService; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Calendar\IManager; -use OCP\IL10N; -use OCP\IUser; +use OCP\Files\Cache\ICache; +use OCP\ICacheFactory; +use OCP\IUserManager; use PHPUnit\Framework\MockObject\MockObject; -use Sabre\CalDAV\Xml\Property\ScheduleCalendarTransp; -use Sabre\DAV\Exception\NotAuthenticated; -use Sabre\DAV\Xml\Property\LocalHref; -use Sabre\DAVACL\Exception\NeedPrivileges; -use Sabre\VObject\Component\VCalendar; -use Sabre\VObject\Component\VTimeZone; -use Sabre\VObject\Reader; use Test\TestCase; class StatusServiceTest extends TestCase { private ITimeFactory|MockObject $timeFactory; private IManager|MockObject $calendarManager; - private InvitationResponseServer|MockObject $server; - private IL10N|MockObject $l10n; - private FreeBusyGenerator|MockObject $generator; + private IUserManager|MockObject $userManager; + private UserStatusService|MockObject $userStatusService; + private ICacheFactory|MockObject $cacheFactory; private StatusService $service; protected function setUp(): void { diff --git a/apps/user_status/lib/Controller/UserStatusController.php b/apps/user_status/lib/Controller/UserStatusController.php index f2b1537e4f7a8..3beb8abc3abd0 100644 --- a/apps/user_status/lib/Controller/UserStatusController.php +++ b/apps/user_status/lib/Controller/UserStatusController.php @@ -28,6 +28,7 @@ */ namespace OCA\UserStatus\Controller; +use OCA\DAV\CalDAV\Status\StatusService as CalendarStatusService; use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Exception\InvalidClearAtException; use OCA\UserStatus\Exception\InvalidMessageIdException; @@ -55,6 +56,7 @@ public function __construct( private string $userId, private LoggerInterface $logger, private StatusService $service, + private CalendarStatusService $calendarStatusService, ) { parent::__construct($appName, $request); } @@ -71,6 +73,7 @@ public function __construct( */ public function getStatus(): DataResponse { try { + $this->calendarStatusService->processCalendarStatus($this->userId); $userStatus = $this->service->findByUserId($this->userId); } catch (DoesNotExistException $ex) { throw new OCSNotFoundException('No status for the current user'); diff --git a/apps/user_status/lib/Listener/UserLiveStatusListener.php b/apps/user_status/lib/Listener/UserLiveStatusListener.php index 0d0e6e3ebf02e..a38defebf7165 100644 --- a/apps/user_status/lib/Listener/UserLiveStatusListener.php +++ b/apps/user_status/lib/Listener/UserLiveStatusListener.php @@ -81,6 +81,12 @@ public function handle(Event $event): void { return; } + // Don't overwrite the "away" calendar status if it's set + if($userStatus->getMessageId() === IUserStatus::MESSAGE_CALENDAR_BUSY) { + $event->setUserStatus(new ConnectorUserStatus($userStatus)); + return; + } + $needsUpdate = false; // If the current status is older than 5 minutes, diff --git a/apps/user_status/lib/Service/StatusService.php b/apps/user_status/lib/Service/StatusService.php index 9582c403329cc..c623262eec65d 100644 --- a/apps/user_status/lib/Service/StatusService.php +++ b/apps/user_status/lib/Service/StatusService.php @@ -27,8 +27,6 @@ */ namespace OCA\UserStatus\Service; -use OCA\DAV\CalDAV\Status\Status as CalendarStatus; -use OCA\DAV\CalDAV\Status\StatusService as CalendarStatusService; use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Db\UserStatusMapper; use OCA\UserStatus\Exception\InvalidClearAtException; @@ -89,8 +87,7 @@ public function __construct(private UserStatusMapper $mapper, private PredefinedStatusService $predefinedStatusService, private IEmojiHelper $emojiHelper, private IConfig $config, - private IUserManager $userManager, - private CalendarStatusService $calendarStatusService) { + private IUserManager $userManager) { $this->shareeEnumeration = $this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') === 'yes'; $this->shareeEnumerationInGroupOnly = $this->shareeEnumeration && $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_group', 'no') === 'yes'; $this->shareeEnumerationPhone = $this->shareeEnumeration && $this->config->getAppValue('core', 'shareapi_restrict_user_enumeration_to_phone', 'no') === 'yes'; @@ -558,30 +555,4 @@ public function revertMultipleUserStatus(array $userIds, string $messageId): voi // For users that matched restore the previous status $this->mapper->restoreBackupStatuses($restoreIds); } - - /** - * Calculate a users' status according to their calendar events - * - * There are 4 predefined types of FBTYPE - 'FREE', 'BUSY', 'BUSY-UNAVAILABLE', 'BUSY-TENTATIVE', - * but 'X-' properties are possible - * - * @link https://icalendar.org/iCalendar-RFC-5545/3-2-9-free-busy-time-type.html - * - * The status will be changed for types - * - 'BUSY' - * - 'BUSY-TENTATIVE' (ex.: an event has been accepted tentatively) - * and all FREEBUSY components without a type (implicitly a 'BUSY' status) - * - * 'X-' properties and BUSY-UNAVAILABLE is not handled - * - * @param string $userId - * @return CalendarStatus|null - */ - public function getCalendarStatus(string $userId): ?CalendarStatus { - $user = $this->userManager->get($userId); - if ($user === null) { - return null; - } - return $this->calendarStatusService->processCalendarAvailability($user); - } } diff --git a/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php b/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php index cabcc63b291df..6161eb100ec18 100644 --- a/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php +++ b/apps/user_status/tests/Unit/Controller/UserStatusControllerTest.php @@ -26,6 +26,7 @@ */ namespace OCA\UserStatus\Tests\Controller; +use OCA\DAV\CalDAV\Status\StatusService as CalendarStatusService; use OCA\UserStatus\Controller\UserStatusController; use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Exception\InvalidClearAtException; @@ -47,7 +48,10 @@ class UserStatusControllerTest extends TestCase { private $logger; /** @var StatusService|\PHPUnit\Framework\MockObject\MockObject */ - private $service; + private $statusService; + + /** @var CalendarStatusService|\PHPUnit\Framework\MockObject\MockObject $calendarStatusService */ + private $calendarStatusService; /** @var UserStatusController */ private $controller; @@ -58,15 +62,23 @@ protected function setUp(): void { $request = $this->createMock(IRequest::class); $userId = 'john.doe'; $this->logger = $this->createMock(LoggerInterface::class); - $this->service = $this->createMock(StatusService::class); - - $this->controller = new UserStatusController('user_status', $request, $userId, $this->logger, $this->service); + $this->statusService = $this->createMock(StatusService::class); + $this->calendarStatusService = $this->createMock(CalendarStatusService::class); + + $this->controller = new UserStatusController( + 'user_status', + $request, + $userId, + $this->logger, + $this->statusService, + $this->calendarStatusService, + ); } public function testGetStatus(): void { $userStatus = $this->getUserStatus(); - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('findByUserId') ->with('john.doe') ->willReturn($userStatus); @@ -85,7 +97,10 @@ public function testGetStatus(): void { } public function testGetStatusDoesNotExist(): void { - $this->service->expects($this->once()) + $this->calendarStatusService->expects(self::once()) + ->method('processCalendarStatus') + ->with('john.doe'); + $this->statusService->expects($this->once()) ->method('findByUserId') ->with('john.doe') ->willThrowException(new DoesNotExistException('')); @@ -121,12 +136,12 @@ public function testSetStatus(string $statusType, $userStatus = $this->getUserStatus(); if ($expectException) { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setStatus') ->with('john.doe', $statusType, null, true) ->willThrowException($exception); } else { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setStatus') ->with('john.doe', $statusType, null, true) ->willReturn($userStatus); @@ -187,12 +202,12 @@ public function testSetPredefinedMessage(string $messageId, $userStatus = $this->getUserStatus(); if ($expectException) { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setPredefinedMessage') ->with('john.doe', $messageId, $clearAt) ->willThrowException($exception); } else { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setPredefinedMessage') ->with('john.doe', $messageId, $clearAt) ->willReturn($userStatus); @@ -259,28 +274,28 @@ public function testSetCustomMessage(?string $statusIcon, $userStatus = $this->getUserStatus(); if ($expectException) { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setCustomMessage') ->with('john.doe', $statusIcon, $message, $clearAt) ->willThrowException($exception); } else { if ($expectSuccessAsReset) { - $this->service->expects($this->never()) + $this->statusService->expects($this->never()) ->method('setCustomMessage'); - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('clearMessage') ->with('john.doe'); - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('findByUserId') ->with('john.doe') ->willReturn($userStatus); } else { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('setCustomMessage') ->with('john.doe', $statusIcon, $message, $clearAt) ->willReturn($userStatus); - $this->service->expects($this->never()) + $this->statusService->expects($this->never()) ->method('clearMessage'); } } @@ -326,7 +341,7 @@ public function setCustomMessageDataProvider(): array { } public function testClearMessage(): void { - $this->service->expects($this->once()) + $this->statusService->expects($this->once()) ->method('clearMessage') ->with('john.doe'); diff --git a/apps/user_status/tests/Unit/Service/PredefinedStatusServiceTest.php b/apps/user_status/tests/Unit/Service/PredefinedStatusServiceTest.php index 0a65256bfacae..fe0c9e7f8a509 100644 --- a/apps/user_status/tests/Unit/Service/PredefinedStatusServiceTest.php +++ b/apps/user_status/tests/Unit/Service/PredefinedStatusServiceTest.php @@ -47,7 +47,7 @@ protected function setUp(): void { } public function testGetDefaultStatuses(): void { - $this->l10n->expects($this->exactly(6)) + $this->l10n->expects($this->exactly(7)) ->method('t') ->withConsecutive( ['In a meeting'], diff --git a/apps/user_status/tests/Unit/Service/StatusServiceTest.php b/apps/user_status/tests/Unit/Service/StatusServiceTest.php index 2de041712bd1c..da11ec0943b41 100644 --- a/apps/user_status/tests/Unit/Service/StatusServiceTest.php +++ b/apps/user_status/tests/Unit/Service/StatusServiceTest.php @@ -28,9 +28,6 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OC\DB\Exceptions\DbalException; -use OC\User\User; -use OCA\DAV\CalDAV\Status\Status; -use OCA\DAV\CalDAV\Status\StatusService as CalendarStatusService; use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Db\UserStatusMapper; use OCA\UserStatus\Exception\InvalidClearAtException; @@ -45,7 +42,6 @@ use OCP\DB\Exception; use OCP\IConfig; use OCP\IEmojiHelper; -use OCP\IUser; use OCP\IUserManager; use OCP\UserStatus\IUserStatus; use PHPUnit\Framework\MockObject\MockObject; @@ -71,9 +67,6 @@ class StatusServiceTest extends TestCase { /** @var IUserManager|MockObject */ private $userManager; - /** @var CalendarStatusService|MockObject */ - private $calendarStatusService; - private StatusService $service; protected function setUp(): void { @@ -84,8 +77,6 @@ protected function setUp(): void { $this->predefinedStatusService = $this->createMock(PredefinedStatusService::class); $this->emojiHelper = $this->createMock(IEmojiHelper::class); $this->userManager = $this->createMock(IUserManager::class); - $this->calendarStatusService = $this->createMock(CalendarStatusService::class); - $this->config = $this->createMock(IConfig::class); $this->config->method('getAppValue') @@ -99,8 +90,7 @@ protected function setUp(): void { $this->predefinedStatusService, $this->emojiHelper, $this->config, - $this->userManager, - $this->calendarStatusService, + $this->userManager ); } @@ -156,8 +146,7 @@ public function testFindAllRecentStatusChangesNoEnumeration(): void { $this->predefinedStatusService, $this->emojiHelper, $this->config, - $this->userManager, - $this->calendarStatusService, + $this->userManager ); $this->assertEquals([], $this->service->findAllRecentStatusChanges(20, 50)); @@ -176,8 +165,7 @@ public function testFindAllRecentStatusChangesNoEnumeration(): void { $this->predefinedStatusService, $this->emojiHelper, $this->config, - $this->userManager, - $this->calendarStatusService, + $this->userManager ); $this->assertEquals([], $this->service->findAllRecentStatusChanges(20, 50)); @@ -837,35 +825,4 @@ public function testRevertMultipleUserStatus(): void { $this->service->revertMultipleUserStatus(['john', 'nobackup', 'backuponly', 'nobackupanddnd'], 'call'); } - - public function testCalendarAvailabilityNoUser(): void { - $userId = 'admin'; - - $this->userManager->expects(self::once()) - ->method('get') - ->with($userId) - ->willReturn(null); - $this->calendarStatusService->expects(self::never()) - ->method('processCalendarAvailability'); - - $this->service->getCalendarStatus($userId); - } - - public function testCalendarAvailabilityNoStatus(): void { - $user = $this->createConfiguredMock(IUser::class, [ - 'getUID' => 'admin', - 'getEMailAddress' => 'test@test.com', - ]); - - $this->userManager->expects(self::once()) - ->method('get') - ->with($user->getUID()) - ->willReturn($user); - $this->calendarStatusService->expects(self::once()) - ->method('processCalendarAvailability') - ->with($user) - ->willReturn(null); - - $this->service->getCalendarStatus($user->getUID()); - } }