3 namespace Shaarli\Bookmark
;
7 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
216 public function testFilterInvalidDayWithChars()
218 $this->expectException(\Exception
::class);
219 $this->expectExceptionMessageRegExp('/Invalid date format/');
221 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, 'Rainy day, dream away');
225 * Use an invalid date format
227 public function testFilterInvalidDayDigits()
229 $this->expectException(\Exception
::class);
230 $this->expectExceptionMessageRegExp('/Invalid date format/');
232 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20');
236 * Retrieve a link entry with its hash
238 public function testFilterSmallHash()
240 $links = self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'IuWvgA');
249 $links[7]->getTitle()
254 * No link for this hash
256 public function testFilterUnknownSmallHash()
258 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException
::class);
260 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'Iblaah');
264 * Full-text search - no result found.
266 public function testFilterFullTextNoResult()
270 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'azertyuiop'))
275 * Full-text search - result from a link's URL
277 public function testFilterFullTextURL()
281 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
286 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars org'))
291 * Full-text search - result from a link's title only
293 public function testFilterFullTextTitle()
295 // use miscellaneous cases
298 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'userfriendly -'))
302 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'UserFriendly -'))
306 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
309 // use miscellaneous case and offset
312 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'RFrIendL'))
317 * Full-text search - result from the link's description only
319 public function testFilterFullTextDescription()
323 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'publishing media'))
328 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'mercurial w3c'))
333 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '"free software"'))
338 * Full-text search - result from the link's tags only
340 public function testFilterFullTextTags()
344 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web'))
349 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'all'))
354 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'bla'))
360 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'private'))
366 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'public'))
371 * Full-text search - result set from mixed sources
373 public function testFilterFullTextMixed()
377 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free software'))
382 * Full-text search - test exclusion with '-'.
384 public function testExcludeSearch()
388 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free -gnu'))
392 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
393 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '-revolution'))
398 * Full-text search - test AND, exact terms and exclusion combined, across fields.
400 public function testMultiSearch()
404 count(self
::$linkFilter->filter(
405 BookmarkFilter
::$FILTER_TEXT,
406 '"Free Software " stallman "read this" @website stuff'
412 count(self
::$linkFilter->filter(
413 BookmarkFilter
::$FILTER_TEXT,
414 '"free software " stallman "read this" -beard @website stuff'
420 * Full-text search - make sure that exact search won't work across fields.
422 public function testSearchExactTermMultiFieldsKo()
426 count(self
::$linkFilter->filter(
427 BookmarkFilter
::$FILTER_TEXT,
434 count(self
::$linkFilter->filter(
435 BookmarkFilter
::$FILTER_TEXT,
442 * Tag search with exclusion.
444 public function testTagFilterWithExclusion()
448 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'gnu -free'))
452 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
453 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, '-free'))
458 * Test crossed search (terms + tags).
460 public function testFilterCrossedSearch()
462 $terms = '"Free Software " stallman "read this" @website stuff';
466 count(self
::$linkFilter->filter(
467 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
473 count(self
::$linkFilter->filter(
474 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
480 count(self
::$linkFilter->filter(
481 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
482 array(false, 'PSR-2')
487 count(self
::$linkFilter->filter(
488 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
493 ReferenceLinkDB
::$NB_LINKS_TOTAL,
494 count(self
::$linkFilter->filter(
495 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
502 * Filter bookmarks by #hashtag.
504 public function testFilterByHashtag()
506 $hashtag = 'hashtag';
509 count(self
::$linkFilter->filter(
510 BookmarkFilter
::$FILTER_TAG,
515 $hashtag = 'private';
518 count(self
::$linkFilter->filter(
519 BookmarkFilter
::$FILTER_TAG,