diff options
-rw-r--r-- | bl/feedbl.php | 8 | ||||
-rw-r--r-- | dependencyinjection/dicontainer.php | 15 | ||||
-rw-r--r-- | tests/bl/FeedBlTest.php | 4 | ||||
-rw-r--r-- | tests/utility/FeedFetcherTest.php | 47 | ||||
-rw-r--r-- | tests/utility/FetcherTest.php | 107 | ||||
-rw-r--r-- | utility/feedfetcher.php | 10 | ||||
-rw-r--r-- | utility/fetcher.php | 52 | ||||
-rw-r--r-- | utility/ifeedfetcher.php | 31 |
8 files changed, 264 insertions, 10 deletions
diff --git a/bl/feedbl.php b/bl/feedbl.php index 7b9f98205..0bd0e9e0d 100644 --- a/bl/feedbl.php +++ b/bl/feedbl.php @@ -31,7 +31,7 @@ use \OCA\AppFramework\Core\API; use \OCA\News\Db\Feed; use \OCA\News\Db\FeedMapper; use \OCA\News\Db\ItemMapper; -use \OCA\News\Utility\FeedFetcher; +use \OCA\News\Utility\Fetcher; use \OCA\News\Utility\FetcherException; class FeedBl extends Bl { @@ -40,10 +40,8 @@ class FeedBl extends Bl { private $itemMapper; private $api; - public function __construct(FeedMapper $feedMapper, - FeedFetcher $feedFetcher, - ItemMapper $itemMapper, - API $api){ + public function __construct(FeedMapper $feedMapper, Fetcher $feedFetcher, + ItemMapper $itemMapper, API $api){ parent::__construct($feedMapper); $this->feedFetcher = $feedFetcher; $this->itemMapper = $itemMapper; diff --git a/dependencyinjection/dicontainer.php b/dependencyinjection/dicontainer.php index 4350ac276..6cedc42c5 100644 --- a/dependencyinjection/dicontainer.php +++ b/dependencyinjection/dicontainer.php @@ -43,6 +43,7 @@ use OCA\News\Db\FeedMapper; use OCA\News\Db\ItemMapper; use OCA\News\Db\StatusFlag; +use OCA\News\Utility\Fetcher; use OCA\News\Utility\FeedFetcher; require_once __DIR__ . '/../3rdparty/SimplePie/autoloader.php'; @@ -90,14 +91,14 @@ class DIContainer extends BaseContainer { }); /** - * Business + * Business Layer */ $this['FolderBl'] = $this->share(function($c){ return new FolderBl($c['FolderMapper']); }); $this['FeedBl'] = $this->share(function($c){ - return new FeedBl($c['FeedMapper'], $c['FeedFetcher'], + return new FeedBl($c['FeedMapper'], $c['Fetcher'], $c['ItemMapper'], $c['API']); }); @@ -125,6 +126,16 @@ class DIContainer extends BaseContainer { /** * Utility */ + $this['Fetcher'] = $this->share(function(){ + $fetcher = new Fetcher(); + + // register fetchers in order + // the most generic fetcher should be the last one + $fetcher->registerFetcher($c['FeedFetcher']); + + return $fetcher; + }); + $this['FeedFetcher'] = $this->share(function($c){ return new FeedFetcher($c['API']); }); diff --git a/tests/bl/FeedBlTest.php b/tests/bl/FeedBlTest.php index 9eee7eef1..9a9bd2002 100644 --- a/tests/bl/FeedBlTest.php +++ b/tests/bl/FeedBlTest.php @@ -36,7 +36,7 @@ use \OCA\AppFramework\Db\DoesNotExistException; use \OCA\News\Db\Feed; use \OCA\News\Db\Item; -use \OCA\News\Utility\FeedFetcher; +use \OCA\News\Utility\Fetcher; use \OCA\News\Utility\FetcherException; class FeedBlTest extends \OCA\AppFramework\Utility\TestUtility { @@ -54,7 +54,7 @@ class FeedBlTest extends \OCA\AppFramework\Utility\TestUtility { $this->mapper = $this->getMockBuilder('\OCA\News\Db\FeedMapper') ->disableOriginalConstructor() ->getMock(); - $this->fetcher = $this->getMockBuilder('\OCA\News\Utility\FeedFetcher') + $this->fetcher = $this->getMockBuilder('\OCA\News\Utility\Fetcher') ->disableOriginalConstructor() ->getMock(); $this->itemMapper = $this->getMockBuilder('\OCA\News\Db\ItemMapper') diff --git a/tests/utility/FeedFetcherTest.php b/tests/utility/FeedFetcherTest.php new file mode 100644 index 000000000..0a1e2ed32 --- /dev/null +++ b/tests/utility/FeedFetcherTest.php @@ -0,0 +1,47 @@ +<?php + +/** +* ownCloud - News +* +* @author Alessandro Cosentino +* @author Bernhard Posselt +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +namespace OCA\News\Utility; + +require_once(__DIR__ . "/../classloader.php"); + + +class FeedFetcherTest extends \OCA\AppFramework\Utility\TestUtility { + + private $fetcher; + + protected function setUp(){ + $this->fetcher = new FeedFetcher($this->getAPIMock()); + } + + + public function testCanHandle(){ + $url = 'google.de'; + + $this->assertTrue($this->fetcher->canHandle($url)); + } + + // TODO: write tests for the remaining methods +}
\ No newline at end of file diff --git a/tests/utility/FetcherTest.php b/tests/utility/FetcherTest.php new file mode 100644 index 000000000..0da3b9265 --- /dev/null +++ b/tests/utility/FetcherTest.php @@ -0,0 +1,107 @@ +<?php + +/** +* ownCloud - News +* +* @author Alessandro Cosentino +* @author Bernhard Posselt +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +namespace OCA\News\Utility; + +require_once(__DIR__ . "/../classloader.php"); + + +class FetcherTest extends \OCA\AppFramework\Utility\TestUtility { + + private $fetcher; + + protected function setUp(){ + $this->fetcher = new Fetcher(); + } + + + public function testFetch(){ + $url = 'hi'; + $mockFetcher = $this->getMockBuilder('\OCA\News\Utility\IFeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $mockFetcher->expects($this->once()) + ->method('canHandle') + ->with($this->equalTo($url)) + ->will($this->returnValue(true)); + $this->fetcher->registerFetcher($mockFetcher); + + $this->fetcher->fetch($url); + } + + + public function testMultipleFetchers(){ + $url = 'hi'; + $mockFetcher = $this->getMockBuilder('\OCA\News\Utility\IFeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $mockFetcher->expects($this->once()) + ->method('canHandle') + ->with($this->equalTo($url)) + ->will($this->returnValue(false)); + $mockFetcher2 = $this->getMockBuilder('\OCA\News\Utility\IFeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $mockFetcher2->expects($this->once()) + ->method('canHandle') + ->with($this->equalTo($url)) + ->will($this->returnValue(true)); + + $this->fetcher->registerFetcher($mockFetcher); + $this->fetcher->registerFetcher($mockFetcher2); + + $this->fetcher->fetch($url); + } + + public function testMultipleFetchersOnlyOneShouldHandle(){ + $url = 'hi'; + $return = 'zeas'; + $mockFetcher = $this->getMockBuilder('\OCA\News\Utility\IFeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $mockFetcher->expects($this->once()) + ->method('canHandle') + ->with($this->equalTo($url)) + ->will($this->returnValue(true)); + $mockFetcher->expects($this->once()) + ->method('fetch') + ->with($this->equalTo($url)) + ->will($this->returnValue($return)); + $mockFetcher2 = $this->getMockBuilder('\OCA\News\Utility\IFeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $mockFetcher2->expects($this->never()) + ->method('canHandle'); + + $this->fetcher->registerFetcher($mockFetcher); + $this->fetcher->registerFetcher($mockFetcher2); + + $result = $this->fetcher->fetch($url); + + $this->assertEquals($return, $result); + } + + +}
\ No newline at end of file diff --git a/utility/feedfetcher.php b/utility/feedfetcher.php index 9bfe1ed31..bf8cbd35b 100644 --- a/utility/feedfetcher.php +++ b/utility/feedfetcher.php @@ -31,7 +31,7 @@ use \OCA\News\Db\Item; use \OCA\News\Db\Feed; -class FeedFetcher { +class FeedFetcher implements IFeedFetcher { private $api; @@ -40,6 +40,14 @@ class FeedFetcher { } + public function canHandle($url){ + + // This fetcher handles all the remaining urls therefore + // return true + return true; + } + + /** * Fetch a feed from remote * @param string url remote url of the feed diff --git a/utility/fetcher.php b/utility/fetcher.php new file mode 100644 index 000000000..c834de5e4 --- /dev/null +++ b/utility/fetcher.php @@ -0,0 +1,52 @@ +<?php + +/** +* ownCloud - News +* +* @author Alessandro Cosentino +* @author Bernhard Posselt +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +namespace OCA\News\Utility; + + +class Fetcher { + + private $fetchers; + + public function __construct(){ + $this->fetchers = array(); + } + + + public function registerFetcher(IFeedFetcher $fetcher){ + array_push($this->fetchers, $fetcher); + } + + + public function fetch($url){ + foreach($this->fetchers as $fetcher){ + if($fetcher->canHandle($url)){ + return $fetcher->fetch($url); + } + } + } + + +}
\ No newline at end of file diff --git a/utility/ifeedfetcher.php b/utility/ifeedfetcher.php new file mode 100644 index 000000000..0e3ed8732 --- /dev/null +++ b/utility/ifeedfetcher.php @@ -0,0 +1,31 @@ +<?php + +/** +* ownCloud - News +* +* @author Alessandro Cosentino +* @author Bernhard Posselt +* @copyright 2012 Alessandro Cosentino cosenal@gmail.com +* @copyright 2012 Bernhard Posselt nukeawhale@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library 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 library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +namespace OCA\News\Utility; + +interface IFeedFetcher { + function fetch($url); + function canHandle($url); +}
\ No newline at end of file |