3 namespace Shaarli\Bookmark
;
5 use Shaarli\Bookmark\Exception\InvalidBookmarkException
;
11 class BookmarkTest
extends TestCase
14 * Test fromArray() with a link with full data
16 public function testFromArrayFull()
21 'url' => 'https://domain.tld/oof.html?param=value#anchor',
22 'title' => 'This is an array link',
23 'description' => 'HTML desc<br><p>hi!</p>',
24 'thumbnail' => 'https://domain.tld/pic.png',
26 'created' => new \
DateTime('-1 minute'),
27 'tags' => ['tag1', 'tag2', 'chair'],
28 'updated' => new \
DateTime(),
32 $bookmark = (new Bookmark())->fromArray($data);
33 $this->assertEquals($data['id'], $bookmark->getId());
34 $this->assertEquals($data['shorturl'], $bookmark->getShortUrl());
35 $this->assertEquals($data['url'], $bookmark->getUrl());
36 $this->assertEquals($data['title'], $bookmark->getTitle());
37 $this->assertEquals($data['description'], $bookmark->getDescription());
38 $this->assertEquals($data['thumbnail'], $bookmark->getThumbnail());
39 $this->assertEquals($data['sticky'], $bookmark->isSticky());
40 $this->assertEquals($data['created'], $bookmark->getCreated());
41 $this->assertEquals($data['tags'], $bookmark->getTags());
42 $this->assertEquals('tag1 tag2 chair', $bookmark->getTagsString());
43 $this->assertEquals($data['updated'], $bookmark->getUpdated());
44 $this->assertEquals($data['private'], $bookmark->isPrivate());
45 $this->assertFalse($bookmark->isNote());
49 * Test fromArray() with a link with minimal data.
50 * Note that I use null values everywhere but this should not happen in the real world.
52 public function testFromArrayMinimal()
59 'description' => null,
65 $bookmark = (new Bookmark())->fromArray($data);
66 $this->assertNull($bookmark->getId());
67 $this->assertNull($bookmark->getShortUrl());
68 $this->assertNull($bookmark->getUrl());
69 $this->assertNull($bookmark->getTitle());
70 $this->assertEquals('', $bookmark->getDescription());
71 $this->assertNull($bookmark->getCreated());
72 $this->assertEquals([], $bookmark->getTags());
73 $this->assertEquals('', $bookmark->getTagsString());
74 $this->assertNull($bookmark->getUpdated());
75 $this->assertFalse($bookmark->getThumbnail());
76 $this->assertFalse($bookmark->isSticky());
77 $this->assertFalse($bookmark->isPrivate());
78 $this->assertTrue($bookmark->isNote());
82 * Test validate() with a valid minimal bookmark
84 public function testValidateValidFullBookmark()
86 $bookmark = new Bookmark();
88 $bookmark->setShortUrl('abc');
89 $bookmark->setCreated($date = \DateTime
::createFromFormat('Ymd_His', '20190514_200102'));
90 $bookmark->setUpdated($dateUp = \DateTime
::createFromFormat('Ymd_His', '20190514_210203'));
91 $bookmark->setUrl($url = 'https://domain.tld/oof.html?param=value#anchor');
92 $bookmark->setTitle($title = 'This is an array link');
93 $bookmark->setDescription($desc = 'HTML desc<br><p>hi!</p>');
94 $bookmark->setTags($tags = ['tag1', 'tag2', 'chair']);
95 $bookmark->setThumbnail($thumb = 'https://domain.tld/pic.png');
96 $bookmark->setPrivate(true);
97 $bookmark->validate();
99 $this->assertEquals(2, $bookmark->getId());
100 $this->assertEquals('abc', $bookmark->getShortUrl());
101 $this->assertEquals($date, $bookmark->getCreated());
102 $this->assertEquals($dateUp, $bookmark->getUpdated());
103 $this->assertEquals($url, $bookmark->getUrl());
104 $this->assertEquals($title, $bookmark->getTitle());
105 $this->assertEquals($desc, $bookmark->getDescription());
106 $this->assertEquals($tags, $bookmark->getTags());
107 $this->assertEquals(implode(' ', $tags), $bookmark->getTagsString());
108 $this->assertEquals($thumb, $bookmark->getThumbnail());
109 $this->assertTrue($bookmark->isPrivate());
110 $this->assertFalse($bookmark->isNote());
114 * Test validate() with a valid minimal bookmark
116 public function testValidateValidMinimalBookmark()
118 $bookmark = new Bookmark();
120 $bookmark->setShortUrl('abc');
121 $bookmark->setCreated($date = \DateTime
::createFromFormat('Ymd_His', '20190514_200102'));
122 $bookmark->validate();
124 $this->assertEquals(1, $bookmark->getId());
125 $this->assertEquals('abc', $bookmark->getShortUrl());
126 $this->assertEquals($date, $bookmark->getCreated());
127 $this->assertEquals('/shaare/abc', $bookmark->getUrl());
128 $this->assertEquals('/shaare/abc', $bookmark->getTitle());
129 $this->assertEquals('', $bookmark->getDescription());
130 $this->assertEquals([], $bookmark->getTags());
131 $this->assertEquals('', $bookmark->getTagsString());
132 $this->assertFalse($bookmark->getThumbnail());
133 $this->assertFalse($bookmark->isPrivate());
134 $this->assertTrue($bookmark->isNote());
135 $this->assertNull($bookmark->getUpdated());
139 * Test validate() with a a bookmark without ID.
141 public function testValidateNotValidNoId()
143 $bookmark = new Bookmark();
144 $bookmark->setShortUrl('abc');
145 $bookmark->setCreated(\DateTime
::createFromFormat('Ymd_His', '20190514_200102'));
148 $bookmark->validate();
149 } catch (InvalidBookmarkException
$e) {
152 $this->assertNotNull($exception);
153 $this->assertContainsPolyfill('- ID: '. PHP_EOL
, $exception->getMessage());
157 * Test validate() with a a bookmark without short url.
159 public function testValidateNotValidNoShortUrl()
161 $bookmark = new Bookmark();
163 $bookmark->setCreated(\DateTime
::createFromFormat('Ymd_His', '20190514_200102'));
164 $bookmark->setShortUrl(null);
167 $bookmark->validate();
168 } catch (InvalidBookmarkException
$e) {
171 $this->assertNotNull($exception);
172 $this->assertContainsPolyfill('- ShortUrl: '. PHP_EOL
, $exception->getMessage());
176 * Test validate() with a a bookmark without created datetime.
178 public function testValidateNotValidNoCreated()
180 $bookmark = new Bookmark();
182 $bookmark->setShortUrl('abc');
183 $bookmark->setCreated(null);
186 $bookmark->validate();
187 } catch (InvalidBookmarkException
$e) {
190 $this->assertNotNull($exception);
191 $this->assertContainsPolyfill('- Created: '. PHP_EOL
, $exception->getMessage());
195 * Test setId() and make sure that default fields are generated.
197 public function testSetIdEmptyGeneratedFields()
199 $bookmark = new Bookmark();
202 $this->assertEquals(2, $bookmark->getId());
203 $this->assertRegExp('/[\w\-]{6}/', $bookmark->getShortUrl());
204 $this->assertTrue(new \
DateTime('5 seconds ago') < $bookmark->getCreated());
208 * Test setId() and with generated fields already set.
210 public function testSetIdSetGeneratedFields()
212 $bookmark = new Bookmark();
213 $bookmark->setShortUrl('abc');
214 $bookmark->setCreated($date = \DateTime
::createFromFormat('Ymd_His', '20190514_200102'));
217 $this->assertEquals(2, $bookmark->getId());
218 $this->assertEquals('abc', $bookmark->getShortUrl());
219 $this->assertEquals($date, $bookmark->getCreated());
223 * Test setUrl() and make sure it accepts custom protocols
225 public function testGetUrlWithValidProtocols()
227 $bookmark = new Bookmark();
228 $bookmark->setUrl($url = 'myprotocol://helloworld', ['myprotocol']);
229 $this->assertEquals($url, $bookmark->getUrl());
231 $bookmark->setUrl($url = 'https://helloworld.tld', ['myprotocol']);
232 $this->assertEquals($url, $bookmark->getUrl());
236 * Test setUrl() and make sure it accepts custom protocols
238 public function testGetUrlWithNotValidProtocols()
240 $bookmark = new Bookmark();
241 $bookmark->setUrl('myprotocol://helloworld', []);
242 $this->assertEquals('http://helloworld', $bookmark->getUrl());
244 $bookmark->setUrl($url = 'https://helloworld.tld', []);
245 $this->assertEquals($url, $bookmark->getUrl());
249 * Test setTagsString() with exotic data
251 public function testSetTagsString()
253 $bookmark = new Bookmark();
255 $str = 'tag1 tag2 tag3.tag3-2, tag4 , -tag5 ';
256 $bookmark->setTagsString($str);
270 * Test setTags() with exotic data
272 public function testSetTags()
274 $bookmark = new Bookmark();
284 $bookmark->setTags($array);
300 public function testRenameTag()
302 $bookmark = new Bookmark();
303 $bookmark->setTags(['tag1', 'tag2', 'chair']);
304 $bookmark->renameTag('chair', 'table');
305 $this->assertEquals(['tag1', 'tag2', 'table'], $bookmark->getTags());
306 $bookmark->renameTag('tag1', 'tag42');
307 $this->assertEquals(['tag42', 'tag2', 'table'], $bookmark->getTags());
308 $bookmark->renameTag('tag42', 'tag43');
309 $this->assertEquals(['tag43', 'tag2', 'table'], $bookmark->getTags());
310 $bookmark->renameTag('table', 'desk');
311 $this->assertEquals(['tag43', 'tag2', 'desk'], $bookmark->getTags());
315 * Test renameTag() with a tag that is not present in the bookmark
317 public function testRenameTagNotExists()
319 $bookmark = new Bookmark();
320 $bookmark->setTags(['tag1', 'tag2', 'chair']);
321 $bookmark->renameTag('nope', 'table');
322 $this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
328 public function testDeleteTag()
330 $bookmark = new Bookmark();
331 $bookmark->setTags(['tag1', 'tag2', 'chair']);
332 $bookmark->deleteTag('chair');
333 $this->assertEquals(['tag1', 'tag2'], $bookmark->getTags());
334 $bookmark->deleteTag('tag1');
335 $this->assertEquals(['tag2'], $bookmark->getTags());
336 $bookmark->deleteTag('tag2');
337 $this->assertEquals([], $bookmark->getTags());
341 * Test deleteTag() with a tag that is not present in the bookmark
343 public function testDeleteTagNotExists()
345 $bookmark = new Bookmark();
346 $bookmark->setTags(['tag1', 'tag2', 'chair']);
347 $bookmark->deleteTag('nope');
348 $this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
352 * Test shouldUpdateThumbnail() with bookmarks needing an update.
354 public function testShouldUpdateThumbnail(): void
356 $bookmark = (new Bookmark())->setUrl('http://domain.tld/with-image');
358 static::assertTrue($bookmark->shouldUpdateThumbnail());
360 $bookmark = (new Bookmark())
361 ->setUrl('http://domain.tld/with-image')
362 ->setThumbnail('unknown file')
365 static::assertTrue($bookmark->shouldUpdateThumbnail());
369 * Test shouldUpdateThumbnail() with bookmarks that should not update.
371 public function testShouldNotUpdateThumbnail(): void
373 $bookmark = (new Bookmark());
375 static::assertFalse($bookmark->shouldUpdateThumbnail());
377 $bookmark = (new Bookmark())
378 ->setUrl('ftp://domain.tld/other-protocol', ['ftp'])
381 static::assertFalse($bookmark->shouldUpdateThumbnail());
383 $bookmark = (new Bookmark())
384 ->setUrl('http://domain.tld/with-image')
385 ->setThumbnail(__FILE__
)
388 static::assertFalse($bookmark->shouldUpdateThumbnail());
390 $bookmark = (new Bookmark())->setUrl('/shaare/abcdef');
392 static::assertFalse($bookmark->shouldUpdateThumbnail());