--- /dev/null
+<?php
+
+namespace Friendica\Test\src\Network;
+
+use Friendica\Network\Probe;
+use PHPUnit\Framework\TestCase;
+
+class ProbeTest extends TestCase
+{
+ const TEMPLATENOBASE = '
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+ <title>Example Blog</title>
+ <link href="{{$link}}" rel="alternate" type="application/rss+xml" title="Example Blog" />
+ <link href="{{$link}}" rel="feed" type="application/rss+xml" title="Example Blog" />
+</head>
+<body>
+ <p>Hello World!</p>
+</body>
+</html>';
+
+ const TEMPLATEBASE = '
+<!DOCTYPE html>
+<html lang="en-us">
+<head>
+ <title>Example Blog</title>
+ <link href="{{$link}}" rel="alternate" type="application/rss+xml" title="Example Blog" />
+ <link href="{{$link}}" rel="feed" type="application/rss+xml" title="Example Blog" />
+ <base href="{{$url}}">
+</head>
+<body>
+ <p>Hello World!</p>
+</body>
+</html>';
+
+ const EXPECTED = [
+ 'https://example.org/path/to/blog/index.php' => [
+ 'index.xml' => 'https://example.org/path/to/blog/index.xml',
+ './index.xml' => 'https://example.org/path/to/blog/index.xml',
+ '../index.xml' => 'https://example.org/path/to/index.xml',
+ '/index.xml' => 'https://example.org/index.xml',
+ '//example.com/index.xml' => 'https://example.com/index.xml',
+ ],
+ 'https://example.org/path/to/blog/' => [
+ 'index.xml' => 'https://example.org/path/to/blog/index.xml',
+ './index.xml' => 'https://example.org/path/to/blog/index.xml',
+ '../index.xml' => 'https://example.org/path/to/index.xml',
+ '/index.xml' => 'https://example.org/index.xml',
+ '//example.com/index.xml' => 'https://example.com/index.xml',
+ ],
+ 'https://example.org/blog/' => [
+ 'index.xml' => 'https://example.org/blog/index.xml',
+ './index.xml' => 'https://example.org/blog/index.xml',
+ '../index.xml' => 'https://example.org/index.xml',
+ '/index.xml' => 'https://example.org/index.xml',
+ '//example.com/index.xml' => 'https://example.com/index.xml',
+ ],
+ 'https://example.org' => [
+ 'index.xml' => 'https://example.org/index.xml',
+ './index.xml' => 'https://example.org/index.xml',
+ '../index.xml' => 'https://example.org/index.xml',
+ '/index.xml' => 'https://example.org/index.xml',
+ '//example.com/index.xml' => 'https://example.com/index.xml',
+ ],
+ ];
+
+ private function replaceMacros($template, $vars)
+ {
+ foreach ($vars as $var => $value) {
+ $template = str_replace('{{' . $var . '}}', $value, $template);
+ }
+
+ return $template;
+ }
+
+ /**
+ * @small
+ */
+ public function testGetFeedLinkNoBase()
+ {
+ foreach (self::EXPECTED as $url => $hrefs) {
+ foreach ($hrefs as $href => $expected) {
+ $body = $this->replaceMacros(self::TEMPLATENOBASE, ['$link' => $href]);
+
+ $feedLink = Probe::getFeedLink($url, $body);
+
+ $this->assertEquals($expected, $feedLink, 'base url = ' . $url . ' | href = ' . $href);
+ }
+ }
+ }
+
+ /**
+ * @small
+ */
+ public function testGetFeedLinkBase()
+ {
+ foreach (self::EXPECTED as $url => $hrefs) {
+ foreach ($hrefs as $href => $expected) {
+ $body = $this->replaceMacros(self::TEMPLATEBASE, ['$url' => $url, '$link' => $href]);
+
+ $feedLink = Probe::getFeedLink('http://example.com', $body);
+
+ $this->assertEquals($expected, $feedLink, 'base url = ' . $url . ' | href = ' . $href);
+ }
+ }
+ }
+}