3 namespace Shaarli\Bookmark
;
7 use Shaarli\Legacy\LegacyLinkDB
;
8 use Shaarli\Legacy\LegacyLinkFilter
;
11 * Class LegacyLinkFilterTest.
13 class LegacyLinkFilterTest
extends \PHPUnit\Framework\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()
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
200 * @expectedException Exception
201 * @expectedExceptionMessageRegExp /Invalid date format/
203 public function testFilterInvalidDayWithChars()
205 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
209 * Use an invalid date format
210 * @expectedException Exception
211 * @expectedExceptionMessageRegExp /Invalid date format/
213 public function testFilterInvalidDayDigits()
215 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_DAY, '20');
219 * Retrieve a link entry with its hash
221 public function testFilterSmallHash()
223 $links = self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_HASH, 'IuWvgA');
237 * No link for this hash
239 * @expectedException \Shaarli\Bookmark\Exception\BookmarkNotFoundException
241 public function testFilterUnknownSmallHash()
243 self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_HASH, 'Iblaah');
247 * Full-text search - no result found.
249 public function testFilterFullTextNoResult()
253 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'azertyuiop'))
258 * Full-text search - result from a link's URL
260 public function testFilterFullTextURL()
264 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
269 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'ars org'))
274 * Full-text search - result from a link's title only
276 public function testFilterFullTextTitle()
278 // use miscellaneous cases
281 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'userfriendly -'))
285 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
289 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
292 // use miscellaneous case and offset
295 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'RFrIendL'))
300 * Full-text search - result from the link's description only
302 public function testFilterFullTextDescription()
306 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'publishing media'))
311 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
316 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, '"free software"'))
321 * Full-text search - result from the link's tags only
323 public function testFilterFullTextTags()
327 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web'))
332 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', 'all'))
337 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', 'bla'))
343 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
349 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
354 * Full-text search - result set from mixed sources
356 public function testFilterFullTextMixed()
360 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'free software'))
365 * Full-text search - test exclusion with '-'.
367 public function testExcludeSearch()
371 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, 'free -gnu'))
375 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
376 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TEXT, '-revolution'))
381 * Full-text search - test AND, exact terms and exclusion combined, across fields.
383 public function testMultiSearch()
387 count(self
::$linkFilter->filter(
388 LegacyLinkFilter
::$FILTER_TEXT,
389 '"Free Software " stallman "read this" @website stuff'
395 count(self
::$linkFilter->filter(
396 LegacyLinkFilter
::$FILTER_TEXT,
397 '"free software " stallman "read this" -beard @website stuff'
403 * Full-text search - make sure that exact search won't work across fields.
405 public function testSearchExactTermMultiFieldsKo()
409 count(self
::$linkFilter->filter(
410 LegacyLinkFilter
::$FILTER_TEXT,
417 count(self
::$linkFilter->filter(
418 LegacyLinkFilter
::$FILTER_TEXT,
425 * Tag search with exclusion.
427 public function testTagFilterWithExclusion()
431 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, 'gnu -free'))
435 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
436 count(self
::$linkFilter->filter(LegacyLinkFilter
::$FILTER_TAG, '-free'))
441 * Test crossed search (terms + tags).
443 public function testFilterCrossedSearch()
445 $terms = '"Free Software " stallman "read this" @website stuff';
449 count(self
::$linkFilter->filter(
450 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
456 count(self
::$linkFilter->filter(
457 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
463 count(self
::$linkFilter->filter(
464 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
465 array(false, 'PSR-2')
470 count(self
::$linkFilter->filter(
471 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
476 ReferenceLinkDB
::$NB_LINKS_TOTAL,
477 count(self
::$linkFilter->filter(
478 LegacyLinkFilter
::$FILTER_TAG | LegacyLinkFilter
::$FILTER_TEXT,
485 * Filter bookmarks by #hashtag.
487 public function testFilterByHashtag()
489 $hashtag = 'hashtag';
492 count(self
::$linkFilter->filter(
493 LegacyLinkFilter
::$FILTER_TAG,
498 $hashtag = 'private';
501 count(self
::$linkFilter->filter(
502 LegacyLinkFilter
::$FILTER_TAG,