3 namespace Shaarli\Formatter
;
6 use PHPUnit\Framework\TestCase
;
7 use Shaarli\Bookmark\Bookmark
;
8 use Shaarli\Config\ConfigManager
;
11 * Class BookmarkMarkdownFormatterTest
12 * @package Shaarli\Formatter
14 class BookmarkMarkdownFormatterTest
extends TestCase
16 /** @var string Path of test config file */
17 protected static $testConf = 'sandbox/config';
19 /** @var BookmarkFormatter */
22 /** @var ConfigManager instance */
26 * Initialize formatter instance.
28 public function setUp()
30 copy('tests/utils/config/configJson.json.php', self
::$testConf .'.json.php');
31 $this->conf
= new ConfigManager(self
::$testConf);
32 $this->formatter
= new BookmarkMarkdownFormatter($this->conf
, true);
36 * Test formatting a bookmark with all its attribute filled.
38 public function testFormatFull()
40 $bookmark = new Bookmark();
41 $bookmark->setId($id = 11);
42 $bookmark->setShortUrl($short = 'abcdef');
43 $bookmark->setUrl('https://sub.domain.tld?query=here&for=real#hash');
44 $bookmark->setTitle($title = 'This is a <strong>bookmark</strong>');
45 $bookmark->setDescription('<h2>Content</h2><p>`Here is some content</p>');
46 $bookmark->setTags($tags = ['tag1', 'bookmark', 'other', '<script>alert("xss");</script>']);
47 $bookmark->setThumbnail('http://domain2.tdl2/?type=img&name=file.png');
48 $bookmark->setSticky(true);
49 $bookmark->setCreated($created = DateTime
::createFromFormat('Ymd_His', '20190521_190412'));
50 $bookmark->setUpdated($updated = DateTime
::createFromFormat('Ymd_His', '20190521_191213'));
51 $bookmark->setPrivate(true);
53 $link = $this->formatter
->format($bookmark);
54 $this->assertEquals($id, $link['id']);
55 $this->assertEquals($short, $link['shorturl']);
56 $this->assertEquals('https://sub.domain.tld?query=here&for=real#hash', $link['url']);
58 'https://sub.domain.tld?query=here&for=real#hash',
61 $this->assertEquals('This is a <strong>bookmark</strong>', $link['title']);
63 '<div class="markdown"><p>'.
64 '<h2>Content</h2><p>`Here is some content</p>'.
68 $tags[3] = '<script>alert("xss");</script>';
69 $this->assertEquals($tags, $link['taglist']);
70 $this->assertEquals(implode(' ', $tags), $link['tags']);
72 'http://domain2.tdl2/?type=img&name=file.png',
75 $this->assertEquals($created, $link['created']);
76 $this->assertEquals($created->getTimestamp(), $link['timestamp']);
77 $this->assertEquals($updated, $link['updated']);
78 $this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']);
79 $this->assertTrue($link['private']);
80 $this->assertTrue($link['sticky']);
81 $this->assertEquals('private', $link['class']);
85 * Test formatting a bookmark with all its attribute filled.
87 public function testFormatMinimal()
89 $bookmark = new Bookmark();
91 $link = $this->formatter
->format($bookmark);
92 $this->assertEmpty($link['id']);
93 $this->assertEmpty($link['shorturl']);
94 $this->assertEmpty($link['url']);
95 $this->assertEmpty($link['real_url']);
96 $this->assertEmpty($link['title']);
97 $this->assertEmpty($link['description']);
98 $this->assertEmpty($link['taglist']);
99 $this->assertEmpty($link['tags']);
100 $this->assertEmpty($link['thumbnail']);
101 $this->assertEmpty($link['created']);
102 $this->assertEmpty($link['timestamp']);
103 $this->assertEmpty($link['updated']);
104 $this->assertEmpty($link['updated_timestamp']);
105 $this->assertFalse($link['private']);
106 $this->assertFalse($link['sticky']);
107 $this->assertEmpty($link['class']);
111 * Make sure that the description is properly formatted by the default formatter.
113 public function testFormatDescription()
115 $description = 'This a <strong>description</strong>'. PHP_EOL
;
116 $description .= 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL
;
117 $description .= 'Also, there is an #hashtag added'. PHP_EOL
;
118 $description .= ' A N D KEEP SPACES ! '. PHP_EOL
;
120 $bookmark = new Bookmark();
121 $bookmark->setDescription($description);
122 $link = $this->formatter
->format($bookmark);
124 $description = '<div class="markdown"><p>';
125 $description .= 'This a <strong>description</strong><br />'. PHP_EOL
;
126 $url = 'https://sub.domain.tld?query=here&for=real#hash';
127 $description .= 'text <a href="'. $url .'">'. $url .'</a> more text<br />'. PHP_EOL
;
128 $description .= 'Also, there is an <a href="./add-tag/hashtag">#hashtag</a> added<br />'. PHP_EOL
;
129 $description .= 'A N D KEEP SPACES ! ';
130 $description .= '</p></div>';
132 $this->assertEquals($description, $link['description']);
136 * Test formatting URL with an index_url set
137 * It should prepend relative links.
139 public function testFormatNoteWithIndexUrl()
141 $bookmark = new Bookmark();
142 $bookmark->setUrl($short = '?abcdef');
143 $description = 'Text #hashtag more text';
144 $bookmark->setDescription($description);
146 $this->formatter
->addContextData('index_url', $root = 'https://domain.tld/hithere/');
148 $description = '<div class="markdown"><p>';
149 $description .= 'Text <a href="'. $root .'./add-tag/hashtag">#hashtag</a> more text';
150 $description .= '</p></div>';
152 $link = $this->formatter
->format($bookmark);
153 $this->assertEquals($root . $short, $link['url']);
154 $this->assertEquals($root . $short, $link['real_url']);