2017-10-31 12:06:01 -04:00
< ? php
2025-06-30 09:04:05 -04:00
2017-10-31 12:06:01 -04:00
/**
2024-05-10 09:09:14 -04:00
* SPDX - FileCopyrightText : 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2017-10-31 12:06:01 -04:00
*/
namespace Test\Calendar ;
2025-01-08 15:08:15 -05:00
use DateTimeImmutable ;
2021-09-27 08:58:16 -04:00
use OC\AppFramework\Bootstrap\Coordinator ;
2025-01-08 15:08:15 -05:00
use OC\Calendar\AvailabilityResult ;
2019-11-22 14:52:10 -05:00
use OC\Calendar\Manager ;
2025-01-08 15:08:15 -05:00
use OCA\DAV\CalDAV\Auth\CustomPrincipalPlugin ;
2025-06-12 12:31:58 -04:00
use OCA\DAV\Connector\Sabre\Server ;
2025-01-08 15:08:15 -05:00
use OCA\DAV\ServerFactory ;
2022-06-23 16:17:53 -04:00
use OCP\AppFramework\Utility\ITimeFactory ;
2017-10-31 12:06:01 -04:00
use OCP\Calendar\ICalendar ;
2024-09-07 18:28:50 -04:00
use OCP\Calendar\ICalendarIsShared ;
use OCP\Calendar\ICalendarIsWritable ;
2022-06-23 16:17:53 -04:00
use OCP\Calendar\ICreateFromString ;
2022-12-06 07:52:13 -05:00
use OCP\Calendar\IHandleImipMessage ;
2025-01-08 15:08:15 -05:00
use OCP\IUser ;
use OCP\IUserManager ;
2024-12-16 15:20:50 -05:00
use OCP\Security\ISecureRandom ;
2021-09-27 08:58:16 -04:00
use PHPUnit\Framework\MockObject\MockObject ;
2021-10-14 05:12:55 -04:00
use Psr\Container\ContainerInterface ;
use Psr\Log\LoggerInterface ;
2025-01-08 15:08:15 -05:00
use Sabre\HTTP\RequestInterface ;
use Sabre\HTTP\ResponseInterface ;
2024-09-07 18:28:50 -04:00
use Sabre\VObject\Component\VCalendar ;
2019-11-22 14:52:10 -05:00
use Test\TestCase ;
2017-10-31 12:06:01 -04:00
2022-12-06 07:52:13 -05:00
/*
* This allows us to create Mock object supporting both interfaces
*/
2024-09-07 18:28:50 -04:00
interface ITestCalendar extends ICreateFromString , IHandleImipMessage , ICalendarIsShared , ICalendarIsWritable {
2022-12-06 07:52:13 -05:00
}
2017-10-31 12:06:01 -04:00
class ManagerTest extends TestCase {
2024-09-07 18:28:50 -04:00
/** @var Coordinator&MockObject */
2021-09-27 08:58:16 -04:00
private $coordinator ;
2024-09-07 18:28:50 -04:00
/** @var ContainerInterface&MockObject */
2021-10-14 05:12:55 -04:00
private $container ;
2024-09-07 18:28:50 -04:00
/** @var LoggerInterface&MockObject */
2021-10-14 05:12:55 -04:00
private $logger ;
2017-10-31 12:06:01 -04:00
/** @var Manager */
private $manager ;
2024-09-07 18:28:50 -04:00
/** @var ITimeFactory&MockObject */
2022-06-23 16:17:53 -04:00
private $time ;
2024-12-16 15:20:50 -05:00
/** @var ISecureRandom&MockObject */
private ISecureRandom $secureRandom ;
2025-01-08 15:08:15 -05:00
private IUserManager & MockObject $userManager ;
private ServerFactory & MockObject $serverFactory ;
2024-09-07 18:28:50 -04:00
private VCalendar $vCalendar1a ;
2025-05-12 14:43:35 -04:00
private VCalendar $vCalendar2a ;
private VCalendar $vCalendar3a ;
2024-09-07 18:28:50 -04:00
2019-11-21 10:40:38 -05:00
protected function setUp () : void {
2017-10-31 12:06:01 -04:00
parent :: setUp ();
2021-09-27 08:58:16 -04:00
$this -> coordinator = $this -> createMock ( Coordinator :: class );
2021-10-14 05:12:55 -04:00
$this -> container = $this -> createMock ( ContainerInterface :: class );
$this -> logger = $this -> createMock ( LoggerInterface :: class );
2022-06-23 16:17:53 -04:00
$this -> time = $this -> createMock ( ITimeFactory :: class );
2024-12-16 15:20:50 -05:00
$this -> secureRandom = $this -> createMock ( ISecureRandom :: class );
2025-01-08 15:08:15 -05:00
$this -> userManager = $this -> createMock ( IUserManager :: class );
$this -> serverFactory = $this -> createMock ( ServerFactory :: class );
2021-09-27 08:58:16 -04:00
$this -> manager = new Manager (
2021-10-14 05:12:55 -04:00
$this -> coordinator ,
$this -> container ,
2022-06-23 16:17:53 -04:00
$this -> logger ,
$this -> time ,
2024-12-16 15:20:50 -05:00
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2021-09-27 08:58:16 -04:00
);
2024-09-07 18:28:50 -04:00
// construct calendar with a 1 hour event and same start/end time zones
$this -> vCalendar1a = new VCalendar ();
/** @var VEvent $vEvent */
$vEvent = $this -> vCalendar1a -> add ( 'VEVENT' , []);
$vEvent -> UID -> setValue ( '96a0e6b1-d886-4a55-a60d-152b31401dcc' );
$vEvent -> add ( 'DTSTART' , '20240701T080000' , [ 'TZID' => 'America/Toronto' ]);
$vEvent -> add ( 'DTEND' , '20240701T090000' , [ 'TZID' => 'America/Toronto' ]);
$vEvent -> add ( 'SUMMARY' , 'Test Event' );
2025-05-12 14:43:35 -04:00
$vEvent -> add ( 'SEQUENCE' , 3 );
$vEvent -> add ( 'STATUS' , 'CONFIRMED' );
$vEvent -> add ( 'TRANSP' , 'OPAQUE' );
2024-09-07 18:28:50 -04:00
$vEvent -> add ( 'ORGANIZER' , 'mailto:organizer@testing.com' , [ 'CN' => 'Organizer' ]);
$vEvent -> add ( 'ATTENDEE' , 'mailto:attendee1@testing.com' , [
'CN' => 'Attendee One' ,
'CUTYPE' => 'INDIVIDUAL' ,
'PARTSTAT' => 'NEEDS-ACTION' ,
'ROLE' => 'REQ-PARTICIPANT' ,
'RSVP' => 'TRUE'
]);
2025-05-12 14:43:35 -04:00
// construct calendar with a event for reply
$this -> vCalendar2a = new VCalendar ();
/** @var VEvent $vEvent */
$vEvent = $this -> vCalendar2a -> add ( 'VEVENT' , []);
$vEvent -> UID -> setValue ( 'dcc733bf-b2b2-41f2-a8cf-550ae4b67aff' );
$vEvent -> add ( 'DTSTART' , '20210820' );
$vEvent -> add ( 'DTEND' , '20220821' );
$vEvent -> add ( 'SUMMARY' , 'berry basket' );
$vEvent -> add ( 'SEQUENCE' , 3 );
$vEvent -> add ( 'STATUS' , 'CONFIRMED' );
$vEvent -> add ( 'TRANSP' , 'OPAQUE' );
$vEvent -> add ( 'ORGANIZER' , 'mailto:linus@stardew-tent-living.com' , [ 'CN' => 'admin' ]);
$vEvent -> add ( 'ATTENDEE' , 'mailto:pierre@general-store.com' , [
'CN' => 'pierre@general-store.com' ,
'CUTYPE' => 'INDIVIDUAL' ,
'ROLE' => 'REQ-PARTICIPANT' ,
'PARTSTAT' => 'ACCEPTED' ,
]);
// construct calendar with a event for reply
$this -> vCalendar3a = new VCalendar ();
/** @var VEvent $vEvent */
$vEvent = $this -> vCalendar3a -> add ( 'VEVENT' , []);
$vEvent -> UID -> setValue ( 'dcc733bf-b2b2-41f2-a8cf-550ae4b67aff' );
$vEvent -> add ( 'DTSTART' , '20210820' );
$vEvent -> add ( 'DTEND' , '20220821' );
$vEvent -> add ( 'SUMMARY' , 'berry basket' );
$vEvent -> add ( 'SEQUENCE' , 3 );
$vEvent -> add ( 'STATUS' , 'CANCELLED' );
$vEvent -> add ( 'TRANSP' , 'OPAQUE' );
$vEvent -> add ( 'ORGANIZER' , 'mailto:linus@stardew-tent-living.com' , [ 'CN' => 'admin' ]);
$vEvent -> add ( 'ATTENDEE' , 'mailto:pierre@general-store.com' , [
'CN' => 'pierre@general-store.com' ,
'CUTYPE' => 'INDIVIDUAL' ,
'ROLE' => 'REQ-PARTICIPANT' ,
'PARTSTAT' => 'ACCEPTED' ,
]);
2017-10-31 12:06:01 -04:00
}
2025-06-30 10:56:59 -04:00
#[\PHPUnit\Framework\Attributes\DataProvider('searchProvider')]
2017-10-31 12:06:01 -04:00
public function testSearch ( $search1 , $search2 , $expected ) : void {
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar1 */
2017-10-31 12:06:01 -04:00
$calendar1 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar1 -> method ( 'getKey' ) -> willReturn ( 'simple:1' );
2017-10-31 12:06:01 -04:00
$calendar1 -> expects ( $this -> once ())
-> method ( 'search' )
-> with ( '' , [], [], null , null )
2020-03-25 17:21:27 -04:00
-> willReturn ( $search1 );
2017-10-31 12:06:01 -04:00
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar2 */
2017-10-31 12:06:01 -04:00
$calendar2 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar2 -> method ( 'getKey' ) -> willReturn ( 'simple:2' );
2017-10-31 12:06:01 -04:00
$calendar2 -> expects ( $this -> once ())
-> method ( 'search' )
-> with ( '' , [], [], null , null )
2020-03-25 17:21:27 -04:00
-> willReturn ( $search2 );
2017-10-31 12:06:01 -04:00
$this -> manager -> registerCalendar ( $calendar1 );
$this -> manager -> registerCalendar ( $calendar2 );
$result = $this -> manager -> search ( '' );
$this -> assertEquals ( $expected , $result );
}
2025-06-30 10:56:59 -04:00
#[\PHPUnit\Framework\Attributes\DataProvider('searchProvider')]
2017-10-31 12:06:01 -04:00
public function testSearchOptions ( $search1 , $search2 , $expected ) : void {
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar1 */
2017-10-31 12:06:01 -04:00
$calendar1 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar1 -> method ( 'getKey' ) -> willReturn ( 'simple:1' );
2017-10-31 12:06:01 -04:00
$calendar1 -> expects ( $this -> once ())
-> method ( 'search' )
-> with ( 'searchTerm' , [ 'SUMMARY' , 'DESCRIPTION' ],
[ 'timerange' => [ 'start' => null , 'end' => null ]], 5 , 20 )
2020-03-25 17:21:27 -04:00
-> willReturn ( $search1 );
2017-10-31 12:06:01 -04:00
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar2 */
2017-10-31 12:06:01 -04:00
$calendar2 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar2 -> method ( 'getKey' ) -> willReturn ( 'simple:2' );
2017-10-31 12:06:01 -04:00
$calendar2 -> expects ( $this -> once ())
-> method ( 'search' )
-> with ( 'searchTerm' , [ 'SUMMARY' , 'DESCRIPTION' ],
[ 'timerange' => [ 'start' => null , 'end' => null ]], 5 , 20 )
2020-03-25 17:21:27 -04:00
-> willReturn ( $search2 );
2017-10-31 12:06:01 -04:00
$this -> manager -> registerCalendar ( $calendar1 );
$this -> manager -> registerCalendar ( $calendar2 );
$result = $this -> manager -> search ( 'searchTerm' , [ 'SUMMARY' , 'DESCRIPTION' ],
[ 'timerange' => [ 'start' => null , 'end' => null ]], 5 , 20 );
$this -> assertEquals ( $expected , $result );
}
2025-05-12 11:39:58 -04:00
public static function searchProvider () : array {
2017-10-31 12:06:01 -04:00
$search1 = [
[
'id' => 1 ,
'data' => 'foobar' ,
],
[
'id' => 2 ,
'data' => 'barfoo' ,
]
];
$search2 = [
[
'id' => 3 ,
'data' => 'blablub' ,
],
[
'id' => 4 ,
'data' => 'blubbla' ,
]
];
$expected = [
[
'id' => 1 ,
'data' => 'foobar' ,
'calendar-key' => 'simple:1' ,
],
[
'id' => 2 ,
'data' => 'barfoo' ,
'calendar-key' => 'simple:1' ,
],
[
'id' => 3 ,
'data' => 'blablub' ,
'calendar-key' => 'simple:2' ,
],
[
'id' => 4 ,
'data' => 'blubbla' ,
'calendar-key' => 'simple:2' ,
]
];
return [
[
$search1 ,
$search2 ,
$expected
]
];
}
public function testRegisterUnregister () : void {
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar1 */
2017-10-31 12:06:01 -04:00
$calendar1 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar1 -> method ( 'getKey' ) -> willReturn ( 'key1' );
2017-10-31 12:06:01 -04:00
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar2 */
2017-10-31 12:06:01 -04:00
$calendar2 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar2 -> method ( 'getKey' ) -> willReturn ( 'key2' );
2017-10-31 12:06:01 -04:00
$this -> manager -> registerCalendar ( $calendar1 );
$this -> manager -> registerCalendar ( $calendar2 );
$result = $this -> manager -> getCalendars ();
$this -> assertCount ( 2 , $result );
$this -> assertContains ( $calendar1 , $result );
$this -> assertContains ( $calendar2 , $result );
$this -> manager -> unregisterCalendar ( $calendar1 );
$result = $this -> manager -> getCalendars ();
$this -> assertCount ( 1 , $result );
$this -> assertContains ( $calendar2 , $result );
}
public function testGetCalendars () : void {
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar1 */
2017-10-31 12:06:01 -04:00
$calendar1 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar1 -> method ( 'getKey' ) -> willReturn ( 'key1' );
2017-10-31 12:06:01 -04:00
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar2 */
2017-10-31 12:06:01 -04:00
$calendar2 = $this -> createMock ( ICalendar :: class );
2020-03-25 17:21:27 -04:00
$calendar2 -> method ( 'getKey' ) -> willReturn ( 'key2' );
2017-10-31 12:06:01 -04:00
$this -> manager -> registerCalendar ( $calendar1 );
$this -> manager -> registerCalendar ( $calendar2 );
$result = $this -> manager -> getCalendars ();
$this -> assertCount ( 2 , $result );
$this -> assertContains ( $calendar1 , $result );
$this -> assertContains ( $calendar2 , $result );
$this -> manager -> clear ();
$result = $this -> manager -> getCalendars ();
$this -> assertCount ( 0 , $result );
}
public function testEnabledIfNot () : void {
$isEnabled = $this -> manager -> isEnabled ();
$this -> assertFalse ( $isEnabled );
}
public function testIfEnabledIfSo () : void {
2021-09-27 08:58:16 -04:00
/** @var ICalendar | MockObject $calendar */
2017-10-31 12:06:01 -04:00
$calendar = $this -> createMock ( ICalendar :: class );
$this -> manager -> registerCalendar ( $calendar );
$isEnabled = $this -> manager -> isEnabled ();
$this -> assertTrue ( $isEnabled );
}
2022-06-23 16:17:53 -04:00
2024-09-07 18:28:50 -04:00
public function testHandleImipRequestWithNoCalendars () : void {
// construct calendar manager returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message could not be processed because user has no calendars' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithInvalidData () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'error' )
-> with ( 'iMip message could not be processed because an error occurred while parsing the iMip message' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
// Act
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , 'Invalid data' );
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithInvalidMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoEvent () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains no event' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
$calendar -> remove ( 'VEVENT' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoUid () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains a UID' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
$calendar -> VEVENT -> remove ( 'UID' );
2025-05-12 14:43:35 -04:00
// Act
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoOrganizer () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains an organizer' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
$calendar -> VEVENT -> remove ( 'ORGANIZER' );
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoAttendee () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains any attendees' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
$calendar -> VEVENT -> remove ( 'ATTENDEE' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithInvalidAttendee () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event does not contain a attendee that matches the recipient' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee2@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequestWithNoMatch () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
$userCalendar -> expects ( self :: once ())
-> method ( 'isDeleted' )
-> willReturn ( false );
$userCalendar -> expects ( self :: once ())
-> method ( 'isWritable' )
-> willReturn ( true );
$userCalendar -> expects ( self :: once ())
-> method ( 'isShared' )
-> willReturn ( false );
$userCalendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([]);
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
2025-05-12 14:43:35 -04:00
-> with ( 'iMip message event could not be processed because no corresponding event was found in any calendar' );
2024-09-07 18:28:50 -04:00
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertFalse ( $result );
}
public function testHandleImipRequest () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
$userCalendar -> expects ( self :: once ())
-> method ( 'isDeleted' )
-> willReturn ( false );
$userCalendar -> expects ( self :: once ())
-> method ( 'isWritable' )
-> willReturn ( true );
$userCalendar -> expects ( self :: once ())
-> method ( 'isShared' )
-> willReturn ( false );
$userCalendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([[ 'uri' => 'principals/user/attendee1/personal' ]]);
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2024-09-07 18:28:50 -04:00
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$calendar = $this -> vCalendar1a ;
$calendar -> add ( 'METHOD' , 'REQUEST' );
// construct user calendar returns
$userCalendar -> expects ( self :: once ())
-> method ( 'handleIMipMessage' )
-> with ( '' , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Act
2024-09-07 18:28:50 -04:00
$result = $manager -> handleIMipRequest ( $principalUri , $sender , $recipient , $calendar -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2024-09-07 18:28:50 -04:00
$this -> assertTrue ( $result );
}
2025-05-12 14:43:35 -04:00
public function testHandleImipReplyWithNoCalendars () : void {
// construct calendar manager returns
/** @var Manager&MockObject $manager */
2022-06-23 16:17:53 -04:00
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 14:43:35 -04:00
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
2022-09-06 03:05:36 -04:00
-> getMock ();
2022-06-23 16:17:53 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([]);
2025-05-12 14:43:35 -04:00
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message could not be processed because user has no calendars' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'REPLY' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
2022-06-23 16:17:53 -04:00
$this -> assertFalse ( $result );
}
2025-05-12 14:43:35 -04:00
public function testHandleImipReplyWithInvalidData () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
2022-06-23 16:17:53 -04:00
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 14:43:35 -04:00
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
2022-09-06 03:05:36 -04:00
-> getMock ();
2022-06-23 16:17:53 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
2025-05-12 14:43:35 -04:00
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'error' )
-> with ( 'iMip message could not be processed because an error occurred while parsing the iMip message' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , 'Invalid data' );
// Assert
2022-06-23 16:17:53 -04:00
$this -> assertFalse ( $result );
}
2025-05-12 14:43:35 -04:00
public function testHandleImipReplyWithNoMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
2022-06-23 16:17:53 -04:00
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 14:43:35 -04:00
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
2022-09-06 03:05:36 -04:00
-> getMock ();
2025-05-12 14:43:35 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
2022-06-23 16:17:53 -04:00
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
2025-05-12 14:43:35 -04:00
$calendar = $this -> vCalendar2a ;
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
2022-06-23 16:17:53 -04:00
$this -> assertFalse ( $result );
}
2025-05-12 14:43:35 -04:00
public function testHandleImipReplyWithInvalidMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
2022-06-23 16:17:53 -04:00
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 14:43:35 -04:00
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
2022-09-06 03:05:36 -04:00
-> getMock ();
2022-06-23 16:17:53 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
2025-05-12 14:43:35 -04:00
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'UNKNOWN' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
2022-09-07 20:26:46 -04:00
$this -> assertFalse ( $result );
2022-06-23 16:17:53 -04:00
}
2025-05-12 14:43:35 -04:00
public function testHandleImipReplyWithNoEvent () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
2022-06-23 16:17:53 -04:00
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 14:43:35 -04:00
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
2022-09-06 03:05:36 -04:00
-> getMock ();
2025-05-12 14:43:35 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains no event' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'REPLY' );
$calendar -> remove ( 'VEVENT' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReplyWithNoUid () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains a UID' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'REPLY' );
$calendar -> VEVENT -> remove ( 'UID' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReplyWithNoOrganizer () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains an organizer' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'REPLY' );
$calendar -> VEVENT -> remove ( 'ORGANIZER' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReplyWithNoAttendee () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains any attendees' );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendar = $this -> vCalendar2a ;
$calendar -> add ( 'METHOD' , 'REPLY' );
$calendar -> VEVENT -> remove ( 'ATTENDEE' );
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReplyDateInThePast () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger and time returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event could not be processed because the event is in the past' );
$this -> time -> expects ( self :: once ())
-> method ( 'getTime' )
-> willReturn ( time ());
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendarData = clone $this -> vCalendar2a ;
$calendarData -> add ( 'METHOD' , 'REPLY' );
$calendarData -> VEVENT -> DTSTART = new \DateTime ( '2013-04-07' ); // set to in the past
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReplyEventNotFound () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
$userCalendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([]);
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct time returns
$this -> time -> expects ( self :: once ())
-> method ( 'getTime' )
-> willReturn ( 1628374233 );
// construct parameters
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendarData = clone $this -> vCalendar2a ;
$calendarData -> add ( 'METHOD' , 'REPLY' );
// construct logger return
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
2025-07-21 05:24:16 -04:00
-> with ( 'iMip message event could not be processed because no corresponding event was found in any calendar' , [ 'principalUri' => $principalUri , 'eventUid' => $calendarData -> VEVENT -> UID -> getValue ()]);
2025-05-12 14:43:35 -04:00
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipReply () : void {
/** @var Manager | \PHPUnit\Framework\MockObject\MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
2025-05-12 11:39:58 -04:00
-> onlyMethods ([
2025-05-12 14:43:35 -04:00
'getCalendarsForPrincipal'
])
-> getMock ();
$calendar = $this -> createMock ( ITestCalendar :: class );
$principalUri = 'principals/user/linus' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$calendarData = clone $this -> vCalendar2a ;
$calendarData -> add ( 'METHOD' , 'REPLY' );
$this -> time -> expects ( self :: once ())
-> method ( 'getTime' )
-> willReturn ( 1628374233 );
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $calendar ]);
$calendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([[ 'uri' => 'testname.ics' ]]);
$calendar -> expects ( self :: once ())
-> method ( 'handleIMipMessage' )
-> with ( 'testname.ics' , $calendarData -> serialize ());
// Act
$result = $manager -> handleIMipReply ( $principalUri , $sender , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertTrue ( $result );
}
public function testHandleImipCancelWithNoCalendars () : void {
// construct calendar manager returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message could not be processed because user has no calendars' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithInvalidData () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'error' )
-> with ( 'iMip message could not be processed because an error occurred while parsing the iMip message' );
// construct parameters
$principalUri = 'principals/user/attendee1' ;
$sender = 'organizer@testing.com' ;
$recipient = 'attendee1@testing.com' ;
$replyTo = null ;
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , 'Invalid data' );
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithNoMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithInvalidMethod () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains an incorrect or invalid method' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'UNKNOWN' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithNoEvent () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message contains no event' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
$calendar -> remove ( 'VEVENT' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithNoUid () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains a UID' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
$calendar -> VEVENT -> remove ( 'UID' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithNoOrganizer () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains an organizer' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
$calendar -> VEVENT -> remove ( 'ORGANIZER' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelWithNoAttendee () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event dose not contains any attendees' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'pierre@general-store.com' ;
$recipient = 'linus@stardew-tent-living.com' ;
$replyTo = null ;
$calendar = $this -> vCalendar3a ;
$calendar -> add ( 'METHOD' , 'CANCEL' );
$calendar -> VEVENT -> remove ( 'ATTENDEE' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendar -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelAttendeeNotRecipient () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event could not be processed because recipient must be an ATTENDEE of this event' );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'leah@general-store.com' ;
$replyTo = null ;
$calendarData = clone $this -> vCalendar3a ;
$calendarData -> add ( 'METHOD' , 'CANCEL' );
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelDateInThePast () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct logger and time returns
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
-> with ( 'iMip message event could not be processed because the event is in the past' );
$this -> time -> expects ( self :: once ())
-> method ( 'getTime' )
-> willReturn ( time ());
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendarData = clone $this -> vCalendar3a ;
$calendarData -> add ( 'METHOD' , 'CANCEL' );
$calendarData -> VEVENT -> DTSTART = new \DateTime ( '2013-04-07' ); // set to in the past
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelEventNotFound () : void {
// construct mock user calendar
$userCalendar = $this -> createMock ( ITestCalendar :: class );
$userCalendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([]);
// construct mock calendar manager and returns
/** @var Manager&MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
-> onlyMethods ([ 'getCalendarsForPrincipal' ])
-> getMock ();
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> willReturn ([ $userCalendar ]);
// construct time returns
$this -> time -> expects ( self :: once ())
-> method ( 'getTime' )
-> willReturn ( 1628374233 );
// construct parameters
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
$calendarData = clone $this -> vCalendar3a ;
$calendarData -> add ( 'METHOD' , 'CANCEL' );
// construct logger return
$this -> logger -> expects ( self :: once ()) -> method ( 'warning' )
2025-07-21 05:24:16 -04:00
-> with ( 'iMip message event could not be processed because no corresponding event was found in any calendar' , [ 'principalUri' => $principalUri , 'eventUid' => $calendarData -> VEVENT -> UID -> getValue ()]);
2025-05-12 14:43:35 -04:00
// Act
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendarData -> serialize ());
// Assert
$this -> assertFalse ( $result );
}
public function testHandleImipCancelOrganiserInReplyTo () : void {
/** @var Manager | \PHPUnit\Framework\MockObject\MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
$this -> time ,
$this -> secureRandom ,
$this -> userManager ,
$this -> serverFactory ,
])
2025-05-12 11:39:58 -04:00
-> onlyMethods ([
2025-05-12 14:43:35 -04:00
'getCalendarsForPrincipal'
])
-> getMock ();
2025-05-12 11:39:58 -04:00
2022-06-23 16:17:53 -04:00
$principalUri = 'principals/user/pierre' ;
2025-05-12 14:43:35 -04:00
$sender = 'clint@stardew-tent-living.com' ;
2022-06-23 16:17:53 -04:00
$recipient = 'pierre@general-store.com' ;
$replyTo = 'linus@stardew-tent-living.com' ;
2024-09-07 18:28:50 -04:00
$calendar = $this -> createMock ( ITestCalendar :: class );
2025-05-12 14:43:35 -04:00
$calendarData = clone $this -> vCalendar3a ;
$calendarData -> add ( 'METHOD' , 'CANCEL' );
2022-06-23 16:17:53 -04:00
$this -> time -> expects ( self :: once ())
2022-09-05 12:09:49 -04:00
-> method ( 'getTime' )
2022-09-07 20:26:46 -04:00
-> willReturn ( 1628374233 );
2022-06-23 16:17:53 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> with ( $principalUri )
-> willReturn ([ $calendar ]);
$calendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([[ 'uri' => 'testname.ics' ]]);
$calendar -> expects ( self :: once ())
-> method ( 'handleIMipMessage' )
-> with ( 'testname.ics' , $calendarData -> serialize ());
2025-05-12 14:43:35 -04:00
// Act
2022-09-07 20:26:46 -04:00
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendarData -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2022-09-07 20:26:46 -04:00
$this -> assertTrue ( $result );
2022-06-23 16:17:53 -04:00
}
public function testHandleImipCancel () : void {
/** @var Manager | \PHPUnit\Framework\MockObject\MockObject $manager */
$manager = $this -> getMockBuilder ( Manager :: class )
-> setConstructorArgs ([
$this -> coordinator ,
$this -> container ,
$this -> logger ,
2024-12-16 15:20:50 -05:00
$this -> time ,
$this -> secureRandom ,
2025-01-08 15:08:15 -05:00
$this -> userManager ,
$this -> serverFactory ,
2022-06-23 16:17:53 -04:00
])
2025-05-12 11:39:58 -04:00
-> onlyMethods ([
2022-06-23 16:17:53 -04:00
'getCalendarsForPrincipal'
2022-09-06 03:05:36 -04:00
])
-> getMock ();
2022-06-23 16:17:53 -04:00
$principalUri = 'principals/user/pierre' ;
$sender = 'linus@stardew-tent-living.com' ;
$recipient = 'pierre@general-store.com' ;
$replyTo = null ;
2024-09-07 18:28:50 -04:00
$calendar = $this -> createMock ( ITestCalendar :: class );
2025-05-12 14:43:35 -04:00
$calendarData = clone $this -> vCalendar3a ;
$calendarData -> add ( 'METHOD' , 'CANCEL' );
2022-06-23 16:17:53 -04:00
$this -> time -> expects ( self :: once ())
2022-09-05 12:09:49 -04:00
-> method ( 'getTime' )
2022-09-07 20:26:46 -04:00
-> willReturn ( 1628374233 );
2022-06-23 16:17:53 -04:00
$manager -> expects ( self :: once ())
-> method ( 'getCalendarsForPrincipal' )
-> with ( $principalUri )
-> willReturn ([ $calendar ]);
$calendar -> expects ( self :: once ())
-> method ( 'search' )
-> willReturn ([[ 'uri' => 'testname.ics' ]]);
$calendar -> expects ( self :: once ())
-> method ( 'handleIMipMessage' )
-> with ( 'testname.ics' , $calendarData -> serialize ());
2025-05-12 14:43:35 -04:00
// Act
2022-09-07 20:26:46 -04:00
$result = $manager -> handleIMipCancel ( $principalUri , $sender , $replyTo , $recipient , $calendarData -> serialize ());
2025-05-12 14:43:35 -04:00
// Assert
2022-09-07 20:26:46 -04:00
$this -> assertTrue ( $result );
2022-06-23 16:17:53 -04:00
}
2024-12-16 15:20:50 -05:00
2025-01-08 15:08:15 -05:00
private function getFreeBusyResponse () : string {
return <<< EOF
< ? xml version = " 1.0 " encoding = " utf-8 " ?>
< cal : schedule - response xmlns : d = " DAV: " xmlns : s = " http://sabredav.org/ns " xmlns : cal = " urn:ietf:params:xml:ns:caldav " xmlns : cs = " http://calendarserver.org/ns/ " xmlns : oc = " http://owncloud.org/ns " xmlns : nc = " http://nextcloud.org/ns " >
< cal : response >
< cal : recipient >
< d : href > mailto : admin @ imap . localhost </ d : href >
</ cal : recipient >
< cal : request - status > 2.0 ; Success </ cal : request - status >
< cal : calendar - data > BEGIN : VCALENDAR
VERSION : 2.0
PRODID :-// Sabre //Sabre VObject 4.5.6//EN
CALSCALE : GREGORIAN
METHOD : REPLY
BEGIN : VFREEBUSY
DTSTART : 20250116 T060000Z
DTEND : 20250117 T060000Z
DTSTAMP : 20250111 T125634Z
FREEBUSY : 20250116 T060000Z / 20250116 T230000Z
FREEBUSY ; FBTYPE = BUSY - UNAVAILABLE : 20250116 T230000Z / 20250117 T060000Z
ATTENDEE : mailto : admin @ imap . localhost
UID : 6099 eab3 - 9 bf1 - 4 c7a - 809e-4 d46957cc372
ORGANIZER ; CN = admin : mailto : admin @ imap . localhost
END : VFREEBUSY
END : VCALENDAR
</ cal : calendar - data >
</ cal : response >
< cal : response >
< cal : recipient >
< d : href > mailto : empty @ imap . localhost </ d : href >
</ cal : recipient >
< cal : request - status > 2.0 ; Success </ cal : request - status >
< cal : calendar - data > BEGIN : VCALENDAR
VERSION : 2.0
PRODID :-// Sabre //Sabre VObject 4.5.6//EN
CALSCALE : GREGORIAN
METHOD : REPLY
BEGIN : VFREEBUSY
DTSTART : 20250116 T060000Z
DTEND : 20250117 T060000Z
DTSTAMP : 20250111 T125634Z
ATTENDEE : mailto : empty @ imap . localhost
UID : 6099 eab3 - 9 bf1 - 4 c7a - 809e-4 d46957cc372
ORGANIZER ; CN = admin : mailto : admin @ imap . localhost
END : VFREEBUSY
END : VCALENDAR
</ cal : calendar - data >
</ cal : response >
< cal : response >
< cal : recipient >
< d : href > mailto : user @ imap . localhost </ d : href >
</ cal : recipient >
< cal : request - status > 2.0 ; Success </ cal : request - status >
< cal : calendar - data > BEGIN : VCALENDAR
VERSION : 2.0
PRODID :-// Sabre //Sabre VObject 4.5.6//EN
CALSCALE : GREGORIAN
METHOD : REPLY
BEGIN : VFREEBUSY
DTSTART : 20250116 T060000Z
DTEND : 20250117 T060000Z
DTSTAMP : 20250111 T125634Z
FREEBUSY : 20250116 T060000Z / 20250116 T230000Z
FREEBUSY ; FBTYPE = BUSY - UNAVAILABLE : 20250116 T230000Z / 20250117 T060000Z
ATTENDEE : mailto : user @ imap . localhost
UID : 6099 eab3 - 9 bf1 - 4 c7a - 809e-4 d46957cc372
ORGANIZER ; CN = admin : mailto : admin @ imap . localhost
END : VFREEBUSY
END : VCALENDAR
</ cal : calendar - data >
</ cal : response >
< cal : response >
< cal : recipient >
< d : href > mailto : nouser @ domain . tld </ d : href >
</ cal : recipient >
< cal : request - status > 3.7 ; Could not find principal </ cal : request - status >
</ cal : response >
</ cal : schedule - response >
EOF ;
}
public function testCheckAvailability () : void {
$organizer = $this -> createMock ( IUser :: class );
$organizer -> expects ( self :: once ())
-> method ( 'getUID' )
-> willReturn ( 'admin' );
$organizer -> expects ( self :: once ())
-> method ( 'getEMailAddress' )
-> willReturn ( 'admin@imap.localhost' );
$user1 = $this -> createMock ( IUser :: class );
$user2 = $this -> createMock ( IUser :: class );
$this -> userManager -> expects ( self :: exactly ( 3 ))
-> method ( 'getByEmail' )
-> willReturnMap ([
[ 'user@imap.localhost' , [ $user1 ]],
[ 'empty@imap.localhost' , [ $user2 ]],
[ 'nouser@domain.tld' , []],
]);
$authPlugin = $this -> createMock ( CustomPrincipalPlugin :: class );
$authPlugin -> expects ( self :: once ())
-> method ( 'setCurrentPrincipal' )
-> with ( 'principals/users/admin' );
2025-06-12 12:31:58 -04:00
$server = $this -> createMock ( Server :: class );
2025-01-08 15:08:15 -05:00
$server -> expects ( self :: once ())
-> method ( 'getPlugin' )
-> with ( 'auth' )
-> willReturn ( $authPlugin );
$server -> expects ( self :: once ())
-> method ( 'invokeMethod' )
-> willReturnCallback ( function (
RequestInterface $request ,
ResponseInterface $response ,
bool $sendResponse ,
2025-06-12 12:31:58 -04:00
) : void {
2025-01-08 15:08:15 -05:00
$requestBody = file_get_contents ( __DIR__ . '/../../data/ics/free-busy-request.ics' );
$this -> assertEquals ( 'POST' , $request -> getMethod ());
$this -> assertEquals ( 'calendars/admin/outbox' , $request -> getPath ());
$this -> assertEquals ( 'text/calendar' , $request -> getHeader ( 'Content-Type' ));
$this -> assertEquals ( '0' , $request -> getHeader ( 'Depth' ));
$this -> assertEquals ( $requestBody , $request -> getBodyAsString ());
$this -> assertFalse ( $sendResponse );
$response -> setStatus ( 200 );
$response -> setBody ( $this -> getFreeBusyResponse ());
});
$this -> serverFactory -> expects ( self :: once ())
-> method ( 'createAttendeeAvailabilityServer' )
-> willReturn ( $server );
$start = new DateTimeImmutable ( '2025-01-16T06:00:00Z' );
$end = new DateTimeImmutable ( '2025-01-17T06:00:00Z' );
$actual = $this -> manager -> checkAvailability ( $start , $end , $organizer , [
'user@imap.localhost' ,
'empty@imap.localhost' ,
'nouser@domain.tld' ,
]);
$expected = [
new AvailabilityResult ( 'admin@imap.localhost' , false ),
new AvailabilityResult ( 'empty@imap.localhost' , true ),
new AvailabilityResult ( 'user@imap.localhost' , false ),
];
$this -> assertEquals ( $expected , $actual );
}
public function testCheckAvailabilityWithMailtoPrefix () : void {
$organizer = $this -> createMock ( IUser :: class );
$organizer -> expects ( self :: once ())
-> method ( 'getUID' )
-> willReturn ( 'admin' );
$organizer -> expects ( self :: once ())
-> method ( 'getEMailAddress' )
-> willReturn ( 'admin@imap.localhost' );
$user1 = $this -> createMock ( IUser :: class );
$user2 = $this -> createMock ( IUser :: class );
$this -> userManager -> expects ( self :: exactly ( 3 ))
-> method ( 'getByEmail' )
-> willReturnMap ([
[ 'user@imap.localhost' , [ $user1 ]],
[ 'empty@imap.localhost' , [ $user2 ]],
[ 'nouser@domain.tld' , []],
]);
$authPlugin = $this -> createMock ( CustomPrincipalPlugin :: class );
$authPlugin -> expects ( self :: once ())
-> method ( 'setCurrentPrincipal' )
-> with ( 'principals/users/admin' );
2025-06-12 12:31:58 -04:00
$server = $this -> createMock ( Server :: class );
2025-01-08 15:08:15 -05:00
$server -> expects ( self :: once ())
-> method ( 'getPlugin' )
-> with ( 'auth' )
-> willReturn ( $authPlugin );
$server -> expects ( self :: once ())
-> method ( 'invokeMethod' )
-> willReturnCallback ( function (
RequestInterface $request ,
ResponseInterface $response ,
bool $sendResponse ,
2025-06-12 12:31:58 -04:00
) : void {
2025-01-08 15:08:15 -05:00
$requestBody = file_get_contents ( __DIR__ . '/../../data/ics/free-busy-request.ics' );
$this -> assertEquals ( 'POST' , $request -> getMethod ());
$this -> assertEquals ( 'calendars/admin/outbox' , $request -> getPath ());
$this -> assertEquals ( 'text/calendar' , $request -> getHeader ( 'Content-Type' ));
$this -> assertEquals ( '0' , $request -> getHeader ( 'Depth' ));
$this -> assertEquals ( $requestBody , $request -> getBodyAsString ());
$this -> assertFalse ( $sendResponse );
$response -> setStatus ( 200 );
$response -> setBody ( $this -> getFreeBusyResponse ());
});
$this -> serverFactory -> expects ( self :: once ())
-> method ( 'createAttendeeAvailabilityServer' )
-> willReturn ( $server );
$start = new DateTimeImmutable ( '2025-01-16T06:00:00Z' );
$end = new DateTimeImmutable ( '2025-01-17T06:00:00Z' );
$actual = $this -> manager -> checkAvailability ( $start , $end , $organizer , [
'mailto:user@imap.localhost' ,
'mailto:empty@imap.localhost' ,
'mailto:nouser@domain.tld' ,
]);
$expected = [
new AvailabilityResult ( 'admin@imap.localhost' , false ),
new AvailabilityResult ( 'empty@imap.localhost' , true ),
new AvailabilityResult ( 'user@imap.localhost' , false ),
];
$this -> assertEquals ( $expected , $actual );
}
2017-10-31 12:06:01 -04:00
}