3 namespace Shaarli\Bookmark
;
7 use Shaarli\Legacy\LegacyLinkDB
;
8 use Shaarli\Legacy\LegacyLinkFilter
;
11 * Class LegacyLinkFilterTest.
13 class LegacyLinkFilterTest
extends \Shaarli\TestCase
16 * @var string Test datastore path.
18 protected static $testDatastore = 'sandbox/datastore.php';
20 * @var BookmarkFilter instance.
22 protected static $linkFilter;
25 * @var ReferenceLinkDB instance
27 protected static $refDB;
30 * @var LegacyLinkDB instance
32 protected static $linkDB;
35 * Instantiate linkFilter with ReferenceLinkDB data.
37 public static function setUpBeforeClass(): void
39 self
::$refDB = new ReferenceLinkDB(true);
40 self
::$refDB->write(self
::$testDatastore);
41 self
::$linkDB = new LegacyLinkDB(self
::$testDatastore, true, false);
42 self
::$linkFilter = new LegacyLinkFilter(self
::$linkDB);
48 public function testFilter()
51 self
::$refDB->countLinks(),
52 count(self
::$linkFilter->filter('', ''))
56 self
::$refDB->countLinks(),
57 count(self
::$linkFilter->filter('', '', 'all'))
61 self
::$refDB->countLinks(),
62 count(self
::$linkFilter->filter('', '', 'randomstr'))
67 self
::$refDB->countPrivateLinks(),
68 count(self
::$linkFilter->filter('', '', false, 'private'))
73 self
::$refDB->countPublicLinks(),
74 count(self
::$linkFilter->filter('', '', false, 'public'))
78 ReferenceLinkDB
::$NB_LINKS_TOTAL,
79 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, ''))
83 self
::$refDB->countUntaggedLinks(),
85 self
::$linkFilter->filter(
86 LegacyLinkFilter
::$FILTER_TAG,
100 ReferenceLinkDB
::$NB_LINKS_TOTAL,
101 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, ''))
106 * Filter bookmarks using a tag
108 public function testFilterOneTag()
112 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'web', false))
117 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'web', false, 'all'))
122 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
128 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'web', false, 'private'))
134 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'web', false, 'public'))
139 * Filter bookmarks using a tag - case-sensitive
141 public function testFilterCaseSensitiveTag()
145 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'mercurial', true))
150 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'Mercurial', true))
155 * Filter bookmarks using a tag combination
157 public function testFilterMultipleTags()
161 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'dev cartoon', false))
166 * Filter bookmarks using a non-existent tag
168 public function testFilterUnknownTag()
172 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'null', false))
177 * Return bookmarks for a given day
179 public function testFilterDay()
183 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, '20121206'))
188 * 404 - day not found
190 public function testFilterUnknownDay()
194 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, '19700101'))
199 * Use an invalid date format
201 public function testFilterInvalidDayWithChars()
203 $this->expectException(\Exception
::class);
204 $this->expectExceptionMessageRegExp('/Invalid date format/');
206 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
210 * Use an invalid date format
212 public function testFilterInvalidDayDigits()
214 $this->expectException(\Exception
::class);
215 $this->expectExceptionMessageRegExp('/Invalid date format/');
217 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, '20');
221 * Retrieve a link entry with its hash
223 public function testFilterSmallHash()
225 $links = self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_HASH, 'IuWvgA');
239 * No link for this hash
241 public function testFilterUnknownSmallHash()
243 $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException
::class);
245 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_HASH, 'Iblaah');
249 * Full-text search - no result found.
251 public function testFilterFullTextNoResult()
255 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'azertyuiop'))
260 * Full-text search - result from a link's URL
262 public function testFilterFullTextURL()
266 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
271 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'ars org'))
276 * Full-text search - result from a link's title only
278 public function testFilterFullTextTitle()
280 // use miscellaneous cases
283 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'userfriendly -'))
287 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
291 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
294 // use miscellaneous case and offset
297 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'RFrIendL'))
302 * Full-text search - result from the link's description only
304 public function testFilterFullTextDescription()
308 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'publishing media'))
313 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
318 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, '"free software"'))
323 * Full-text search - result from the link's tags only
325 public function testFilterFullTextTags()
329 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web'))
334 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', 'all'))
339 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', 'bla'))
345 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
351 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
356 * Full-text search - result set from mixed sources
358 public function testFilterFullTextMixed()
362 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'free software'))
367 * Full-text search - test exclusion with '-'.
369 public function testExcludeSearch()
373 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'free -gnu'))
377 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
378 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, '-revolution'))
383 * Full-text search - test AND, exact terms and exclusion combined, across fields.
385 public function testMultiSearch()
389 count(self
::$linkFilter->filter(
390 LegacyLinkFilter
::$FILTER_TEXT,
391 '"Free Software " stallman "read this" @website stuff'
397 count(self
::$linkFilter->filter(
398 LegacyLinkFilter
::$FILTER_TEXT,
399 '"free software " stallman "read this" -beard @website stuff'
405 * Full-text search - make sure that exact search won't work across fields.
407 public function testSearchExactTermMultiFieldsKo()
411 count(self
::$linkFilter->filter(
412 LegacyLinkFilter
::$FILTER_TEXT,
419 count(self
::$linkFilter->filter(
420 LegacyLinkFilter
::$FILTER_TEXT,
427 * Tag search with exclusion.
429 public function testTagFilterWithExclusion()
433 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'gnu -free'))
437 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
438 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, '-free'))
443 * Test crossed search (terms + tags).
445 public function testFilterCrossedSearch()
447 $terms = '"Free Software " stallman "read this" @website stuff';
451 count(self
::$linkFilter->filter(
452 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
458 count(self
::$linkFilter->filter(
459 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
465 count(self
::$linkFilter->filter(
466 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
467 array(false, 'PSR-2')
472 count(self
::$linkFilter->filter(
473 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
478 ReferenceLinkDB
::$NB_LINKS_TOTAL,
479 count(self
::$linkFilter->filter(
480 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
487 * Filter bookmarks by #hashtag.
489 public function testFilterByHashtag()
491 $hashtag = 'hashtag';
494 count(self
::$linkFilter->filter(
495 LegacyLinkFilter
::$FILTER_TAG,
500 $hashtag = 'private';
503 count(self
::$linkFilter->filter(
504 LegacyLinkFilter
::$FILTER_TAG,