--- /dev/null
+<?php
+
+namespace Shaarli\Formatter;
+
+use DateTime;
+use PHPUnit\Framework\TestCase;
+use Shaarli\Bookmark\Bookmark;
+use Shaarli\Config\ConfigManager;
+
+/**
+ * Class BookmarkMarkdownExtraFormatterTest
+ * @package Shaarli\Formatter
+ */
+class BookmarkMarkdownExtraFormatterTest extends TestCase
+{
+ /** @var string Path of test config file */
+ protected static $testConf = 'sandbox/config';
+
+ /** @var BookmarkFormatter */
+ protected $formatter;
+
+ /** @var ConfigManager instance */
+ protected $conf;
+
+ /**
+ * Initialize formatter instance.
+ */
+ public function setUp(): void
+ {
+ copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php');
+ $this->conf = new ConfigManager(self::$testConf);
+ $this->formatter = new BookmarkMarkdownExtraFormatter($this->conf, true);
+ }
+
+ /**
+ * Test formatting a bookmark with all its attribute filled.
+ */
+ public function testFormatExtra(): void
+ {
+ $bookmark = new Bookmark();
+ $bookmark->setId($id = 11);
+ $bookmark->setShortUrl($short = 'abcdef');
+ $bookmark->setUrl('https://sub.domain.tld?query=here&for=real#hash');
+ $bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
+ $bookmark->setDescription('<h2>Content</h2><p>`Here is some content</p>');
+ $bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
+ $bookmark->setThumbnail('http://domain2.tdl2/?type=img&name=file.png');
+ $bookmark->setSticky(true);
+ $bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190521_190412'));
+ $bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190521_191213'));
+ $bookmark->setPrivate(true);
+
+ $link = $this->formatter->format($bookmark);
+ $this->assertEquals($id, $link['id']);
+ $this->assertEquals($short, $link['shorturl']);
+ $this->assertEquals('https://sub.domain.tld?query=here&for=real#hash', $link['url']);
+ $this->assertEquals(
+ 'https://sub.domain.tld?query=here&for=real#hash',
+ $link['real_url']
+ );
+ $this->assertEquals('This is a <strong>bookmark</strong>', $link['title']);
+ $this->assertEquals(
+ '<div class="markdown"><p>'.
+ '<h2>Content</h2><p>`Here is some content</p>'.
+ '</p></div>',
+ $link['description']
+ );
+ $tags[3] = '<script>alert("xss");</script>';
+ $this->assertEquals($tags, $link['taglist']);
+ $this->assertEquals(implode(' ', $tags), $link['tags']);
+ $this->assertEquals(
+ 'http://domain2.tdl2/?type=img&name=file.png',
+ $link['thumbnail']
+ );
+ $this->assertEquals($created, $link['created']);
+ $this->assertEquals($created->getTimestamp(), $link['timestamp']);
+ $this->assertEquals($updated, $link['updated']);
+ $this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
+ $this->assertTrue($link['private']);
+ $this->assertTrue($link['sticky']);
+ $this->assertEquals('private', $link['class']);
+ }
+
+ /**
+ * Test formatting a bookmark with all its attribute filled.
+ */
+ public function testFormatExtraMinimal(): void
+ {
+ $bookmark = new Bookmark();
+
+ $link = $this->formatter->format($bookmark);
+ $this->assertEmpty($link['id']);
+ $this->assertEmpty($link['shorturl']);
+ $this->assertEmpty($link['url']);
+ $this->assertEmpty($link['real_url']);
+ $this->assertEmpty($link['title']);
+ $this->assertEmpty($link['description']);
+ $this->assertEmpty($link['taglist']);
+ $this->assertEmpty($link['tags']);
+ $this->assertEmpty($link['thumbnail']);
+ $this->assertEmpty($link['created']);
+ $this->assertEmpty($link['timestamp']);
+ $this->assertEmpty($link['updated']);
+ $this->assertEmpty($link['updated_timestamp']);
+ $this->assertFalse($link['private']);
+ $this->assertFalse($link['sticky']);
+ $this->assertEmpty($link['class']);
+ }
+
+ /**
+ * Make sure that the description is properly formatted by the default formatter.
+ */
+ public function testFormatExtrraDescription(): void
+ {
+ $description = 'This a <strong>description</strong>'. PHP_EOL;
+ $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL;
+ $description .= 'Also, there is an #hashtag added'. PHP_EOL;
+ $description .= ' A N D KEEP SPACES ! '. PHP_EOL;
+ $description .= '# Header {.class}'. PHP_EOL;
+
+ $bookmark = new Bookmark();
+ $bookmark->setDescription($description);
+ $link = $this->formatter->format($bookmark);
+
+ $description = '<div class="markdown"><p>';
+ $description .= 'This a <strong>description</strong><br />'. PHP_EOL;
+ $url = 'https://sub.domain.tld?query=here&for=real#hash';
+ $description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL;
+ $description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />'. PHP_EOL;
+ $description .= 'A N D KEEP SPACES ! </p>' . PHP_EOL;
+ $description .= '<h1 class="class">Header</h1>';
+ $description .= '</div>';
+
+ $this->assertEquals($description, $link['description']);
+ }
+
+ /**
+ * Test formatting URL with an index_url set
+ * It should prepend relative links.
+ */
+ public function testFormatExtraNoteWithIndexUrl(): void
+ {
+ $bookmark = new Bookmark();
+ $bookmark->setUrl($short = '?abcdef');
+ $description = 'Text #hashtag more text';
+ $bookmark->setDescription($description);
+
+ $this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/');
+
+ $description = '<div class="markdown"><p>';
+ $description .= 'Text <a href="'. $root .'./add-tag/hashtag">#hashtag</a> more text';
+ $description .= '</p></div>';
+
+ $link = $this->formatter->format($bookmark);
+ $this->assertEquals($root . $short, $link['url']);
+ $this->assertEquals($root . $short, $link['real_url']);
+ $this->assertEquals(
+ $description,
+ $link['description']
+ );
+ }
+}