Browse Source

implement CalendarManager

Signed-off-by: Georg Ehrke <developer@georgehrke.com>
tags/v13.0.0beta2
Georg Ehrke 6 years ago
parent
commit
556b2a2b6f
No account linked to committer's email address

+ 140
- 0
lib/private/Calendar/Manager.php View File

@@ -0,0 +1,140 @@
<?php
/**
* @copyright 2017, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @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 OC\Calendar;

use OCP\Calendar\ICalendar;

class Manager implements \OCP\Calendar\IManager {

/**
* @var ICalendar[] holds all registered calendars
*/
private $calendars=[];

/**
* @var \Closure[] to call to load/register calendar providers
*/
private $calendarLoaders=[];

/**
* This function is used to search and find objects within the user's calendars.
* In case $pattern is empty all events/journals/todos will be returned.
*
* @param string $pattern which should match within the $searchProperties
* @param array $searchProperties defines the properties within the query pattern should match
* @param array $options - optional parameters:
* ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
* @param integer|null $limit - limit number of search results
* @param integer|null $offset - offset for paging of search results
* @return array an array of events/journals/todos which are arrays of arrays of key-value-pairs
* @since 13.0.0
*/
public function search($pattern, array $searchProperties=[], array $options=[], $limit=null, $offset=null) {
$this->loadCalendars();
$result = [];
foreach($this->calendars as $calendar) {
$r = $calendar->search($pattern, $searchProperties, $options, $limit, $offset);
foreach($r as $o) {
$o['calendar-key'] = $calendar->getKey();
$result[] = $o;
}
}

return $result;
}

/**
* Check if calendars are available
*
* @return bool true if enabled, false if not
* @since 13.0.0
*/
public function isEnabled() {
return !empty($this->calendars) || !empty($this->calendarLoaders);
}

/**
* Registers a calendar
*
* @param ICalendar $calendar
* @return void
* @since 13.0.0
*/
public function registerCalendar(ICalendar $calendar) {
$this->calendars[$calendar->getKey()] = $calendar;
}

/**
* Unregisters a calendar
*
* @param ICalendar $calendar
* @return void
* @since 13.0.0
*/
public function unregisterCalendar(ICalendar $calendar) {
unset($this->calendars[$calendar->getKey()]);
}

/**
* In order to improve lazy loading a closure can be registered which will be called in case
* calendars are actually requested
*
* @param \Closure $callable
* @return void
* @since 13.0.0
*/
public function register(\Closure $callable) {
$this->calendarLoaders[] = $callable;
}

/**
* @return ICalendar[]
* @since 13.0.0
*/
public function getCalendars() {
$this->loadCalendars();

return array_values($this->calendars);
}

/**
* removes all registered calendar instances
* @return void
* @since 13.0.0
*/
public function clear() {
$this->calendars = [];
$this->calendarLoaders = [];
}

/**
* loads all calendars
*/
private function loadCalendars() {
foreach($this->calendarLoaders as $callable) {
$callable($this);
}
$this->calendarLoaders = [];
}
}

+ 10
- 0
lib/private/Server.php View File

@@ -153,6 +153,9 @@ class Server extends ServerContainer implements IServerContainer {
return $c;
});

$this->registerAlias(\OCP\Calendar\IManager::class, \OC\Calendar\Manager::class);
$this->registerAlias('CalendarManager', \OC\Calendar\Manager::class);

$this->registerAlias(\OCP\Contacts\IManager::class, \OC\ContactsManager::class);
$this->registerAlias('ContactsManager', \OCP\Contacts\IManager::class);

@@ -1094,6 +1097,13 @@ class Server extends ServerContainer implements IServerContainer {
});
}

/**
* @return \OCP\Calendar\IManager
*/
public function getCalendarManager() {
return $this->query('CalendarManager');
}

/**
* @return \OCP\Contacts\IManager
*/

+ 9
- 0
lib/public/IServerContainer.php View File

@@ -57,6 +57,15 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
*/
interface IServerContainer extends IContainer {

/**
* The calendar manager will act as a broker between consumers for calendar information and
* providers which actual deliver the calendar information.
*
* @return \OCP\Calendar\IManager
* @since 13.0.0
*/
public function getCalendarManager();

/**
* The contacts manager will act as a broker between consumers for contacts information and
* providers which actual deliver the contact information.

+ 214
- 0
tests/lib/Calendar/ManagerTest.php View File

@@ -0,0 +1,214 @@
<?php
/**
* @copyright 2017, Georg Ehrke <oc.list@georgehrke.com>
*
* @author Georg Ehrke <oc.list@georgehrke.com>
*
* @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 Test\Calendar;

use \OC\Calendar\Manager;
use OCP\Calendar\ICalendar;
use \Test\TestCase;

class ManagerTest extends TestCase {

/** @var Manager */
private $manager;

protected function setUp() {
parent::setUp();

$this->manager = new Manager();
}

/**
* @dataProvider searchProvider
*/
public function testSearch($search1, $search2, $expected) {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('simple:1'));
$calendar1->expects($this->once())
->method('search')
->with('', [], [], null, null)
->will($this->returnValue($search1));

/** @var ICalendar | PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('simple:2'));
$calendar2->expects($this->once())
->method('search')
->with('', [], [], null, null)
->will($this->returnValue($search2));

$this->manager->registerCalendar($calendar1);
$this->manager->registerCalendar($calendar2);

$result = $this->manager->search('');
$this->assertEquals($expected, $result);
}

/**
* @dataProvider searchProvider
*/
public function testSearchOptions($search1, $search2, $expected) {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('simple:1'));
$calendar1->expects($this->once())
->method('search')
->with('searchTerm', ['SUMMARY', 'DESCRIPTION'],
['timerange' => ['start' => null, 'end' => null]], 5, 20)
->will($this->returnValue($search1));

/** @var ICalendar | PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('simple:2'));
$calendar2->expects($this->once())
->method('search')
->with('searchTerm', ['SUMMARY', 'DESCRIPTION'],
['timerange' => ['start' => null, 'end' => null]], 5, 20)
->will($this->returnValue($search2));

$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);
}

public function searchProvider() {
$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() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('key1'));

/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('key2'));

$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() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar1 */
$calendar1 = $this->createMock(ICalendar::class);
$calendar1->method('getKey')->will($this->returnValue('key1'));

/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar2 */
$calendar2 = $this->createMock(ICalendar::class);
$calendar2->method('getKey')->will($this->returnValue('key2'));

$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() {
$isEnabled = $this->manager->isEnabled();
$this->assertFalse($isEnabled);
}

public function testIfEnabledIfSo() {
/** @var ICalendar | \PHPUnit_Framework_MockObject_MockObject $calendar */
$calendar = $this->createMock(ICalendar::class);
$this->manager->registerCalendar($calendar);

$isEnabled = $this->manager->isEnabled();
$this->assertTrue($isEnabled);
}

}

Loading…
Cancel
Save