| <?php | |
| use Symfony\Component\HttpFoundation\Request; | |
| use Symfony\Component\HttpFoundation\Response; | |
| 
 | |
| class FindFeedsTest extends PHPUnit\Framework\TestCase | |
| { | |
| 
 | |
|     private $http; | |
| 
 | |
|     public function setUp(): void | |
|     { | |
|         $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); | |
|     } | |
| }
 |