|
<?php
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class FindFeedsTest extends PHPUnit_Framework_TestCase {
|
|
|
|
private $http;
|
|
|
|
public function setUp() {
|
|
$this->client = new Feeds();
|
|
$this->client->http = new p3k\HTTP\Test(dirname(__FILE__).'/data/');
|
|
$this->client->mc = null;
|
|
}
|
|
|
|
private function parse($params) {
|
|
$request = new Request($params);
|
|
$response = new Response();
|
|
return $this->client->find($request, $response);
|
|
}
|
|
|
|
// h-feed with no alternates
|
|
public function testMf2HFeed() {
|
|
$url = 'http://feed.example.com/h-feed-with-child-author';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/h-feed-with-child-author', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
}
|
|
|
|
// h-feed that links to Atom alternate
|
|
public function testMf2WithAtomAlternate() {
|
|
$url = 'http://feed.example.com/h-feed-with-atom-alternate';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(2, count($feeds));
|
|
// Should rank h-feed above Atom
|
|
$this->assertEquals('http://feed.example.com/h-feed-with-atom-alternate', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
$this->assertEquals('http://feed.example.com/atom', $feeds[1]->url);
|
|
$this->assertEquals('atom', $feeds[1]->type);
|
|
}
|
|
|
|
// h-feed that links to RSS alternate
|
|
public function testMf2WithRSSAlternate() {
|
|
$url = 'http://feed.example.com/h-feed-with-rss-alternate';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(2, count($feeds));
|
|
// Should rank JSONFeed above Atom
|
|
$this->assertEquals('http://feed.example.com/h-feed-with-rss-alternate', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
$this->assertEquals('http://feed.example.com/podcast.xml', $feeds[1]->url);
|
|
$this->assertEquals('rss', $feeds[1]->type);
|
|
}
|
|
|
|
// No mf2 but links to Atom alternate
|
|
public function testNoMf2() {
|
|
$url = 'http://feed.example.com/html-with-atom-alternate';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/atom', $feeds[0]->url);
|
|
$this->assertEquals('atom', $feeds[0]->type);
|
|
}
|
|
|
|
public function testNoMf2WithJSONAndAtom() {
|
|
$url = 'http://feed.example.com/html-with-json-and-atom';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(2, count($feeds));
|
|
// Should rank JSONFeed above Atom
|
|
$this->assertEquals('http://feed.example.com/jsonfeed', $feeds[0]->url);
|
|
$this->assertEquals('jsonfeed', $feeds[0]->type);
|
|
$this->assertEquals('http://feed.example.com/atom', $feeds[1]->url);
|
|
$this->assertEquals('atom', $feeds[1]->type);
|
|
}
|
|
|
|
// input URL is an Atom feed
|
|
public function testInputIsAtom() {
|
|
$url = 'http://feed.example.com/atom';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/atom', $feeds[0]->url);
|
|
$this->assertEquals('atom', $feeds[0]->type);
|
|
}
|
|
|
|
// input URL is an RSS feed with xml content type
|
|
public function testInputIsRSSWithXML() {
|
|
$url = 'http://feed.example.com/rss-xml-content-type';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/rss-xml-content-type', $feeds[0]->url);
|
|
$this->assertEquals('rss', $feeds[0]->type);
|
|
}
|
|
|
|
// input URL redirects to an Atom feed
|
|
public function testInputIsRedirectToAtom() {
|
|
$url = 'http://feed.example.com/redirect-to-atom';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/atom', $feeds[0]->url);
|
|
$this->assertEquals('atom', $feeds[0]->type);
|
|
}
|
|
|
|
// input URL is a temporary redirect to another page.
|
|
// report the original input URL
|
|
public function testInputIsTemporaryRedirect() {
|
|
$url = 'http://feed.example.com/temporary-redirect';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/temporary-redirect', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
}
|
|
|
|
public function testInputIsPermanentRedirect() {
|
|
$url = 'http://feed.example.com/permanent-redirect';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/permanent-redirect-target', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
}
|
|
|
|
// input URL is an RSS feed
|
|
public function testInputIsRSS() {
|
|
$url = 'http://feed.example.com/rss';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/rss', $feeds[0]->url);
|
|
$this->assertEquals('rss', $feeds[0]->type);
|
|
}
|
|
|
|
// input URL is a JSON feed
|
|
public function testInputIsJSONFeed() {
|
|
$url = 'http://feed.example.com/jsonfeed';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/jsonfeed', $feeds[0]->url);
|
|
$this->assertEquals('jsonfeed', $feeds[0]->type);
|
|
}
|
|
|
|
public function testInputIsMicroformats2JSON() {
|
|
$url = 'http://feed.example.com/microformats2-json';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/microformats2-json', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
}
|
|
|
|
public function testInputIsMF2JSON() {
|
|
$url = 'http://feed.example.com/mf2-json';
|
|
$response = $this->parse(['url' => $url]);
|
|
|
|
$body = $response->getContent();
|
|
$this->assertEquals(200, $response->getStatusCode());
|
|
$feeds = json_decode($body)->feeds;
|
|
|
|
$this->assertEquals(1, count($feeds));
|
|
$this->assertEquals('http://feed.example.com/mf2-json', $feeds[0]->url);
|
|
$this->assertEquals('microformats', $feeds[0]->type);
|
|
}
|
|
}
|