namespace Shaarli\Bookmark;
-use ReferenceLinkDB;
+use Shaarli\TestCase;
require_once 'tests/utils/CurlUtils.php';
/**
* Class LinkUtilsTest.
*/
-class LinkUtilsTest extends \PHPUnit\Framework\TestCase
+class LinkUtilsTest extends TestCase
{
/**
* Test html_extract_title() when the title is found.
$this->assertEquals(strtolower($charset), header_extract_charset($headers));
}
+ /**
+ * Test headers_extract_charset() when the charset is found with odd quotes.
+ */
+ public function testHeadersExtractExistentCharsetWithQuotes()
+ {
+ $charset = 'x-MacCroatian';
+ $headers = 'text/html; charset="' . $charset . '"otherstuff="test"';
+ $this->assertEquals(strtolower($charset), header_extract_charset($headers));
+
+ $headers = 'text/html; charset=\'' . $charset . '\'otherstuff="test"';
+ $this->assertEquals(strtolower($charset), header_extract_charset($headers));
+ }
+
/**
* Test headers_extract_charset() when the charset is not found.
*/
$this->assertFalse(html_extract_charset($html));
}
+ /**
+ * Test html_extract_tag() when the tag <meta name= is found.
+ */
+ public function testHtmlExtractExistentNameTag()
+ {
+ $description = 'Bob and Alice share cookies.';
+ $html = '<html><meta>stuff2</meta><meta name="description" content="' . $description . '"/></html>';
+ $this->assertEquals($description, html_extract_tag('description', $html));
+ }
+
+ /**
+ * Test html_extract_tag() when the tag <meta name= is not found.
+ */
+ public function testHtmlExtractNonExistentNameTag()
+ {
+ $html = '<html><meta>stuff2</meta><meta name="image" content="img"/></html>';
+ $this->assertFalse(html_extract_tag('description', $html));
+ }
+
+ /**
+ * Test html_extract_tag() when the tag <meta property="og: is found.
+ */
+ public function testHtmlExtractExistentOgTag()
+ {
+ $description = 'Bob and Alice share cookies.';
+ $html = '<html><meta>stuff2</meta><meta property="og:description" content="' . $description . '"/></html>';
+ $this->assertEquals($description, html_extract_tag('description', $html));
+ }
+
+ /**
+ * Test html_extract_tag() when the tag <meta property="og: is not found.
+ */
+ public function testHtmlExtractNonExistentOgTag()
+ {
+ $html = '<html><meta>stuff2</meta><meta name="image" content="img"/></html>';
+ $this->assertFalse(html_extract_tag('description', $html));
+ }
+
/**
* Test the download callback with valid value
*/
public function testCurlDownloadCallbackOk()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_ok');
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_ok'
+ );
$data = [
'HTTP/1.1 200 OK',
'Server: GitHub.com',
'end' => 'th=device-width">'
. '<title>Refactoring · GitHub</title>'
. '<link rel="search" type="application/opensea',
- '<title>ignored</title>',
+ '<title>ignored</title>'
+ . '<meta name="description" content="desc" />'
+ . '<meta name="keywords" content="key1,key2" />',
];
foreach ($data as $key => $line) {
$ignore = null;
}
$this->assertEquals('utf-8', $charset);
$this->assertEquals('Refactoring · GitHub', $title);
+ $this->assertEmpty($desc);
+ $this->assertEmpty($keywords);
}
/**
*/
public function testCurlDownloadCallbackOkNoCharset()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_no_charset');
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_no_charset'
+ );
$data = [
'HTTP/1.1 200 OK',
'end' => 'th=device-width">'
. '<title>Refactoring · GitHub</title>'
. '<link rel="search" type="application/opensea',
- '<title>ignored</title>',
+ '<title>ignored</title>'
+ . '<meta name="description" content="desc" />'
+ . '<meta name="keywords" content="key1,key2" />',
];
foreach ($data as $key => $line) {
$ignore = null;
}
$this->assertEmpty($charset);
$this->assertEquals('Refactoring · GitHub', $title);
+ $this->assertEmpty($desc);
+ $this->assertEmpty($keywords);
}
/**
*/
public function testCurlDownloadCallbackOkHtmlCharset()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_no_charset');
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_no_charset'
+ );
$data = [
'HTTP/1.1 200 OK',
'<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />',
'end' => 'th=device-width">'
. '<title>Refactoring · GitHub</title>'
. '<link rel="search" type="application/opensea',
- '<title>ignored</title>',
+ '<title>ignored</title>'
+ . '<meta name="description" content="desc" />'
+ . '<meta name="keywords" content="key1,key2" />',
];
foreach ($data as $key => $line) {
$ignore = null;
}
$this->assertEquals('utf-8', $charset);
$this->assertEquals('Refactoring · GitHub', $title);
+ $this->assertEmpty($desc);
+ $this->assertEmpty($keywords);
}
/**
*/
public function testCurlDownloadCallbackOkNoTitle()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_ok');
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_ok'
+ );
$data = [
'HTTP/1.1 200 OK',
'end' => 'th=device-width">Refactoring · GitHub<link rel="search" type="application/opensea',
}
$this->assertEquals('utf-8', $charset);
$this->assertEmpty($title);
+ $this->assertEmpty($desc);
+ $this->assertEmpty($keywords);
}
/**
*/
public function testCurlDownloadCallbackInvalidContentType()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_ct_ko');
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_ct_ko'
+ );
$ignore = null;
$this->assertFalse($callback($ignore, ''));
$this->assertEmpty($charset);
*/
public function testCurlDownloadCallbackInvalidResponseCode()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_rc_ko');
+ $callback = $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_rc_ko'
+ );
$ignore = null;
$this->assertFalse($callback($ignore, ''));
$this->assertEmpty($charset);
*/
public function testCurlDownloadCallbackInvalidContentTypeAndResponseCode()
{
- $callback = get_curl_download_callback($charset, $title, 'ut_curl_getinfo_rs_ct_ko');
+ $callback = $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ false,
+ 'ut_curl_getinfo_rs_ct_ko'
+ );
$ignore = null;
$this->assertFalse($callback($ignore, ''));
$this->assertEmpty($charset);
}
/**
- * Test count_private.
+ * Test the download callback with valid value, and retrieve_description option enabled.
+ */
+ public function testCurlDownloadCallbackOkWithDesc()
+ {
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ true,
+ 'ut_curl_getinfo_ok'
+ );
+ $data = [
+ 'HTTP/1.1 200 OK',
+ 'Server: GitHub.com',
+ 'Date: Sat, 28 Oct 2017 12:01:33 GMT',
+ 'Content-Type: text/html; charset=utf-8',
+ 'Status: 200 OK',
+ 'th=device-width">'
+ . '<title>Refactoring · GitHub</title>'
+ . '<link rel="search" type="application/opensea',
+ 'end' => '<title>ignored</title>'
+ . '<meta name="description" content="link desc" />'
+ . '<meta name="keywords" content="key1,key2" />',
+ ];
+ foreach ($data as $key => $line) {
+ $ignore = null;
+ $expected = $key !== 'end' ? strlen($line) : false;
+ $this->assertEquals($expected, $callback($ignore, $line));
+ if ($expected === false) {
+ break;
+ }
+ }
+ $this->assertEquals('utf-8', $charset);
+ $this->assertEquals('Refactoring · GitHub', $title);
+ $this->assertEquals('link desc', $desc);
+ $this->assertEquals('key1 key2', $keywords);
+ }
+
+ /**
+ * Test the download callback with valid value, and retrieve_description option enabled,
+ * but no desc or keyword defined in the page.
*/
- public function testCountPrivateLinks()
+ public function testCurlDownloadCallbackOkWithDescNotFound()
{
- $refDB = new ReferenceLinkDB();
- $this->assertEquals($refDB->countPrivateLinks(), count_private($refDB->getLinks()));
+ $callback = get_curl_download_callback(
+ $charset,
+ $title,
+ $desc,
+ $keywords,
+ true,
+ 'ut_curl_getinfo_ok'
+ );
+ $data = [
+ 'HTTP/1.1 200 OK',
+ 'Server: GitHub.com',
+ 'Date: Sat, 28 Oct 2017 12:01:33 GMT',
+ 'Content-Type: text/html; charset=utf-8',
+ 'Status: 200 OK',
+ 'th=device-width">'
+ . '<title>Refactoring · GitHub</title>'
+ . '<link rel="search" type="application/opensea',
+ 'end' => '<title>ignored</title>',
+ ];
+ foreach ($data as $key => $line) {
+ $ignore = null;
+ $expected = $key !== 'end' ? strlen($line) : false;
+ $this->assertEquals($expected, $callback($ignore, $line));
+ if ($expected === false) {
+ break;
+ }
+ }
+ $this->assertEquals('utf-8', $charset);
+ $this->assertEquals('Refactoring · GitHub', $title);
+ $this->assertEmpty($desc);
+ $this->assertEmpty($keywords);
}
/**
カタカナ #カタカナ」カタカナ\n';
$autolinkedDescription = hashtag_autolink($rawDescription, $index);
- $this->assertContains($this->getHashtagLink('hashtag', $index), $autolinkedDescription);
- $this->assertNotContains(' #hashtag', $autolinkedDescription);
- $this->assertNotContains('>#nothashtag', $autolinkedDescription);
- $this->assertContains($this->getHashtagLink('ашок', $index), $autolinkedDescription);
- $this->assertContains($this->getHashtagLink('カタカナ', $index), $autolinkedDescription);
- $this->assertContains($this->getHashtagLink('hashtag_hashtag', $index), $autolinkedDescription);
- $this->assertNotContains($this->getHashtagLink('hashtag-nothashtag', $index), $autolinkedDescription);
+ $this->assertContainsPolyfill($this->getHashtagLink('hashtag', $index), $autolinkedDescription);
+ $this->assertNotContainsPolyfill(' #hashtag', $autolinkedDescription);
+ $this->assertNotContainsPolyfill('>#nothashtag', $autolinkedDescription);
+ $this->assertContainsPolyfill($this->getHashtagLink('ашок', $index), $autolinkedDescription);
+ $this->assertContainsPolyfill($this->getHashtagLink('カタカナ', $index), $autolinkedDescription);
+ $this->assertContainsPolyfill($this->getHashtagLink('hashtag_hashtag', $index), $autolinkedDescription);
+ $this->assertNotContainsPolyfill($this->getHashtagLink('hashtag-nothashtag', $index), $autolinkedDescription);
}
/**
$rawDescription = 'blabla #hashtag x#nothashtag';
$autolinkedDescription = hashtag_autolink($rawDescription);
- $this->assertContains($this->getHashtagLink('hashtag'), $autolinkedDescription);
- $this->assertNotContains(' #hashtag', $autolinkedDescription);
- $this->assertNotContains('>#nothashtag', $autolinkedDescription);
+ $this->assertContainsPolyfill($this->getHashtagLink('hashtag'), $autolinkedDescription);
+ $this->assertNotContainsPolyfill(' #hashtag', $autolinkedDescription);
+ $this->assertNotContainsPolyfill('>#nothashtag', $autolinkedDescription);
}
/**
*/
private function getHashtagLink($hashtag, $index = '')
{
- $hashtagLink = '<a href="' . $index . '?addtag=$1" title="Hashtag $1">#$1</a>';
+ $hashtagLink = '<a href="' . $index . './add-tag/$1" title="Hashtag $1">#$1</a>';
return str_replace('$1', $hashtag, $hashtagLink);
}
}