3 namespace Shaarli\Bookmark
;
6 use PHPUnit\Framework\TestCase
;
8 use Shaarli\Config\ConfigManager
;
12 * Class BookmarkFilterTest.
14 class BookmarkFilterTest
extends TestCase
17 * @var string Test datastore path.
19 protected static $testDatastore = 'sandbox/datastore.php';
21 * @var BookmarkFilter instance.
23 protected static $linkFilter;
26 * @var ReferenceLinkDB instance
28 protected static $refDB;
31 * @var BookmarkFileService instance
33 protected static $bookmarkService;
36 * Instantiate linkFilter with ReferenceLinkDB data.
38 public static function setUpBeforeClass(): void
40 $conf = new ConfigManager('tests/utils/config/configJson');
41 $conf->set('resource.datastore', self
::$testDatastore);
42 self
::$refDB = new \
ReferenceLinkDB();
43 self
::$refDB->write(self
::$testDatastore);
44 $history = new History('sandbox/history.php');
45 self
::$bookmarkService = new \
FakeBookmarkService($conf, $history, true);
46 self
::$linkFilter = new BookmarkFilter(self
::$bookmarkService->getBookmarks());
52 public function testFilter()
55 self
::$refDB->countLinks(),
56 count(self
::$linkFilter->filter('', ''))
60 self
::$refDB->countLinks(),
61 count(self
::$linkFilter->filter('', '', 'all'))
65 self
::$refDB->countLinks(),
66 count(self
::$linkFilter->filter('', '', 'randomstr'))
71 self
::$refDB->countPrivateLinks(),
72 count(self
::$linkFilter->filter('', '', false, 'private'))
77 self
::$refDB->countPublicLinks(),
78 count(self
::$linkFilter->filter('', '', false, 'public'))
82 ReferenceLinkDB
::$NB_LINKS_TOTAL,
83 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, ''))
87 self
::$refDB->countUntaggedLinks(),
89 self
::$linkFilter->filter(
90 BookmarkFilter
::$FILTER_TAG,
104 ReferenceLinkDB
::$NB_LINKS_TOTAL,
105 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, ''))
110 * Filter bookmarks using a tag
112 public function testFilterOneTag()
116 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false))
121 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'all'))
126 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
132 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'private'))
138 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'public'))
143 * Filter bookmarks using a tag - case-sensitive
145 public function testFilterCaseSensitiveTag()
149 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'mercurial', true))
154 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'Mercurial', true))
159 * Filter bookmarks using a tag combination
161 public function testFilterMultipleTags()
165 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'dev cartoon', false))
170 * Filter bookmarks using a non-existent tag
172 public function testFilterUnknownTag()
176 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'null', false))
181 * Return bookmarks for a given day
183 public function testFilterDay()
187 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20121206'))
192 * Return bookmarks for a given day
194 public function testFilterDayRestrictedVisibility(): void
198 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20121206', false, BookmarkFilter
::$PUBLIC))
203 * 404 - day not found
205 public function testFilterUnknownDay()
209 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '19700101'))
214 * Use an invalid date format
215 * @expectedException Exception
216 * @expectedExceptionMessageRegExp /Invalid date format/
218 public function testFilterInvalidDayWithChars()
220 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, 'Rainy day, dream away');
224 * Use an invalid date format
225 * @expectedException Exception
226 * @expectedExceptionMessageRegExp /Invalid date format/
228 public function testFilterInvalidDayDigits()
230 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20');
234 * Retrieve a link entry with its hash
236 public function testFilterSmallHash()
238 $links = self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'IuWvgA');
247 $links[7]->getTitle()
252 * No link for this hash
254 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
256 public function testFilterUnknownSmallHash()
258 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'Iblaah');
262 * Full-text search - no result found.
264 public function testFilterFullTextNoResult()
268 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'azertyuiop'))
273 * Full-text search - result from a link's URL
275 public function testFilterFullTextURL()
279 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
284 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars org'))
289 * Full-text search - result from a link's title only
291 public function testFilterFullTextTitle()
293 // use miscellaneous cases
296 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'userfriendly -'))
300 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'UserFriendly -'))
304 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
307 // use miscellaneous case and offset
310 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'RFrIendL'))
315 * Full-text search - result from the link's description only
317 public function testFilterFullTextDescription()
321 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'publishing media'))
326 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'mercurial w3c'))
331 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '"free software"'))
336 * Full-text search - result from the link's tags only
338 public function testFilterFullTextTags()
342 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web'))
347 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'all'))
352 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'bla'))
358 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'private'))
364 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'public'))
369 * Full-text search - result set from mixed sources
371 public function testFilterFullTextMixed()
375 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free software'))
380 * Full-text search - test exclusion with '-'.
382 public function testExcludeSearch()
386 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free -gnu'))
390 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
391 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '-revolution'))
396 * Full-text search - test AND, exact terms and exclusion combined, across fields.
398 public function testMultiSearch()
402 count(self
::$linkFilter->filter(
403 BookmarkFilter
::$FILTER_TEXT,
404 '"Free Software " stallman "read this" @website stuff'
410 count(self
::$linkFilter->filter(
411 BookmarkFilter
::$FILTER_TEXT,
412 '"free software " stallman "read this" -beard @website stuff'
418 * Full-text search - make sure that exact search won't work across fields.
420 public function testSearchExactTermMultiFieldsKo()
424 count(self
::$linkFilter->filter(
425 BookmarkFilter
::$FILTER_TEXT,
432 count(self
::$linkFilter->filter(
433 BookmarkFilter
::$FILTER_TEXT,
440 * Tag search with exclusion.
442 public function testTagFilterWithExclusion()
446 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'gnu -free'))
450 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
451 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, '-free'))
456 * Test crossed search (terms + tags).
458 public function testFilterCrossedSearch()
460 $terms = '"Free Software " stallman "read this" @website stuff';
464 count(self
::$linkFilter->filter(
465 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
471 count(self
::$linkFilter->filter(
472 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
478 count(self
::$linkFilter->filter(
479 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
480 array(false, 'PSR-2')
485 count(self
::$linkFilter->filter(
486 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
491 ReferenceLinkDB
::$NB_LINKS_TOTAL,
492 count(self
::$linkFilter->filter(
493 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
500 * Filter bookmarks by #hashtag.
502 public function testFilterByHashtag()
504 $hashtag = 'hashtag';
507 count(self
::$linkFilter->filter(
508 BookmarkFilter
::$FILTER_TAG,
513 $hashtag = 'private';
516 count(self
::$linkFilter->filter(
517 BookmarkFilter
::$FILTER_TAG,