diff --git a/src/FeedBundle/Extractor/HackerNews.php b/src/FeedBundle/Extractor/HackerNews.php new file mode 100644 index 00000000..913509ba --- /dev/null +++ b/src/FeedBundle/Extractor/HackerNews.php @@ -0,0 +1,74 @@ +guzzle = $guzzle; + } + + /** + * {@inheritdoc} + */ + public function match($url) + { + $host = parse_url($url, PHP_URL_HOST); + $query = parse_url($url, PHP_URL_QUERY); + + if (false === $host || false === $query) { + return false; + } + + if (0 !== strpos($host, 'news.ycombinator.com')) { + return false; + } + + // match HN id + preg_match('/id\=([0-9]+)/i', $query, $matches); + + if (!isset($matches[1])) { + return false; + } + + try { + $data = $this->guzzle + ->get('https://hacker-news.firebaseio.com/v0/item/'.$matches[1].'.json') + ->send() + ->json(); + } catch (RequestException $e) { + return false; + } + + if (in_array($data['type'], array('comment', 'pollopt')) + || trim($data['text']) === '') { + return false; + } + + $this->text = $data['text']; + + return true; + } + + /** + * {@inheritdoc} + */ + public function getContent() + { + if (!$this->text) { + return ''; + } + + return '

'.$this->text.'

'; + } +} diff --git a/src/FeedBundle/Resources/config/services.yml b/src/FeedBundle/Resources/config/services.yml index bb4829f0..dae349bf 100644 --- a/src/FeedBundle/Resources/config/services.yml +++ b/src/FeedBundle/Resources/config/services.yml @@ -184,6 +184,13 @@ services: tags: - { name: feed.extractor, alias: spotify } + feed.extractor.hackernews: + class: Api43\FeedBundle\Extractor\HackerNews + arguments: + - @guzzle.client + tags: + - { name: feed.extractor, alias: hackernews } + # improver feed.improver.chain: class: Api43\FeedBundle\Improver\ImproverChain diff --git a/src/FeedBundle/Tests/Extractor/CamplusTest.php b/src/FeedBundle/Tests/Extractor/CamplusTest.php index 2b06e985..7759c6a9 100644 --- a/src/FeedBundle/Tests/Extractor/CamplusTest.php +++ b/src/FeedBundle/Tests/Extractor/CamplusTest.php @@ -29,22 +29,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $camplus = new Camplus($guzzle); $this->assertEquals($expected, $camplus->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/DailymotionTest.php b/src/FeedBundle/Tests/Extractor/DailymotionTest.php index 972e78b6..2d0c6541 100644 --- a/src/FeedBundle/Tests/Extractor/DailymotionTest.php +++ b/src/FeedBundle/Tests/Extractor/DailymotionTest.php @@ -27,22 +27,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $dailymotion = new Dailymotion($guzzle); $this->assertEquals($expected, $dailymotion->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/DeviantartTest.php b/src/FeedBundle/Tests/Extractor/DeviantartTest.php index 78838d3f..602a8d8b 100644 --- a/src/FeedBundle/Tests/Extractor/DeviantartTest.php +++ b/src/FeedBundle/Tests/Extractor/DeviantartTest.php @@ -30,22 +30,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $deviantart = new Deviantart($guzzle); $this->assertEquals($expected, $deviantart->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/FlickrTest.php b/src/FeedBundle/Tests/Extractor/FlickrTest.php index 79cb66d5..962b9b01 100644 --- a/src/FeedBundle/Tests/Extractor/FlickrTest.php +++ b/src/FeedBundle/Tests/Extractor/FlickrTest.php @@ -33,26 +33,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - - $response->expects($this->any()) - ->method('getHeader') - ->will($this->returnValue('test')); - $flickr = new Flickr($guzzle, 'apikey'); $this->assertEquals($expected, $flickr->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/GfycatTest.php b/src/FeedBundle/Tests/Extractor/GfycatTest.php index 3de75c4e..48961a7c 100644 --- a/src/FeedBundle/Tests/Extractor/GfycatTest.php +++ b/src/FeedBundle/Tests/Extractor/GfycatTest.php @@ -28,22 +28,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $gfycat = new Gfycat($guzzle); $this->assertEquals($expected, $gfycat->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/GithubTest.php b/src/FeedBundle/Tests/Extractor/GithubTest.php index 12887fde..d37e520d 100644 --- a/src/FeedBundle/Tests/Extractor/GithubTest.php +++ b/src/FeedBundle/Tests/Extractor/GithubTest.php @@ -29,22 +29,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $github = new Github($guzzle); $this->assertEquals($expected, $github->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/HackerNewsTest.php b/src/FeedBundle/Tests/Extractor/HackerNewsTest.php new file mode 100644 index 00000000..ab020a4e --- /dev/null +++ b/src/FeedBundle/Tests/Extractor/HackerNewsTest.php @@ -0,0 +1,121 @@ + 'toto', 'type' => 'story')), + array('http://news.ycombinator.com/item?id=10074364', true, array('text' => 'toto', 'type' => 'job')), + // comment + array('http://news.ycombinator.com/item?id=10077812', false, array('text' => 'toto', 'type' => 'comment')), + // pollopt + array('http://news.ycombinator.com/item?id=160705', false, array('text' => 'toto', 'type' => 'pollopt')), + array('https://goog.co', false), + array('http://news.ycombinator.com/item?id=rtyui', false), + ); + } + + /** + * @dataProvider dataMatch + */ + public function testMatch($url, $expected, $valueReturned = null) + { + $guzzle = $this->getMockBuilder('Guzzle\Http\Client') + ->disableOriginalConstructor() + ->getMock(); + + $request = $this->getMockBuilder('Guzzle\Http\Message\Request') + ->disableOriginalConstructor() + ->getMock(); + + $response = $this->getMockBuilder('Guzzle\Http\Message\Response') + ->disableOriginalConstructor() + ->getMock(); + + $guzzle->expects($this->any()) + ->method('get') + ->will($this->returnValue($request)); + + $request->expects($this->any()) + ->method('send') + ->will($this->returnValue($response)); + + $response->expects($this->any()) + ->method('json') + ->will($this->returnValue($valueReturned)); + + $hn = new HackerNews($guzzle); + $this->assertEquals($expected, $hn->match($url)); + } + + public function testMatchGuzzleFail() + { + $guzzle = $this->getMockBuilder('Guzzle\Http\Client') + ->disableOriginalConstructor() + ->getMock(); + + $request = $this->getMockBuilder('Guzzle\Http\Message\Request') + ->disableOriginalConstructor() + ->getMock(); + + $response = $this->getMockBuilder('Guzzle\Http\Message\Response') + ->disableOriginalConstructor() + ->getMock(); + + $guzzle->expects($this->any()) + ->method('get') + ->will($this->returnValue($request)); + + $request->expects($this->any()) + ->method('send') + ->will($this->returnValue($response)); + + $response->expects($this->any()) + ->method('json') + ->will($this->throwException(new RequestException())); + + $hn = new HackerNews($guzzle); + $this->assertEquals(false, $hn->match('http://news.ycombinator.com/item?id=10074364')); + } + + public function testContent() + { + $guzzle = $this->getMockBuilder('Guzzle\Http\Client') + ->disableOriginalConstructor() + ->getMock(); + + $request = $this->getMockBuilder('Guzzle\Http\Message\Request') + ->disableOriginalConstructor() + ->getMock(); + + $response = $this->getMockBuilder('Guzzle\Http\Message\Response') + ->disableOriginalConstructor() + ->getMock(); + + $guzzle->expects($this->any()) + ->method('get') + ->will($this->returnValue($request)); + + $request->expects($this->any()) + ->method('send') + ->will($this->returnValue($response)); + + $response->expects($this->any()) + ->method('json') + ->will($this->returnValue(array('text' => 'toto', 'type' => 'story'))); + + $hn = new HackerNews($guzzle); + + // first test fail because we didn't match an url, so HackerNewsId isn't defined + $this->assertEmpty($hn->getContent()); + + $hn->match('http://news.ycombinator.com/item?id=10074364'); + $this->assertEquals('

toto

', $hn->getContent()); + } +} diff --git a/src/FeedBundle/Tests/Extractor/InstagramTest.php b/src/FeedBundle/Tests/Extractor/InstagramTest.php index 3f5ed193..c220c17f 100644 --- a/src/FeedBundle/Tests/Extractor/InstagramTest.php +++ b/src/FeedBundle/Tests/Extractor/InstagramTest.php @@ -27,22 +27,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $instagram = new Instagram($guzzle); $this->assertEquals($expected, $instagram->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/SoundcloudTest.php b/src/FeedBundle/Tests/Extractor/SoundcloudTest.php index 825313b4..482f30b5 100644 --- a/src/FeedBundle/Tests/Extractor/SoundcloudTest.php +++ b/src/FeedBundle/Tests/Extractor/SoundcloudTest.php @@ -26,22 +26,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $soundCloud = new Soundcloud($guzzle); $this->assertEquals($expected, $soundCloud->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/SpotifyTest.php b/src/FeedBundle/Tests/Extractor/SpotifyTest.php index 49b464ef..d3e3a7b0 100644 --- a/src/FeedBundle/Tests/Extractor/SpotifyTest.php +++ b/src/FeedBundle/Tests/Extractor/SpotifyTest.php @@ -28,22 +28,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $spotify = new Spotify($guzzle); $this->assertEquals($expected, $spotify->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/VidmeTest.php b/src/FeedBundle/Tests/Extractor/VidmeTest.php index 64f25af3..b16a4d55 100644 --- a/src/FeedBundle/Tests/Extractor/VidmeTest.php +++ b/src/FeedBundle/Tests/Extractor/VidmeTest.php @@ -26,22 +26,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $vidme = new Vidme($guzzle); $this->assertEquals($expected, $vidme->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/VimeoTest.php b/src/FeedBundle/Tests/Extractor/VimeoTest.php index 965b7fb6..c5d2b411 100644 --- a/src/FeedBundle/Tests/Extractor/VimeoTest.php +++ b/src/FeedBundle/Tests/Extractor/VimeoTest.php @@ -27,22 +27,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $vimeo = new Vimeo($guzzle); $this->assertEquals($expected, $vimeo->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/VineTest.php b/src/FeedBundle/Tests/Extractor/VineTest.php index 9873fbe7..7b688963 100644 --- a/src/FeedBundle/Tests/Extractor/VineTest.php +++ b/src/FeedBundle/Tests/Extractor/VineTest.php @@ -26,22 +26,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $vine = new Vine($guzzle); $this->assertEquals($expected, $vine->match($url)); } diff --git a/src/FeedBundle/Tests/Extractor/YoutubeTest.php b/src/FeedBundle/Tests/Extractor/YoutubeTest.php index a6ed397a..07c8e348 100644 --- a/src/FeedBundle/Tests/Extractor/YoutubeTest.php +++ b/src/FeedBundle/Tests/Extractor/YoutubeTest.php @@ -27,22 +27,6 @@ public function testMatch($url, $expected) ->disableOriginalConstructor() ->getMock(); - $request = $this->getMockBuilder('Guzzle\Http\Message\Request') - ->disableOriginalConstructor() - ->getMock(); - - $response = $this->getMockBuilder('Guzzle\Http\Message\Response') - ->disableOriginalConstructor() - ->getMock(); - - $guzzle->expects($this->any()) - ->method('get') - ->will($this->returnValue($request)); - - $request->expects($this->any()) - ->method('send') - ->will($this->returnValue($response)); - $youtube = new Youtube($guzzle); $this->assertEquals($expected, $youtube->match($url)); }