|
|
@ -0,0 +1,215 @@ |
|
|
|
|
|
<?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']); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |