diff options
author | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-02 13:48:16 +0200 |
---|---|---|
committer | Bernhard Posselt <nukeawhale@gmail.com> | 2013-04-02 13:48:16 +0200 |
commit | 76fd21bccd1b87916f149a257e07d02f5e40335a (patch) | |
tree | 250f294b2644a22be4fd2da2f75b5addcbb0282c | |
parent | 2a0804a8cfc14f4f4afe17694783517af195ca50 (diff) |
added simple twitter fetcher implementation
-rw-r--r-- | controller/settingscontroller.php | 66 | ||||
-rw-r--r-- | controller/usersettingscontroller.php | 3 | ||||
-rw-r--r-- | dependencyinjection/dicontainer.php | 7 | ||||
-rw-r--r-- | tests/controller/SettingsControllerTest.php | 123 | ||||
-rw-r--r-- | tests/controller/TwitterFetcherTest.php | 77 | ||||
-rw-r--r-- | tests/controller/UserSettingsControllerTest.php | 9 | ||||
-rw-r--r-- | utility/feedfetcher.php | 2 | ||||
-rw-r--r-- | utility/twitterfetcher.php | 56 |
8 files changed, 331 insertions, 12 deletions
diff --git a/controller/settingscontroller.php b/controller/settingscontroller.php new file mode 100644 index 000000000..2c307b801 --- /dev/null +++ b/controller/settingscontroller.php @@ -0,0 +1,66 @@ +<?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\Controller; + +use \OCA\AppFramework\Controller\Controller; +use \OCA\AppFramework\Core\API; +use \OCA\AppFramework\Http\Request; + + +class SettingsController extends Controller { + + + public function __construct(API $api, Request $request){ + parent::__construct($api, $request); + } + + + /** + * @CSRFExemption + */ + public function index(){ + $purgeLimit = (int) $this->api->getAppValue('purgeLimit'); + + $params = array( + 'purgeLimit' => $purgeLimit + ); + return $this->render('admin', $params); + } + + + /** + * @Ajax + */ + public function setAutoPurgeLimit(){ + $purgeLimit = (int) $this->params('purgeLimit'); + $this->api->setAppValue('purgeLimit', $purgeLimit); + + return $this->renderJSON(); + } + + + +}
\ No newline at end of file diff --git a/controller/usersettingscontroller.php b/controller/usersettingscontroller.php index db87276f8..88f3d07f4 100644 --- a/controller/usersettingscontroller.php +++ b/controller/usersettingscontroller.php @@ -44,7 +44,6 @@ class UserSettingsController extends Controller { * @Ajax */ public function read(){ - $userId = $this->api->getUserId(); $showAll = $this->api->getUserValue('showAll'); $params = array( 'showAll' => $showAll === '1' @@ -60,7 +59,6 @@ class UserSettingsController extends Controller { * @Ajax */ public function show(){ - $userId = $this->api->getUserId(); $this->api->setUserValue('showAll', true); return $this->renderJSON(); @@ -73,7 +71,6 @@ class UserSettingsController extends Controller { * @Ajax */ public function hide(){ - $userId = $this->api->getUserId(); $this->api->setUserValue('showAll', false); return $this->renderJSON(); diff --git a/dependencyinjection/dicontainer.php b/dependencyinjection/dicontainer.php index 5e65ada7a..4c6dbae06 100644 --- a/dependencyinjection/dicontainer.php +++ b/dependencyinjection/dicontainer.php @@ -45,6 +45,8 @@ use OCA\News\Db\StatusFlag; use OCA\News\Utility\Fetcher; use OCA\News\Utility\FeedFetcher; +use OCA\News\Utility\TwitterFetcher; + require_once __DIR__ . '/../3rdparty/SimplePie/autoloader.php'; @@ -131,6 +133,7 @@ class DIContainer extends BaseContainer { // register fetchers in order // the most generic fetcher should be the last one + $fetcher->registerFetcher($c['TwitterFetcher']); $fetcher->registerFetcher($c['FeedFetcher']); return $fetcher; @@ -140,6 +143,10 @@ class DIContainer extends BaseContainer { return new FeedFetcher($c['API']); }); + $this['TwitterFetcher'] = $this->share(function($c){ + return new TwitterFetcher($c['FeedFetcher']); + }); + $this['StatusFlag'] = $this->share(function($c){ return new StatusFlag(); }); diff --git a/tests/controller/SettingsControllerTest.php b/tests/controller/SettingsControllerTest.php new file mode 100644 index 000000000..f2d9ca712 --- /dev/null +++ b/tests/controller/SettingsControllerTest.php @@ -0,0 +1,123 @@ +<?php + +/** +* ownCloud - News +* +* @author Alessandro Copyright +* @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\Controller; + +use \OCA\AppFramework\Http\Request; +use \OCA\AppFramework\Http\JSONResponse; +use \OCA\AppFramework\Http\TemplateResponse; +use \OCA\AppFramework\Utility\ControllerTestUtility; + + +require_once(__DIR__ . "/../classloader.php"); + + +class SettingsControllerTest extends ControllerTestUtility { + + private $api; + private $request; + private $controller; + + + /** + * Gets run before each test + */ + public function setUp(){ + $this->api = $this->getAPIMock(); + $this->request = new Request(); + $this->controller = new SettingsController($this->api, $this->request); + $this->user = 'becka'; + } + + + private function getPostController($postValue, $url=array()){ + $post = array( + 'post' => $postValue, + 'urlParams' => $url + ); + + $request = $this->getRequest($post); + return new SettingsController($this->api, $request); + } + + + public function testIndexAnnotations(){ + $methodName = 'index'; + $annotations = array('CSRFExemption'); + $this->assertAnnotations($this->controller, $methodName, $annotations); + } + + + public function testSetAutoPurgeLimitAnnotations(){ + $methodName = 'setAutoPurgeLimit'; + $annotations = array('Ajax'); + $this->assertAnnotations($this->controller, $methodName, $annotations); + } + + + public function testIndexReturnsAdminTemplate(){ + $this->api->expects($this->once()) + ->method('getAppValue') + ->with($this->equalTo('purgeLimit')) + ->will($this->returnValue('30')); + + $response = $this->controller->index(); + $params = $response->getParams(); + + $this->assertEquals('admin', $response->getTemplateName()); + $this->assertEquals(30, $params['purgeLimit']); + } + + + public function testIndexSetsLimitToNullIfValueIsNotSet(){ + $this->api->expects($this->once()) + ->method('getAppValue') + ->with($this->equalTo('purgeLimit')) + ->will($this->returnValue(null)); + + $response = $this->controller->index(); + $params = $response->getParams(); + + $this->assertEquals(0, $params['purgeLimit']); + } + + + public function testSetAutoPurgeLimit(){ + $post = array( + 'purgeLimit' => '10' + ); + $this->controller = $this->getPostController($post); + + $this->api->expects($this->once()) + ->method('setAppValue') + ->with($this->equalTo('purgeLimit'), + $this->equalTo(10)); + + $response = $this->controller->setAutoPurgeLimit(); + + $this->assertTrue($response instanceof JSONResponse); + } + +} diff --git a/tests/controller/TwitterFetcherTest.php b/tests/controller/TwitterFetcherTest.php new file mode 100644 index 000000000..00d5aa1ab --- /dev/null +++ b/tests/controller/TwitterFetcherTest.php @@ -0,0 +1,77 @@ +<?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 TwitterFetcherTest extends \OCA\AppFramework\Utility\TestUtility { + + private $fetcher; + private $twitter; + + protected function setUp(){ + $this->fetcher = $this->getMockBuilder('\OCA\News\Utility\FeedFetcher') + ->disableOriginalConstructor() + ->getMock(); + $this->twitter = new TwitterFetcher($this->fetcher); + } + + + public function testCanHandle(){ + $urls = array( + 'https://twitter.com/GeorgeTakei', + 'https://www.twitter.com/GeorgeTakei', + 'http://twitter.com/GeorgeTakei', + 'http://www.twitter.com/GeorgeTakei', + 'www.twitter.com/GeorgeTakei', + 'twitter.com/GeorgeTakei' + ); + foreach($urls as $url){ + $this->assertTrue($this->twitter->canHandle($url)); + } + } + + + public function testCanHandleDoesNotUseApiUrls(){ + $url = 'https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=GeorgeTakei'; + $this->assertFalse($this->twitter->canHandle($url)); + } + + + public function testFetch(){ + $inUrl = 'https://www.twitter.com/GeorgeTakei'; + $outUrl = 'https://api.twitter.com/1/statuses/user_timeline.rss?screen_name=GeorgeTakei'; + $out = 'hi'; + $this->fetcher->expects($this->once()) + ->method('fetch') + ->with($this->equalTo($outUrl)) + ->will($this->returnValue($out)); + + $return = $this->twitter->fetch($inUrl); + $this->assertEquals($out, $return); + } +}
\ No newline at end of file diff --git a/tests/controller/UserSettingsControllerTest.php b/tests/controller/UserSettingsControllerTest.php index 6754d0c7a..971912c6b 100644 --- a/tests/controller/UserSettingsControllerTest.php +++ b/tests/controller/UserSettingsControllerTest.php @@ -76,9 +76,6 @@ class UserSettingsControllerTest extends ControllerTestUtility { public function testShow(){ $this->api->expects($this->once()) - ->method('getUserId') - ->will($this->returnValue($this->user)); - $this->api->expects($this->once()) ->method('setUserValue') ->with($this->equalTo('showAll'), $this->equalTo(true)); @@ -88,9 +85,6 @@ class UserSettingsControllerTest extends ControllerTestUtility { public function testHide(){ $this->api->expects($this->once()) - ->method('getUserId') - ->will($this->returnValue($this->user)); - $this->api->expects($this->once()) ->method('setUserValue') ->with($this->equalTo('showAll'), $this->equalTo(false)); @@ -103,9 +97,6 @@ class UserSettingsControllerTest extends ControllerTestUtility { 'showAll' => true ); $this->api->expects($this->once()) - ->method('getUserId') - ->will($this->returnValue($this->user)); - $this->api->expects($this->once()) ->method('getUserValue') ->with($this->equalTo('showAll')) ->will($this->returnValue('1')); diff --git a/utility/feedfetcher.php b/utility/feedfetcher.php index 54c416d71..284c40ba7 100644 --- a/utility/feedfetcher.php +++ b/utility/feedfetcher.php @@ -55,6 +55,7 @@ class FeedFetcher implements IFeedFetcher { * @return array an array containing the new feed and its items */ public function fetch($url) { + // TODO: write unittests! $simplePie = new \SimplePie_Core(); $simplePie->set_feed_url( $url ); $simplePie->enable_cache( false ); @@ -158,6 +159,7 @@ class FeedFetcher implements IFeedFetcher { $page = $this->api->getUrlContent($absoluteUrl); if ( FALSE !== $page ) { + // FIXME: dont use regex to get xml, use xpath! preg_match ( '/<[^>]*link[^>]*(rel=["\']icon["\']|rel=["\']shortcut icon["\']) .*href=["\']([^>]*)["\'].*>/iU', $page, $match ); if (1<sizeof($match)) { // the specified uri might be an url, an absolute or a relative path diff --git a/utility/twitterfetcher.php b/utility/twitterfetcher.php new file mode 100644 index 000000000..0d1d6738b --- /dev/null +++ b/utility/twitterfetcher.php @@ -0,0 +1,56 @@ +<?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 TwitterFetcher implements IFeedFetcher { + + + private $fetcher; + private $regex; + + // FIXME: implement twitter api to be future proof + public function __construct(FeedFetcher $fetcher){ + $this->fetcher = $fetcher; + $this->regex = '/^(?:https?:\/\/)?(?:www\.)?' . + 'twitter.com\/([\pL\pN\pM]+)$/u'; + } + + + public function canHandle($url){ + return preg_match($this->regex, $url) == true; + } + + + public function fetch($url){ + preg_match($this->regex, $url, $match); + $rssUrl = 'https://api.twitter.com/1/statuses/user_timeline.' . + 'rss?screen_name=' . $match[1]; + return $this->fetcher->fetch($rssUrl); + } + + +}
\ No newline at end of file |