]>
Commit | Line | Data |
---|---|---|
e26e2060 A |
1 | <?php |
2 | ||
3 | namespace Shaarli\Formatter; | |
4 | ||
5 | use DateTime; | |
6 | use PHPUnit\Framework\TestCase; | |
7 | use Shaarli\Bookmark\Bookmark; | |
8 | use Shaarli\Config\ConfigManager; | |
9 | ||
10 | /** | |
11 | * Class BookmarkDefaultFormatterTest | |
12 | * @package Shaarli\Formatter | |
13 | */ | |
14 | class BookmarkDefaultFormatterTest extends TestCase | |
15 | { | |
16 | /** @var string Path of test config file */ | |
17 | protected static $testConf = 'sandbox/config'; | |
18 | ||
19 | /** @var BookmarkFormatter */ | |
20 | protected $formatter; | |
21 | ||
22 | /** @var ConfigManager instance */ | |
23 | protected $conf; | |
24 | ||
25 | /** | |
26 | * Initialize formatter instance. | |
27 | */ | |
28 | public function setUp() | |
29 | { | |
30 | copy('tests/utils/config/configJson.json.php', self::$testConf .'.json.php'); | |
31 | $this->conf = new ConfigManager(self::$testConf); | |
a39acb25 | 32 | $this->formatter = new BookmarkDefaultFormatter($this->conf, true); |
e26e2060 A |
33 | } |
34 | ||
35 | /** | |
36 | * Test formatting a bookmark with all its attribute filled. | |
37 | */ | |
38 | public function testFormatFull() | |
39 | { | |
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($desc = '<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); | |
52 | ||
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']); | |
57 | $this->assertEquals( | |
58 | 'https://sub.domain.tld?query=here&for=real#hash', | |
59 | $link['real_url'] | |
60 | ); | |
61 | $this->assertEquals('This is a <strong>bookmark</strong>', $link['title']); | |
62 | $this->assertEquals( | |
63 | '<h2>Content</h2><p>`Here is some content</p>', | |
64 | $link['description'] | |
65 | ); | |
66 | $tags[3] = '<script>alert("xss");</script>'; | |
67 | $this->assertEquals($tags, $link['taglist']); | |
68 | $this->assertEquals(implode(' ', $tags), $link['tags']); | |
69 | $this->assertEquals( | |
70 | 'http://domain2.tdl2/?type=img&name=file.png', | |
71 | $link['thumbnail'] | |
72 | ); | |
73 | $this->assertEquals($created, $link['created']); | |
74 | $this->assertEquals($created->getTimestamp(), $link['timestamp']); | |
75 | $this->assertEquals($updated, $link['updated']); | |
76 | $this->assertEquals($updated->getTimestamp(), $link['updated_timestamp']); | |
77 | $this->assertTrue($link['private']); | |
78 | $this->assertTrue($link['sticky']); | |
79 | $this->assertEquals('private', $link['class']); | |
80 | } | |
81 | ||
82 | /** | |
83 | * Test formatting a bookmark with all its attribute filled. | |
84 | */ | |
85 | public function testFormatMinimal() | |
86 | { | |
87 | $bookmark = new Bookmark(); | |
88 | ||
89 | $link = $this->formatter->format($bookmark); | |
90 | $this->assertEmpty($link['id']); | |
91 | $this->assertEmpty($link['shorturl']); | |
92 | $this->assertEmpty($link['url']); | |
93 | $this->assertEmpty($link['real_url']); | |
94 | $this->assertEmpty($link['title']); | |
95 | $this->assertEmpty($link['description']); | |
96 | $this->assertEmpty($link['taglist']); | |
97 | $this->assertEmpty($link['tags']); | |
98 | $this->assertEmpty($link['thumbnail']); | |
99 | $this->assertEmpty($link['created']); | |
100 | $this->assertEmpty($link['timestamp']); | |
101 | $this->assertEmpty($link['updated']); | |
102 | $this->assertEmpty($link['updated_timestamp']); | |
103 | $this->assertFalse($link['private']); | |
104 | $this->assertFalse($link['sticky']); | |
105 | $this->assertEmpty($link['class']); | |
106 | } | |
107 | ||
108 | /** | |
109 | * Make sure that the description is properly formatted by the default formatter. | |
110 | */ | |
111 | public function testFormatDescription() | |
112 | { | |
113 | $description = []; | |
114 | $description[] = 'This a <strong>description</strong>' . PHP_EOL; | |
115 | $description[] = 'text https://sub.domain.tld?query=here&for=real#hash more text'. PHP_EOL; | |
116 | $description[] = 'Also, there is an #hashtag added'. PHP_EOL; | |
117 | $description[] = ' A N D KEEP SPACES ! '. PHP_EOL; | |
118 | ||
119 | $bookmark = new Bookmark(); | |
120 | $bookmark->setDescription(implode('', $description)); | |
121 | $link = $this->formatter->format($bookmark); | |
122 | ||
123 | $description[0] = 'This a <strong>description</strong><br />'; | |
124 | $url = 'https://sub.domain.tld?query=here&for=real#hash'; | |
125 | $description[1] = 'text <a href="'. $url .'">'. $url .'</a> more text<br />'; | |
03340c18 | 126 | $description[2] = 'Also, there is an <a href="./add-tag/hashtag" '. |
e26e2060 A |
127 | 'title="Hashtag hashtag">#hashtag</a> added<br />'; |
128 | $description[3] = ' A N D KEEP '. | |
129 | 'SPACES ! <br />'; | |
130 | ||
131 | $this->assertEquals(implode(PHP_EOL, $description) . PHP_EOL, $link['description']); | |
132 | } | |
133 | ||
134 | /** | |
135 | * Test formatting URL with an index_url set | |
136 | * It should prepend relative links. | |
137 | */ | |
138 | public function testFormatNoteWithIndexUrl() | |
139 | { | |
140 | $bookmark = new Bookmark(); | |
141 | $bookmark->setUrl($short = '?abcdef'); | |
142 | $description = 'Text #hashtag more text'; | |
143 | $bookmark->setDescription($description); | |
144 | ||
145 | $this->formatter->addContextData('index_url', $root = 'https://domain.tld/hithere/'); | |
146 | ||
147 | $link = $this->formatter->format($bookmark); | |
148 | $this->assertEquals($root . $short, $link['url']); | |
149 | $this->assertEquals($root . $short, $link['real_url']); | |
150 | $this->assertEquals( | |
03340c18 | 151 | 'Text <a href="'. $root .'./add-tag/hashtag" title="Hashtag hashtag">'. |
e26e2060 A |
152 | '#hashtag</a> more text', |
153 | $link['description'] | |
154 | ); | |
155 | } | |
a39acb25 A |
156 | |
157 | /** | |
158 | * Make sure that private tags are properly filtered out when the user is logged out. | |
159 | */ | |
160 | public function testFormatTagListRemovePrivate(): void | |
161 | { | |
162 | $this->formatter = new BookmarkDefaultFormatter($this->conf, false); | |
163 | ||
164 | $bookmark = new Bookmark(); | |
165 | $bookmark->setId($id = 11); | |
166 | $bookmark->setTags($tags = ['bookmark', '.private', 'othertag']); | |
167 | ||
168 | $link = $this->formatter->format($bookmark); | |
169 | ||
170 | unset($tags[1]); | |
171 | $tags = array_values($tags); | |
172 | ||
173 | $this->assertSame(11, $link['id']); | |
174 | $this->assertSame($tags, $link['taglist']); | |
175 | $this->assertSame(implode(' ', $tags), $link['tags']); | |
176 | } | |
e26e2060 | 177 | } |