3 namespace Shaarli\Bookmark
;
9 * Class LinkFilterTest.
11 class LinkFilterTest
extends \PHPUnit\Framework\TestCase
14 * @var string Test datastore path.
16 protected static $testDatastore = 'sandbox/datastore.php';
18 * @var LinkFilter instance.
20 protected static $linkFilter;
23 * @var ReferenceLinkDB instance
25 protected static $refDB;
28 * @var LinkDB instance
30 protected static $linkDB;
33 * Instantiate linkFilter with ReferenceLinkDB data.
35 public static function setUpBeforeClass()
37 self
::$refDB = new ReferenceLinkDB();
38 self
::$refDB->write(self
::$testDatastore);
39 self
::$linkDB = new LinkDB(self
::$testDatastore, true, false);
40 self
::$linkFilter = new LinkFilter(self
::$linkDB);
46 public function testFilter()
49 self
::$refDB->countLinks(),
50 count(self
::$linkFilter->filter('', ''))
54 self
::$refDB->countLinks(),
55 count(self
::$linkFilter->filter('', '', 'all'))
59 self
::$refDB->countLinks(),
60 count(self
::$linkFilter->filter('', '', 'randomstr'))
65 self
::$refDB->countPrivateLinks(),
66 count(self
::$linkFilter->filter('', '', false, 'private'))
71 self
::$refDB->countPublicLinks(),
72 count(self
::$linkFilter->filter('', '', false, 'public'))
76 ReferenceLinkDB
::$NB_LINKS_TOTAL,
77 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, ''))
81 self
::$refDB->countUntaggedLinks(),
83 self
::$linkFilter->filter(
84 LinkFilter
::$FILTER_TAG,
98 ReferenceLinkDB
::$NB_LINKS_TOTAL,
99 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
104 * Filter links using a tag
106 public function testFilterOneTag()
110 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
115 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
120 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
126 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
132 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
137 * Filter links using a tag - case-sensitive
139 public function testFilterCaseSensitiveTag()
143 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
148 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
153 * Filter links using a tag combination
155 public function testFilterMultipleTags()
159 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
164 * Filter links using a non-existent tag
166 public function testFilterUnknownTag()
170 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
175 * Return links for a given day
177 public function testFilterDay()
181 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
186 * 404 - day not found
188 public function testFilterUnknownDay()
192 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
197 * Use an invalid date format
198 * @expectedException Exception
199 * @expectedExceptionMessageRegExp /Invalid date format/
201 public function testFilterInvalidDayWithChars()
203 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
207 * Use an invalid date format
208 * @expectedException Exception
209 * @expectedExceptionMessageRegExp /Invalid date format/
211 public function testFilterInvalidDayDigits()
213 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
217 * Retrieve a link entry with its hash
219 public function testFilterSmallHash()
221 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
235 * No link for this hash
237 * @expectedException \Shaarli\Bookmark\Exception\LinkNotFoundException
239 public function testFilterUnknownSmallHash()
241 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
245 * Full-text search - no result found.
247 public function testFilterFullTextNoResult()
251 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
256 * Full-text search - result from a link's URL
258 public function testFilterFullTextURL()
262 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
267 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
272 * Full-text search - result from a link's title only
274 public function testFilterFullTextTitle()
276 // use miscellaneous cases
279 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
283 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
287 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
290 // use miscellaneous case and offset
293 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
298 * Full-text search - result from the link's description only
300 public function testFilterFullTextDescription()
304 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
309 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
314 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
319 * Full-text search - result from the link's tags only
321 public function testFilterFullTextTags()
325 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
330 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
335 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
341 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
347 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
352 * Full-text search - result set from mixed sources
354 public function testFilterFullTextMixed()
358 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
363 * Full-text search - test exclusion with '-'.
365 public function testExcludeSearch()
369 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
373 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
374 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
379 * Full-text search - test AND, exact terms and exclusion combined, across fields.
381 public function testMultiSearch()
385 count(self
::$linkFilter->filter(
386 LinkFilter
::$FILTER_TEXT,
387 '"Free Software " stallman "read this" @website stuff'
393 count(self
::$linkFilter->filter(
394 LinkFilter
::$FILTER_TEXT,
395 '"free software " stallman "read this" -beard @website stuff'
401 * Full-text search - make sure that exact search won't work across fields.
403 public function testSearchExactTermMultiFieldsKo()
407 count(self
::$linkFilter->filter(
408 LinkFilter
::$FILTER_TEXT,
415 count(self
::$linkFilter->filter(
416 LinkFilter
::$FILTER_TEXT,
423 * Tag search with exclusion.
425 public function testTagFilterWithExclusion()
429 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
433 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
434 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
439 * Test crossed search (terms + tags).
441 public function testFilterCrossedSearch()
443 $terms = '"Free Software " stallman "read this" @website stuff';
447 count(self
::$linkFilter->filter(
448 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
454 count(self
::$linkFilter->filter(
455 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
461 count(self
::$linkFilter->filter(
462 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
463 array(false, 'PSR-2')
468 count(self
::$linkFilter->filter(
469 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
474 ReferenceLinkDB
::$NB_LINKS_TOTAL,
475 count(self
::$linkFilter->filter(
476 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
483 * Filter links by #hashtag.
485 public function testFilterByHashtag()
487 $hashtag = 'hashtag';
490 count(self
::$linkFilter->filter(
491 LinkFilter
::$FILTER_TAG,
496 $hashtag = 'private';
499 count(self
::$linkFilter->filter(
500 LinkFilter
::$FILTER_TAG,