parent
5d206eec69
commit
556b2a2b6f
@ -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 = []; |
||||
} |
||||
} |
||||
@ -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…
Reference in new issue