3 namespace Shaarli\Bookmark
;
6 use malkusch\lock\mutex\NoMutex
;
8 use Shaarli\Config\ConfigManager
;
13 * Class BookmarkFilterTest.
15 class BookmarkFilterTest
extends TestCase
18 * @var string Test datastore path.
20 protected static $testDatastore = 'sandbox/datastore.php';
22 * @var BookmarkFilter instance.
24 protected static $linkFilter;
27 * @var ReferenceLinkDB instance
29 protected static $refDB;
32 * @var BookmarkFileService instance
34 protected static $bookmarkService;
37 * Instantiate linkFilter with ReferenceLinkDB data.
39 public static function setUpBeforeClass(): void
41 $mutex = new NoMutex();
42 $conf = new ConfigManager('tests/utils/config/configJson');
43 $conf->set('resource.datastore', self
::$testDatastore);
44 self
::$refDB = new \
ReferenceLinkDB();
45 self
::$refDB->write(self
::$testDatastore);
46 $history = new History('sandbox/history.php');
47 self
::$bookmarkService = new \
FakeBookmarkService($conf, $history, $mutex, true);
48 self
::$linkFilter = new BookmarkFilter(self
::$bookmarkService->getBookmarks());
54 public function testFilter()
57 self
::$refDB->countLinks(),
58 count(self
::$linkFilter->filter('', ''))
62 self
::$refDB->countLinks(),
63 count(self
::$linkFilter->filter('', '', 'all'))
67 self
::$refDB->countLinks(),
68 count(self
::$linkFilter->filter('', '', 'randomstr'))
73 self
::$refDB->countPrivateLinks(),
74 count(self
::$linkFilter->filter('', '', false, 'private'))
79 self
::$refDB->countPublicLinks(),
80 count(self
::$linkFilter->filter('', '', false, 'public'))
84 ReferenceLinkDB
::$NB_LINKS_TOTAL,
85 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, ''))
89 self
::$refDB->countUntaggedLinks(),
91 self
::$linkFilter->filter(
92 BookmarkFilter
::$FILTER_TAG,
106 ReferenceLinkDB
::$NB_LINKS_TOTAL,
107 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, ''))
112 * Filter bookmarks using a tag
114 public function testFilterOneTag()
118 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false))
123 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'all'))
128 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
134 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'private'))
140 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'public'))
145 * Filter bookmarks using a tag - case-sensitive
147 public function testFilterCaseSensitiveTag()
151 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'mercurial', true))
156 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'Mercurial', true))
161 * Filter bookmarks using a tag combination
163 public function testFilterMultipleTags()
167 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'dev cartoon', false))
172 * Filter bookmarks using a non-existent tag
174 public function testFilterUnknownTag()
178 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'null', false))
183 * Return bookmarks for a given day
185 public function testFilterDay()
189 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20121206'))
194 * Return bookmarks for a given day
196 public function testFilterDayRestrictedVisibility(): void
200 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20121206', false, BookmarkFilter
::$PUBLIC))
205 * 404 - day not found
207 public function testFilterUnknownDay()
211 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '19700101'))
216 * Use an invalid date format
218 public function testFilterInvalidDayWithChars()
220 $this->expectException(\Exception
::class);
221 $this->expectExceptionMessageRegExp('/Invalid date format/');
223 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, 'Rainy day, dream away');
227 * Use an invalid date format
229 public function testFilterInvalidDayDigits()
231 $this->expectException(\Exception
::class);
232 $this->expectExceptionMessageRegExp('/Invalid date format/');
234 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20');
238 * Retrieve a link entry with its hash
240 public function testFilterSmallHash()
242 $links = self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'IuWvgA');
251 $links[7]->getTitle()
256 * No link for this hash
258 public function testFilterUnknownSmallHash()
260 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException
::class);
262 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'Iblaah');
266 * Full-text search - no result found.
268 public function testFilterFullTextNoResult()
272 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'azertyuiop'))
277 * Full-text search - result from a link's URL
279 public function testFilterFullTextURL()
283 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
288 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars org'))
293 * Full-text search - result from a link's title only
295 public function testFilterFullTextTitle()
297 // use miscellaneous cases
300 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'userfriendly -'))
304 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'UserFriendly -'))
308 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
311 // use miscellaneous case and offset
314 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'RFrIendL'))
319 * Full-text search - result from the link's description only
321 public function testFilterFullTextDescription()
325 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'publishing media'))
330 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'mercurial w3c'))
335 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '"free software"'))
340 * Full-text search - result from the link's tags only
342 public function testFilterFullTextTags()
346 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web'))
351 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'all'))
356 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'bla'))
362 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'private'))
368 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'public'))
373 * Full-text search - result set from mixed sources
375 public function testFilterFullTextMixed()
379 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free software'))
384 * Full-text search - test exclusion with '-'.
386 public function testExcludeSearch()
390 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free -gnu'))
394 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
395 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '-revolution'))
400 * Full-text search - test AND, exact terms and exclusion combined, across fields.
402 public function testMultiSearch()
406 count(self
::$linkFilter->filter(
407 BookmarkFilter
::$FILTER_TEXT,
408 '"Free Software " stallman "read this" @website stuff'
414 count(self
::$linkFilter->filter(
415 BookmarkFilter
::$FILTER_TEXT,
416 '"free software " stallman "read this" -beard @website stuff'
422 * Full-text search - make sure that exact search won't work across fields.
424 public function testSearchExactTermMultiFieldsKo()
428 count(self
::$linkFilter->filter(
429 BookmarkFilter
::$FILTER_TEXT,
436 count(self
::$linkFilter->filter(
437 BookmarkFilter
::$FILTER_TEXT,
444 * Tag search with exclusion.
446 public function testTagFilterWithExclusion()
450 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'gnu -free'))
454 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
455 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, '-free'))
460 * Test crossed search (terms + tags).
462 public function testFilterCrossedSearch()
464 $terms = '"Free Software " stallman "read this" @website stuff';
468 count(self
::$linkFilter->filter(
469 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
475 count(self
::$linkFilter->filter(
476 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
482 count(self
::$linkFilter->filter(
483 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
484 array(false, 'PSR-2')
489 count(self
::$linkFilter->filter(
490 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
495 ReferenceLinkDB
::$NB_LINKS_TOTAL,
496 count(self
::$linkFilter->filter(
497 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
504 * Filter bookmarks by #hashtag.
506 public function testFilterByHashtag()
508 $hashtag = 'hashtag';
511 count(self
::$linkFilter->filter(
512 BookmarkFilter
::$FILTER_TAG,
517 $hashtag = 'private';
520 count(self
::$linkFilter->filter(
521 BookmarkFilter
::$FILTER_TAG,