You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
nextcloud-server/apps/dav/tests/unit/CalDAV/Status/StatusServiceTest.php

415 lines
14 KiB

<?php
/**
* @copyright 2023 Anna Larch <anna.larch@gmx.net>
*
* @author Anna Larch <anna.larch@gmx.net>
*
* @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 <http://www.gnu.org/licenses/>.
*
*/
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\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 {
private ITimeFactory|MockObject $timeFactory;
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 {
parent::setUp();
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->calendarManager = $this->createMock(IManager::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->availabilityCoordinator,
$this->cacheFactory,
$this->logger,
);
}
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');
}
public function testInvisibleStatus(): 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->setStatus(IUserStatus::INVISIBLE);
$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');
}
public function testDNDStatus(): 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->setStatus(IUserStatus::DND);
$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');
}
}