3 namespace Shaarli\Bookmark
;
5 use malkusch\lock\mutex\NoMutex
;
7 use Shaarli\Config\ConfigManager
;
9 use Shaarli\Plugin\PluginManager
;
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;
36 /** @var PluginManager */
37 protected static $pluginManager;
40 * Instantiate linkFilter with ReferenceLinkDB data.
42 public static function setUpBeforeClass(): void
45 $mutex = new NoMutex();
46 $conf = new ConfigManager('tests/utils/config/configJson');
47 $conf->set('resource.datastore', self
::$testDatastore);
48 static::$pluginManager = new PluginManager($conf);
49 self
::$refDB = new \
ReferenceLinkDB();
50 self
::$refDB->write(self
::$testDatastore);
51 $history = new History('sandbox/history.php');
52 self
::$bookmarkService = new \
FakeBookmarkService($conf, static::$pluginManager, $history, $mutex, true);
53 self
::$linkFilter = new BookmarkFilter(self
::$bookmarkService->getBookmarks(), $conf, static::$pluginManager);
59 public function testFilter()
62 self
::$refDB->countLinks(),
63 count(self
::$linkFilter->filter('', ''))
67 self
::$refDB->countLinks(),
68 count(self
::$linkFilter->filter('', '', 'all'))
72 self
::$refDB->countLinks(),
73 count(self
::$linkFilter->filter('', '', 'randomstr'))
78 self
::$refDB->countPrivateLinks(),
79 count(self
::$linkFilter->filter('', '', false, 'private'))
84 self
::$refDB->countPublicLinks(),
85 count(self
::$linkFilter->filter('', '', false, 'public'))
89 ReferenceLinkDB
::$NB_LINKS_TOTAL,
90 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, ''))
94 self
::$refDB->countUntaggedLinks(),
96 self
::$linkFilter->filter(
97 BookmarkFilter
::$FILTER_TAG,
111 ReferenceLinkDB
::$NB_LINKS_TOTAL,
112 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, ''))
117 * Filter bookmarks using a tag
119 public function testFilterOneTag()
123 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false))
128 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'all'))
133 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
139 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'private'))
145 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'public'))
150 * Filter bookmarks using a tag - case-sensitive
152 public function testFilterCaseSensitiveTag()
156 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'mercurial', true))
161 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'Mercurial', true))
166 * Filter bookmarks using a tag combination
168 public function testFilterMultipleTags()
172 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'dev cartoon', false))
177 * Filter bookmarks using a non-existent tag
179 public function testFilterUnknownTag()
183 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'null', false))
188 * Retrieve a link entry with its hash
190 public function testFilterSmallHash()
192 $links = self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'IuWvgA');
201 $links[7]->getTitle()
206 * No link for this hash
208 public function testFilterUnknownSmallHash()
210 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException
::class);
212 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'Iblaah');
216 * Full-text search - no result found.
218 public function testFilterFullTextNoResult()
222 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'azertyuiop'))
227 * Full-text search - result from a link's URL
229 public function testFilterFullTextURL()
233 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
238 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars org'))
243 * Full-text search - result from a link's title only
245 public function testFilterFullTextTitle()
247 // use miscellaneous cases
250 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'userfriendly -'))
254 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'UserFriendly -'))
258 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
261 // use miscellaneous case and offset
264 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'RFrIendL'))
269 * Full-text search - result from the link's description only
271 public function testFilterFullTextDescription()
275 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'publishing media'))
280 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'mercurial w3c'))
285 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '"free software"'))
290 * Full-text search - result from the link's tags only
292 public function testFilterFullTextTags()
296 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web'))
301 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'all'))
306 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'bla'))
312 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'private'))
318 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'public'))
323 * Full-text search - result set from mixed sources
325 public function testFilterFullTextMixed()
329 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free software'))
334 * Full-text search - test exclusion with '-'.
336 public function testExcludeSearch()
340 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free -gnu'))
344 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
345 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '-revolution'))
350 * Full-text search - test AND, exact terms and exclusion combined, across fields.
352 public function testMultiSearch()
356 count(self
::$linkFilter->filter(
357 BookmarkFilter
::$FILTER_TEXT,
358 '"Free Software " stallman "read this" @website stuff'
364 count(self
::$linkFilter->filter(
365 BookmarkFilter
::$FILTER_TEXT,
366 '"free software " stallman "read this" -beard @website stuff'
372 * Full-text search - make sure that exact search won't work across fields.
374 public function testSearchExactTermMultiFieldsKo()
378 count(self
::$linkFilter->filter(
379 BookmarkFilter
::$FILTER_TEXT,
386 count(self
::$linkFilter->filter(
387 BookmarkFilter
::$FILTER_TEXT,
394 * Tag search with exclusion.
396 public function testTagFilterWithExclusion()
400 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'gnu -free'))
404 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
405 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, '-free'))
410 * Test crossed search (terms + tags).
412 public function testFilterCrossedSearch()
414 $terms = '"Free Software " stallman "read this" @website stuff';
418 count(self
::$linkFilter->filter(
419 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
425 count(self
::$linkFilter->filter(
426 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
432 count(self
::$linkFilter->filter(
433 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
434 array(false, 'PSR-2')
439 count(self
::$linkFilter->filter(
440 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
445 ReferenceLinkDB
::$NB_LINKS_TOTAL,
446 count(self
::$linkFilter->filter(
447 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
454 * Filter bookmarks by #hashtag.
456 public function testFilterByHashtag()
458 $hashtag = 'hashtag';
461 count(self
::$linkFilter->filter(
462 BookmarkFilter
::$FILTER_TAG,
467 $hashtag = 'private';
470 count(self
::$linkFilter->filter(
471 BookmarkFilter
::$FILTER_TAG,
480 * Test search result highlights in every field of bookmark reference #9.
482 public function testFullTextSearchHighlight(): void
484 $bookmarks = self
::$linkFilter->filter(
485 BookmarkFilter
::$FILTER_TEXT,
486 '"psr-2" coding guide http fig "psr-2/" "This guide" basic standard. coding-style quality assurance'
489 static::assertCount(1, $bookmarks);
490 static::assertArrayHasKey(9, $bookmarks);
492 $bookmark = $bookmarks[9];
493 $expectedHighlights = [
495 ['start' => 0, 'end' => 5], // "psr-2"
496 ['start' => 7, 'end' => 13], // coding
497 ['start' => 20, 'end' => 25], // guide
500 ['start' => 0, 'end' => 10], // "This guide"
501 ['start' => 45, 'end' => 50], // basic
502 ['start' => 58, 'end' => 67], // standard.
505 ['start' => 0, 'end' => 4], // http
506 ['start' => 15, 'end' => 18], // fig
507 ['start' => 27, 'end' => 33], // "psr-2/"
510 ['start' => 0, 'end' => 12], // coding-style
511 ['start' => 23, 'end' => 30], // quality
512 ['start' => 31, 'end' => 40], // assurance
515 static::assertSame($expectedHighlights, $bookmark->getAdditionalContentEntry('search_highlight'));