You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

215 lines
6.3 KiB

<?php
namespace p3k\WebSub\Tests;
use PHPUnit\Framework\TestCase;
use p3k\WebSub\Client;
class DiscoverTest extends TestCase {
public function testFindsHubAndSelfInHeadRequestLinkHeaders() {
$http = new FakeHTTP([
'HEAD' => [
'headers' => ['Content-Type' => 'text/html; charset=utf-8'],
'rels' => [
'hub' => ['https://hub.example/'],
'self' => ['https://example.com/'],
],
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/');
$this->assertSame([
'hub' => 'https://hub.example/',
'hub_source' => 'http',
'self' => 'https://example.com/',
'self_source' => 'http',
'type' => 'html',
], $result);
// Everything was in the HEAD response, so no GET is needed
$this->assertCount(1, $http->requests);
$this->assertSame('HEAD', $http->requests[0]['method']);
}
public function testFallsBackToGetWhenHeadHasNoLinks() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'text/html'],
'rels' => [
'hub' => ['https://hub.example/'],
'self' => ['https://example.com/'],
],
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/');
$this->assertSame('https://hub.example/', $result['hub']);
$this->assertSame('http', $result['hub_source']);
$this->assertSame(['HEAD', 'GET'], array_column($http->requests, 'method'));
}
public function testSkipsHeadRequestWhenHeadfirstIsFalse() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'text/html'],
'rels' => [
'hub' => ['https://hub.example/'],
'self' => ['https://example.com/'],
],
],
]);
$client = new Client($http);
$client->discover('https://example.com/', false);
$this->assertSame(['GET'], array_column($http->requests, 'method'));
}
public function testDetectsRssFromHeadContentType() {
$http = new FakeHTTP([
'HEAD' => [
'headers' => ['Content-Type' => 'application/rss+xml; charset=utf-8'],
'rels' => [
'hub' => ['https://hub.example/'],
'self' => ['https://example.com/feed.rss'],
],
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/feed.rss');
$this->assertSame('rss', $result['type']);
$this->assertCount(1, $http->requests);
}
public function testFindsLinksInAtomFeedBody() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'application/atom+xml'],
'body' => '<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Example</title>
<link rel="hub" href="https://hub.example/"/>
<link rel="self" href="https://example.com/feed.atom"/>
</feed>',
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/feed.atom');
$this->assertSame([
'hub' => 'https://hub.example/',
'hub_source' => 'body',
'self' => 'https://example.com/feed.atom',
'self_source' => 'body',
'type' => 'atom',
], $result);
}
public function testFindsAtomLinksInRssFeedBody() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'application/rss+xml'],
'body' => '<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Example</title>
<atom:link rel="hub" href="https://hub.example/"/>
<atom:link rel="self" href="https://example.com/feed.rss"/>
</channel>
</rss>',
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/feed.rss');
$this->assertSame('https://hub.example/', $result['hub']);
$this->assertSame('https://example.com/feed.rss', $result['self']);
$this->assertSame('body', $result['self_source']);
$this->assertSame('rss', $result['type']);
}
public function testFindsLinkElementsInHtmlBody() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'text/html'],
'body' => '<!doctype html>
<html>
<head>
<title>Example</title>
<link rel="hub" href="https://hub.example/">
<link rel="self" href="https://example.com/">
</head>
<body></body>
</html>',
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/');
$this->assertSame('https://hub.example/', $result['hub']);
$this->assertSame('body', $result['hub_source']);
$this->assertSame('https://example.com/', $result['self']);
$this->assertSame('html', $result['type']);
}
public function testLinkHeadersTakePriorityOverBody() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'application/atom+xml'],
'rels' => ['hub' => ['https://header-hub.example/']],
'body' => '<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<link rel="hub" href="https://body-hub.example/"/>
<link rel="self" href="https://example.com/feed.atom"/>
</feed>',
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/feed.atom');
$this->assertSame('https://header-hub.example/', $result['hub']);
$this->assertSame('http', $result['hub_source']);
$this->assertSame('https://example.com/feed.atom', $result['self']);
$this->assertSame('body', $result['self_source']);
}
public function testReturnsFalseWithoutHub() {
$http = new FakeHTTP([
'GET' => [
'headers' => ['Content-Type' => 'text/html'],
'rels' => ['self' => ['https://example.com/']],
],
]);
$client = new Client($http);
$this->assertFalse($client->discover('https://example.com/'));
}
public function testVerboseIncludesDetails() {
$http = new FakeHTTP([
'HEAD' => [
'headers' => ['Content-Type' => 'text/html'],
'rels' => [
'hub' => ['https://hub.example/'],
'self' => ['https://example.com/'],
],
],
]);
$client = new Client($http);
$result = $client->discover('https://example.com/', true, true);
$this->assertSame(['https://hub.example/'], $result['details']['http']['hub']);
$this->assertSame([], $result['details']['body']['hub']);
}
}