3 namespace Shaarli\Bookmark
;
6 use PHPUnit\Framework\TestCase
;
8 use Shaarli\Config\ConfigManager
;
9 use Shaarli\Formatter\FormatterFactory
;
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()
41 $conf = new ConfigManager('tests/utils/config/configJson');
42 $conf->set('resource.datastore', self
::$testDatastore);
43 self
::$refDB = new \
ReferenceLinkDB();
44 self
::$refDB->write(self
::$testDatastore);
45 $history = new History('sandbox/history.php');
46 self
::$bookmarkService = new \
FakeBookmarkService($conf, $history, true);
47 self
::$linkFilter = new BookmarkFilter(self
::$bookmarkService->getBookmarks());
53 public function testFilter()
56 self
::$refDB->countLinks(),
57 count(self
::$linkFilter->filter('', ''))
61 self
::$refDB->countLinks(),
62 count(self
::$linkFilter->filter('', '', 'all'))
66 self
::$refDB->countLinks(),
67 count(self
::$linkFilter->filter('', '', 'randomstr'))
72 self
::$refDB->countPrivateLinks(),
73 count(self
::$linkFilter->filter('', '', false, 'private'))
78 self
::$refDB->countPublicLinks(),
79 count(self
::$linkFilter->filter('', '', false, 'public'))
83 ReferenceLinkDB
::$NB_LINKS_TOTAL,
84 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, ''))
88 self
::$refDB->countUntaggedLinks(),
90 self
::$linkFilter->filter(
91 BookmarkFilter
::$FILTER_TAG,
105 ReferenceLinkDB
::$NB_LINKS_TOTAL,
106 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, ''))
111 * Filter bookmarks using a tag
113 public function testFilterOneTag()
117 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false))
122 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'all'))
127 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
133 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'private'))
139 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'web', false, 'public'))
144 * Filter bookmarks using a tag - case-sensitive
146 public function testFilterCaseSensitiveTag()
150 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'mercurial', true))
155 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'Mercurial', true))
160 * Filter bookmarks using a tag combination
162 public function testFilterMultipleTags()
166 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'dev cartoon', false))
171 * Filter bookmarks using a non-existent tag
173 public function testFilterUnknownTag()
177 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'null', false))
182 * Return bookmarks for a given day
184 public function testFilterDay()
188 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20121206'))
193 * 404 - day not found
195 public function testFilterUnknownDay()
199 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '19700101'))
204 * Use an invalid date format
205 * @expectedException Exception
206 * @expectedExceptionMessageRegExp /Invalid date format/
208 public function testFilterInvalidDayWithChars()
210 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, 'Rainy day, dream away');
214 * Use an invalid date format
215 * @expectedException Exception
216 * @expectedExceptionMessageRegExp /Invalid date format/
218 public function testFilterInvalidDayDigits()
220 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_DAY, '20');
224 * Retrieve a link entry with its hash
226 public function testFilterSmallHash()
228 $links = self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'IuWvgA');
237 $links[7]->getTitle()
242 * No link for this hash
244 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
246 public function testFilterUnknownSmallHash()
248 self
::$linkFilter->filter(BookmarkFilter
::$FILTER_HASH, 'Iblaah');
252 * Full-text search - no result found.
254 public function testFilterFullTextNoResult()
258 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'azertyuiop'))
263 * Full-text search - result from a link's URL
265 public function testFilterFullTextURL()
269 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
274 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'ars org'))
279 * Full-text search - result from a link's title only
281 public function testFilterFullTextTitle()
283 // use miscellaneous cases
286 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'userfriendly -'))
290 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'UserFriendly -'))
294 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
297 // use miscellaneous case and offset
300 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'RFrIendL'))
305 * Full-text search - result from the link's description only
307 public function testFilterFullTextDescription()
311 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'publishing media'))
316 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'mercurial w3c'))
321 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '"free software"'))
326 * Full-text search - result from the link's tags only
328 public function testFilterFullTextTags()
332 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web'))
337 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'all'))
342 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', 'bla'))
348 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'private'))
354 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'web', false, 'public'))
359 * Full-text search - result set from mixed sources
361 public function testFilterFullTextMixed()
365 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free software'))
370 * Full-text search - test exclusion with '-'.
372 public function testExcludeSearch()
376 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, 'free -gnu'))
380 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
381 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TEXT, '-revolution'))
386 * Full-text search - test AND, exact terms and exclusion combined, across fields.
388 public function testMultiSearch()
392 count(self
::$linkFilter->filter(
393 BookmarkFilter
::$FILTER_TEXT,
394 '"Free Software " stallman "read this" @website stuff'
400 count(self
::$linkFilter->filter(
401 BookmarkFilter
::$FILTER_TEXT,
402 '"free software " stallman "read this" -beard @website stuff'
408 * Full-text search - make sure that exact search won't work across fields.
410 public function testSearchExactTermMultiFieldsKo()
414 count(self
::$linkFilter->filter(
415 BookmarkFilter
::$FILTER_TEXT,
422 count(self
::$linkFilter->filter(
423 BookmarkFilter
::$FILTER_TEXT,
430 * Tag search with exclusion.
432 public function testTagFilterWithExclusion()
436 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, 'gnu -free'))
440 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
441 count(self
::$linkFilter->filter(BookmarkFilter
::$FILTER_TAG, '-free'))
446 * Test crossed search (terms + tags).
448 public function testFilterCrossedSearch()
450 $terms = '"Free Software " stallman "read this" @website stuff';
454 count(self
::$linkFilter->filter(
455 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
461 count(self
::$linkFilter->filter(
462 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
468 count(self
::$linkFilter->filter(
469 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
470 array(false, 'PSR-2')
475 count(self
::$linkFilter->filter(
476 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
481 ReferenceLinkDB
::$NB_LINKS_TOTAL,
482 count(self
::$linkFilter->filter(
483 BookmarkFilter
::$FILTER_TAG | BookmarkFilter
::$FILTER_TEXT,
490 * Filter bookmarks by #hashtag.
492 public function testFilterByHashtag()
494 $hashtag = 'hashtag';
497 count(self
::$linkFilter->filter(
498 BookmarkFilter
::$FILTER_TAG,
503 $hashtag = 'private';
506 count(self
::$linkFilter->filter(
507 BookmarkFilter
::$FILTER_TAG,