diff --git a/apps/dav/lib/CalDAV/Status/StatusService.php b/apps/dav/lib/CalDAV/Status/StatusService.php index 6b61cc7cdb7dc..63f865d13ced6 100644 --- a/apps/dav/lib/CalDAV/Status/StatusService.php +++ b/apps/dav/lib/CalDAV/Status/StatusService.php @@ -61,32 +61,33 @@ public function processCalendarStatus(string $userId): void { $availability = $this->availabilityCoordinator->getCurrentOutOfOfficeData($user); if($availability !== null && $this->availabilityCoordinator->isInEffect($availability)) { - $this->logger->debug('An Absence is in effect, skipping calendar status check', ['user' => $user->getUID()]); + $this->logger->debug('An Absence is in effect, skipping calendar status check', ['user' => $userId]); return; } - $calendarEvents = $this->cache->get($user->getUID()); + $calendarEvents = $this->cache->get($userId); if($calendarEvents === null) { $calendarEvents = $this->getCalendarEvents($user); - $this->cache->set($user->getUID(), $calendarEvents, 300); + $this->cache->set($userId, $calendarEvents, 300); } if(empty($calendarEvents)) { - $this->userStatusService->revertUserStatus($user->getUID(), IUserStatus::MESSAGE_CALENDAR_BUSY); - $this->logger->debug('No calendar events found for status check', ['user' => $user->getUID()]); + $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + $this->logger->debug('No calendar events found for status check', ['user' => $userId]); return; } - $userStatusTimestamp = $currentStatus = null; + $userStatusTimestamp = null; + $currentStatus = null; try { - $currentStatus = $this->userStatusService->findByUserId($user->getUID()); + $currentStatus = $this->userStatusService->findByUserId($userId); $userStatusTimestamp = $currentStatus->getIsUserDefined() ? $currentStatus->getStatusTimestamp() : null; } catch (DoesNotExistException) { } if($currentStatus !== null && $currentStatus->getMessageId() === IUserStatus::MESSAGE_CALL) { // We don't overwrite the call status - $this->logger->debug('Call status detected, skipping calendar status change', ['user' => $user->getUID()]); + $this->logger->debug('Call status detected, skipping calendar status change', ['user' => $userId]); return; } @@ -112,8 +113,8 @@ public function processCalendarStatus(string $userId): void { }); if(empty($applicableEvents)) { - $this->userStatusService->revertUserStatus($user->getUID(), IUserStatus::MESSAGE_CALENDAR_BUSY); - $this->logger->debug('No status relevant events found, skipping calendar status change', ['user' => $user->getUID()]); + $this->userStatusService->revertUserStatus($userId, IUserStatus::MESSAGE_CALENDAR_BUSY); + $this->logger->debug('No status relevant events found, skipping calendar status change', ['user' => $userId]); return; } @@ -122,9 +123,9 @@ public function processCalendarStatus(string $userId): void { // 2. Current user status was not set after the start of this event // 3. Event is not set to be transparent $count = count($applicableEvents); - $this->logger->debug("Found $count applicable event(s), changing user status", ['user' => $user->getUID()]); + $this->logger->debug("Found $count applicable event(s), changing user status", ['user' => $userId]); $this->userStatusService->setUserStatus( - $user->getUID(), + $userId, IUserStatus::AWAY, IUserStatus::MESSAGE_CALENDAR_BUSY, true @@ -155,7 +156,7 @@ private function getCalendarEvents(User $user): array { } $dtStart = DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime()); - $dtEnd = DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime('+10 minutes')); + $dtEnd = DateTimeImmutable::createFromMutable($this->timeFactory->getDateTime('+5 minutes')); // Only query the calendars when there's any to search if($query instanceof CalendarQuery && !empty($query->getCalendarUris())) { diff --git a/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php b/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php index ec2fafe363bff..68110ab23d2ec 100644 --- a/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php +++ b/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php @@ -22,14 +22,23 @@ */ namespace OCA\DAV\Tests\unit\CalDAV\Status; +use OC\Calendar\CalendarQuery; +use OCA\DAV\CalDAV\CalendarImpl; use OCA\DAV\CalDAV\Status\StatusService; +use OCA\UserStatus\Db\UserStatus; use OCA\UserStatus\Service\StatusService as UserStatusService; +use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Utility\ITimeFactory; use OCP\Calendar\IManager; -use OCP\Files\Cache\ICache; +use OCP\ICache; use OCP\ICacheFactory; +use OCP\IUser; use OCP\IUserManager; +use OCP\User\IAvailabilityCoordinator; +use OCP\User\IOutOfOfficeData; +use OCP\UserStatus\IUserStatus; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Log\LoggerInterface; use Test\TestCase; class StatusServiceTest extends TestCase { @@ -37,7 +46,9 @@ class StatusServiceTest extends TestCase { private IManager|MockObject $calendarManager; private IUserManager|MockObject $userManager; private UserStatusService|MockObject $userStatusService; + private IAvailabilityCoordinator|MockObject $availabilityCoordinator; private ICacheFactory|MockObject $cacheFactory; + private LoggerInterface|MockObject $logger; private StatusService $service; protected function setUp(): void { @@ -45,646 +56,266 @@ protected function setUp(): void { $this->timeFactory = $this->createMock(ITimeFactory::class); $this->calendarManager = $this->createMock(IManager::class); - $this->userStatusService = $this->createMock(UserStatusService::class); $this->userManager = $this->createMock(IUserManager::class); + $this->userStatusService = $this->createMock(UserStatusService::class); + $this->availabilityCoordinator = $this->createMock(IAvailabilityCoordinator::class); $this->cacheFactory = $this->createMock(ICacheFactory::class); + $this->logger = $this->createMock(LoggerInterface::class); $this->cache = $this->createMock(ICache::class); + $this->cacheFactory->expects(self::once()) + ->method('createLocal') + ->with('CalendarStatusService') + ->willReturn($this->cache); $this->service = new StatusService($this->timeFactory, $this->calendarManager, $this->userManager, $this->userStatusService, - $this->cacheFactory + $this->availabilityCoordinator, + $this->cacheFactory, + $this->logger, ); } - // public function testNoEmail(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => null, - // ]); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn(null); - // $this->server->expects(self::never()) - // ->method('getServer'); - // $this->timeFactory->expects(self::never()) - // ->method('now'); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('getCalendarsForPrincipal'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testNoAcl(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn([]); - // $aclPlugin->expects(self::never()) - // ->method('checkPrivileges'); - // $this->timeFactory->expects(self::never()) - // ->method('now'); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('getCalendarsForPrincipal'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testNoInbox(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn([]); - // $aclPlugin->expects(self::never()) - // ->method('checkPrivileges'); - // $this->timeFactory->expects(self::never()) - // ->method('now'); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('getCalendarsForPrincipal'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testNoPrivilegesAcl(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $principal = 'principals/users/admin'; - // $calendarHome = $this->createMock(LocalHref::class); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willThrowException(new NeedPrivileges($principal, ['{DAV:}all'])); - // $this->timeFactory->expects(self::never()) - // ->method('now'); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('getCalendarsForPrincipal'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testNotAuthenticated(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $calendarHome = $this->createMock(LocalHref::class); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willThrowException(new NotAuthenticated()); - // $this->timeFactory->expects(self::never()) - // ->method('now'); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('getCalendarsForPrincipal'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testNoCalendars(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $calendarHome = $this->createMock(LocalHref::class); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // $now = new \DateTimeImmutable('1970-1-1', new \DateTimeZone('UTC')); - // $principal = 'principals/users/admin'; - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willReturn(true); - // $this->timeFactory->expects(self::once()) - // ->method('now') - // ->willReturn($now); - // $this->calendarManager->expects(self::once()) - // ->method('getCalendarsForPrincipal') - // ->with($principal) - // ->willReturn([]); - // $this->timeFactory->expects(self::never()) - // ->method('getDateTime'); - // $this->calendarManager->expects(self::never()) - // ->method('newQuery'); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testEmptyAvailabilityAndNoSearchCalendars(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $calendarHome = $this->createMock(LocalHref::class); - // $now = new \DateTimeImmutable('1970-1-1', new \DateTimeZone('UTC')); - // $inTenMinutes = new \DateTime('1970-1-1 01:00'); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // $principal = 'principals/users/admin'; - // $calendar = $this->createMock(CalendarImpl::class); - // $query = $this->createMock(CalendarQuery::class); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with([ '{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willReturn(true); - // $this->timeFactory->expects(self::once()) - // ->method('now') - // ->willReturn($now); - // $this->calendarManager->expects(self::once()) - // ->method('getCalendarsForPrincipal') - // ->with($principal) - // ->willReturn([$calendar]); - // $this->calendarManager->expects(self::once()) - // ->method('newQuery') - // ->with($principal) - // ->willReturn($query); - // $calendar->expects(self::once()) - // ->method('getSchedulingTransparency') - // ->willReturn(new ScheduleCalendarTransp('transparent')); - // $this->timeFactory->expects(self::once()) - // ->method('getDateTime') - // ->with('+10 minutes') - // ->willReturn($inTenMinutes); - // $this->calendarManager->expects(self::never()) - // ->method('searchForPrincipal'); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testEmptyAvailabilityAndSearchCalendarsNoResults(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $availability = ''; - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $calendarHome = $this->createMock(LocalHref::class); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // $now = new \DateTimeImmutable('1970-1-1 00:00', new \DateTimeZone('UTC')); - // $inTenMinutes = new \DateTime('1970-1-1 01:00'); - // $immutableInTenMinutes = \DateTimeImmutable::createFromMutable($inTenMinutes); - // $principal = 'principals/users/admin'; - // $query = $this->createMock(CalendarQuery::class); - // $timezone = new \DateTimeZone('UTC'); - // $timezoneObj = $this->createMock(VTimeZone::class); - // $calendar = $this->createMock(CalendarImpl::class); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with(['{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willReturn(true); - // $this->timeFactory->expects(self::once()) - // ->method('now') - // ->willReturn($now); - // $this->calendarManager->expects(self::once()) - // ->method('getCalendarsForPrincipal') - // ->with($principal) - // ->willReturn([$calendar]); - // $this->calendarManager->expects(self::once()) - // ->method('newQuery') - // ->with($principal) - // ->willReturn($query); - // $calendar->expects(self::once()) - // ->method('getSchedulingTransparency') - // ->willReturn(new ScheduleCalendarTransp('opaque')); - // $calendar->expects(self::once()) - // ->method('getSchedulingTimezone') - // ->willReturn($timezoneObj); - // $timezoneObj->expects(self::once()) - // ->method('getTimeZone') - // ->willReturn($timezone); - // $calendar->expects(self::once()) - // ->method('getUri'); - // $query->expects(self::once()) - // ->method('addSearchCalendar'); - // $query->expects(self::once()) - // ->method('getCalendarUris') - // ->willReturn([$calendar]); - // $this->timeFactory->expects(self::once()) - // ->method('getDateTime') - // ->with('+10 minutes') - // ->willReturn($inTenMinutes); - // $query->expects(self::once()) - // ->method('setTimerangeStart') - // ->with($now); - // $query->expects(self::once()) - // ->method('setTimerangeEnd') - // ->with($immutableInTenMinutes); - // $this->calendarManager->expects(self::once()) - // ->method('searchForPrincipal') - // ->with($query) - // ->willReturn([]); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } - // - // public function testSearchCalendarsNoResults(): void { - // $user = $this->createConfiguredMock(IUser::class, [ - // 'getUID' => 'admin', - // 'getEMailAddress' => 'test@test.com', - // ]); - // $server = $this->createMock(Server::class); - // $schedulingPlugin = $this->createMock(Plugin::class); - // $aclPlugin = $this->createMock(\Sabre\DAVACL\Plugin::class); - // $calendarHome = $this->createMock(LocalHref::class); - // $acl = [[200 => ['{urn:ietf:params:xml:ns:caldav}schedule-inbox-URL' => $calendarHome]]]; - // $now = new \DateTimeImmutable('1970-1-1 00:00', new \DateTimeZone('UTC')); - // $inTenMinutes = new \DateTime('1970-1-1 01:00'); - // $immutableInTenMinutes = \DateTimeImmutable::createFromMutable($inTenMinutes); - // $principal = 'principals/users/admin'; - // $query = $this->createMock(CalendarQuery::class); - // $timezone = new \DateTimeZone('UTC'); - // $timezoneObj = $this->createMock(VTimeZone::class); - // $calendar = $this->createMock(CalendarImpl::class); - // $vCalendar = $this->createMock(VCalendar::class); - // $result = Reader::read('BEGIN:VCALENDAR - //VERSION:2.0 - //PRODID:-//Sabre//Sabre VObject 4.5.3//EN - // CALSCALE:GREGORIAN - //METHOD:REQUEST - //END:VCALENDAR'); - // - // $user->expects(self::once()) - // ->method('getUID') - // ->willReturn('admin'); - // $user->expects(self::once()) - // ->method('getEMailAddress') - // ->willReturn('test@test.com'); - // $this->server->expects(self::once()) - // ->method('getServer') - // ->willReturn($server); - // $server->expects(self::exactly(2)) - // ->method('getPlugin') - // ->withConsecutive( - // ['caldav-schedule'], - // ['acl'], - // )->willReturnOnConsecutiveCalls($schedulingPlugin, $aclPlugin); - // $aclPlugin->expects(self::once()) - // ->method('principalSearch') - // ->with(['{http://sabredav.org/ns}email-address' => 'test@test.com']) - // ->willReturn($acl); - // $calendarHome->expects(self::once()) - // ->method('getHref') - // ->willReturn('calendars/admin/inbox/'); - // $aclPlugin->expects(self::once()) - // ->method('checkPrivileges') - // ->willReturn(true); - // $this->timeFactory->expects(self::once()) - // ->method('now') - // ->willReturn($now); - // $this->calendarManager->expects(self::once()) - // ->method('getCalendarsForPrincipal') - // ->with($principal) - // ->willReturn([$calendar]); - // $this->calendarManager->expects(self::once()) - // ->method('newQuery') - // ->with($principal) - // ->willReturn($query); - // $calendar->expects(self::once()) - // ->method('getSchedulingTransparency') - // ->willReturn(new ScheduleCalendarTransp('opaque')); - // $calendar->expects(self::once()) - // ->method('getSchedulingTimezone') - // ->willReturn($timezoneObj); - // $timezoneObj->expects(self::once()) - // ->method('getTimeZone') - // ->willReturn($timezone); - // $calendar->expects(self::once()) - // ->method('getUri'); - // $query->expects(self::once()) - // ->method('addSearchCalendar'); - // $query->expects(self::once()) - // ->method('getCalendarUris') - // ->willReturn([$calendar]); - // $this->timeFactory->expects(self::once()) - // ->method('getDateTime') - // ->with('+10 minutes') - // ->willReturn($inTenMinutes); - // $query->expects(self::once()) - // ->method('setTimerangeStart') - // ->with($now); - // $query->expects(self::once()) - // ->method('setTimerangeEnd') - // ->with($immutableInTenMinutes); - // $this->calendarManager->expects(self::once()) - // ->method('searchForPrincipal') - // ->with($query) - // ->willReturn([]); - // $this->generator->expects(self::never()) - // ->method('getVCalendar'); - // $vCalendar->expects(self::never()) - // ->method('add'); - // $this->generator->expects(self::never()) - // ->method('setObjects'); - // $this->generator->expects(self::never()) - // ->method('setTimeRange'); - // $this->generator->expects(self::never()) - // ->method('setTimeZone'); - // $this->generator->expects(self::never()) - // ->method('getResult'); - // - // $status = $this->service->processCalendarAvailability($user); - // $this->assertNull($status); - // } + public function testNoUser(): void { + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn(null); + $this->availabilityCoordinator->expects(self::never()) + ->method('getCurrentOutOfOfficeData'); + $this->availabilityCoordinator->expects(self::never()) + ->method('isInEffect'); + $this->logger->expects(self::never()) + ->method('debug'); + $this->cache->expects(self::never()) + ->method('get'); + $this->cache->expects(self::never()) + ->method('set'); + $this->calendarManager->expects(self::never()) + ->method('getCalendarsForPrincipal'); + $this->calendarManager->expects(self::never()) + ->method('newQuery'); + $this->timeFactory->expects(self::never()) + ->method('getDateTime'); + $this->calendarManager->expects(self::never()) + ->method('searchForPrincipal'); + $this->userStatusService->expects(self::never()) + ->method('revertUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('setUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('findByUserId'); + + $this->service->processCalendarStatus('admin'); + } + + public function testOOOInEffect(): void { + $user = $this->createConfiguredMock(IUser::class, [ + 'getUID' => 'admin', + ]); + + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn($user); + $this->availabilityCoordinator->expects(self::once()) + ->method('getCurrentOutOfOfficeData') + ->willReturn($this->createMock(IOutOfOfficeData::class)); + $this->availabilityCoordinator->expects(self::once()) + ->method('isInEffect') + ->willReturn(true); + $this->logger->expects(self::once()) + ->method('debug'); + $this->cache->expects(self::never()) + ->method('get'); + $this->cache->expects(self::never()) + ->method('set'); + $this->calendarManager->expects(self::never()) + ->method('getCalendarsForPrincipal'); + $this->calendarManager->expects(self::never()) + ->method('newQuery'); + $this->timeFactory->expects(self::never()) + ->method('getDateTime'); + $this->calendarManager->expects(self::never()) + ->method('searchForPrincipal'); + $this->userStatusService->expects(self::never()) + ->method('revertUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('setUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('findByUserId'); + + $this->service->processCalendarStatus('admin'); + } + + public function testNoCalendars(): void { + $user = $this->createConfiguredMock(IUser::class, [ + 'getUID' => 'admin', + ]); + + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn($user); + $this->availabilityCoordinator->expects(self::once()) + ->method('getCurrentOutOfOfficeData') + ->willReturn(null); + $this->availabilityCoordinator->expects(self::never()) + ->method('isInEffect'); + $this->cache->expects(self::once()) + ->method('get') + ->willReturn(null); + $this->cache->expects(self::once()) + ->method('set'); + $this->calendarManager->expects(self::once()) + ->method('getCalendarsForPrincipal') + ->willReturn([]); + $this->calendarManager->expects(self::never()) + ->method('newQuery'); + $this->timeFactory->expects(self::never()) + ->method('getDateTime'); + $this->calendarManager->expects(self::never()) + ->method('searchForPrincipal'); + $this->userStatusService->expects(self::once()) + ->method('revertUserStatus'); + $this->logger->expects(self::once()) + ->method('debug'); + $this->userStatusService->expects(self::never()) + ->method('setUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('findByUserId'); + + $this->service->processCalendarStatus('admin'); + } + + public function testNoCalendarEvents(): void { + $user = $this->createConfiguredMock(IUser::class, [ + 'getUID' => 'admin', + ]); + + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn($user); + $this->availabilityCoordinator->expects(self::once()) + ->method('getCurrentOutOfOfficeData') + ->willReturn(null); + $this->availabilityCoordinator->expects(self::never()) + ->method('isInEffect'); + $this->cache->expects(self::once()) + ->method('get') + ->willReturn(null); + $this->cache->expects(self::once()) + ->method('set'); + $this->calendarManager->expects(self::once()) + ->method('getCalendarsForPrincipal') + ->willReturn([$this->createMock(CalendarImpl::class)]); + $this->calendarManager->expects(self::once()) + ->method('newQuery') + ->willReturn(new CalendarQuery('admin')); + $this->timeFactory->expects(self::exactly(2)) + ->method('getDateTime') + ->willReturn(new \DateTime()); + $this->calendarManager->expects(self::once()) + ->method('searchForPrincipal') + ->willReturn([]); + $this->userStatusService->expects(self::once()) + ->method('revertUserStatus'); + $this->logger->expects(self::once()) + ->method('debug'); + $this->userStatusService->expects(self::never()) + ->method('setUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('findByUserId'); + + $this->service->processCalendarStatus('admin'); + } + + public function testCalendarEvent(): void { + $user = $this->createConfiguredMock(IUser::class, [ + 'getUID' => 'admin', + ]); + + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn($user); + $this->availabilityCoordinator->expects(self::once()) + ->method('getCurrentOutOfOfficeData') + ->willReturn(null); + $this->availabilityCoordinator->expects(self::never()) + ->method('isInEffect'); + $this->cache->expects(self::once()) + ->method('get') + ->willReturn(null); + $this->cache->expects(self::once()) + ->method('set'); + $this->calendarManager->expects(self::once()) + ->method('getCalendarsForPrincipal') + ->willReturn([$this->createMock(CalendarImpl::class)]); + $this->calendarManager->expects(self::once()) + ->method('newQuery') + ->willReturn(new CalendarQuery('admin')); + $this->timeFactory->expects(self::exactly(2)) + ->method('getDateTime') + ->willReturn(new \DateTime()); + $this->userStatusService->expects(self::once()) + ->method('findByUserId') + ->willThrowException(new DoesNotExistException('')); + $this->calendarManager->expects(self::once()) + ->method('searchForPrincipal') + ->willReturn([['objects' => [[]]]]); + $this->userStatusService->expects(self::never()) + ->method('revertUserStatus'); + $this->logger->expects(self::once()) + ->method('debug'); + $this->userStatusService->expects(self::once()) + ->method('setUserStatus'); + + + $this->service->processCalendarStatus('admin'); + } + + public function testCallStatus(): void { + $user = $this->createConfiguredMock(IUser::class, [ + 'getUID' => 'admin', + ]); + + $this->userManager->expects(self::once()) + ->method('get') + ->willReturn($user); + $this->availabilityCoordinator->expects(self::once()) + ->method('getCurrentOutOfOfficeData') + ->willReturn(null); + $this->availabilityCoordinator->expects(self::never()) + ->method('isInEffect'); + $this->cache->expects(self::once()) + ->method('get') + ->willReturn(null); + $this->cache->expects(self::once()) + ->method('set'); + $this->calendarManager->expects(self::once()) + ->method('getCalendarsForPrincipal') + ->willReturn([$this->createMock(CalendarImpl::class)]); + $this->calendarManager->expects(self::once()) + ->method('newQuery') + ->willReturn(new CalendarQuery('admin')); + $this->timeFactory->expects(self::exactly(2)) + ->method('getDateTime') + ->willReturn(new \DateTime()); + $this->calendarManager->expects(self::once()) + ->method('searchForPrincipal') + ->willReturn([['objects' => [[]]]]); + $userStatus = new UserStatus(); + $userStatus->setMessageId(IUserStatus::MESSAGE_CALL); + $userStatus->setStatusTimestamp(123456); + $this->userStatusService->expects(self::once()) + ->method('findByUserId') + ->willReturn($userStatus); + $this->logger->expects(self::once()) + ->method('debug'); + $this->userStatusService->expects(self::never()) + ->method('revertUserStatus'); + $this->userStatusService->expects(self::never()) + ->method('setUserStatus'); + + + $this->service->processCalendarStatus('admin'); + } }