3 use Shaarli\Bookmark\LinkDB
;
5 require_once 'application/LinkFilter.php';
8 * Class LinkFilterTest.
10 class LinkFilterTest
extends PHPUnit_Framework_TestCase
13 * @var string Test datastore path.
15 protected static $testDatastore = 'sandbox/datastore.php';
17 * @var LinkFilter instance.
19 protected static $linkFilter;
22 * @var ReferenceLinkDB instance
24 protected static $refDB;
27 * @var LinkDB instance
29 protected static $linkDB;
32 * Instanciate linkFilter with ReferenceLinkDB data.
34 public static function setUpBeforeClass()
36 self
::$refDB = new ReferenceLinkDB();
37 self
::$refDB->write(self
::$testDatastore);
38 self
::$linkDB = new LinkDB(self
::$testDatastore, true, false);
39 self
::$linkFilter = new LinkFilter(self
::$linkDB);
45 public function testFilter()
48 self
::$refDB->countLinks(),
49 count(self
::$linkFilter->filter('', ''))
53 self
::$refDB->countLinks(),
54 count(self
::$linkFilter->filter('', '', 'all'))
58 self
::$refDB->countLinks(),
59 count(self
::$linkFilter->filter('', '', 'randomstr'))
64 self
::$refDB->countPrivateLinks(),
65 count(self
::$linkFilter->filter('', '', false, 'private'))
70 self
::$refDB->countPublicLinks(),
71 count(self
::$linkFilter->filter('', '', false, 'public'))
75 ReferenceLinkDB
::$NB_LINKS_TOTAL,
76 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, ''))
80 self
::$refDB->countUntaggedLinks(),
82 self
::$linkFilter->filter(
83 LinkFilter
::$FILTER_TAG,
85 /*$casesensitive=*/false,
86 /*$visibility=*/'all',
87 /*$untaggedonly=*/true
93 ReferenceLinkDB
::$NB_LINKS_TOTAL,
94 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
99 * Filter links using a tag
101 public function testFilterOneTag()
105 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
110 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
115 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
121 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
127 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
132 * Filter links using a tag - case-sensitive
134 public function testFilterCaseSensitiveTag()
138 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
143 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
148 * Filter links using a tag combination
150 public function testFilterMultipleTags()
154 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
159 * Filter links using a non-existent tag
161 public function testFilterUnknownTag()
165 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
170 * Return links for a given day
172 public function testFilterDay()
176 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
181 * 404 - day not found
183 public function testFilterUnknownDay()
187 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
192 * Use an invalid date format
193 * @expectedException Exception
194 * @expectedExceptionMessageRegExp /Invalid date format/
196 public function testFilterInvalidDayWithChars()
198 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
202 * Use an invalid date format
203 * @expectedException Exception
204 * @expectedExceptionMessageRegExp /Invalid date format/
206 public function testFilterInvalidDayDigits()
208 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
212 * Retrieve a link entry with its hash
214 public function testFilterSmallHash()
216 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
230 * No link for this hash
232 * @expectedException LinkNotFoundException
234 public function testFilterUnknownSmallHash()
236 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
240 * Full-text search - no result found.
242 public function testFilterFullTextNoResult()
246 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
251 * Full-text search - result from a link's URL
253 public function testFilterFullTextURL()
257 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
262 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
267 * Full-text search - result from a link's title only
269 public function testFilterFullTextTitle()
271 // use miscellaneous cases
274 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
278 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
282 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
285 // use miscellaneous case and offset
288 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
293 * Full-text search - result from the link's description only
295 public function testFilterFullTextDescription()
299 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
304 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
309 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
314 * Full-text search - result from the link's tags only
316 public function testFilterFullTextTags()
320 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
325 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
330 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
336 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
342 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
347 * Full-text search - result set from mixed sources
349 public function testFilterFullTextMixed()
353 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
358 * Full-text search - test exclusion with '-'.
360 public function testExcludeSearch()
364 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
368 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
369 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
374 * Full-text search - test AND, exact terms and exclusion combined, across fields.
376 public function testMultiSearch()
380 count(self
::$linkFilter->filter(
381 LinkFilter
::$FILTER_TEXT,
382 '"Free Software " stallman "read this" @website stuff'
388 count(self
::$linkFilter->filter(
389 LinkFilter
::$FILTER_TEXT,
390 '"free software " stallman "read this" -beard @website stuff'
396 * Full-text search - make sure that exact search won't work across fields.
398 public function testSearchExactTermMultiFieldsKo()
402 count(self
::$linkFilter->filter(
403 LinkFilter
::$FILTER_TEXT,
410 count(self
::$linkFilter->filter(
411 LinkFilter
::$FILTER_TEXT,
418 * Tag search with exclusion.
420 public function testTagFilterWithExclusion()
424 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
428 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
429 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
434 * Test crossed search (terms + tags).
436 public function testFilterCrossedSearch()
438 $terms = '"Free Software " stallman "read this" @website stuff';
442 count(self
::$linkFilter->filter(
443 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
449 count(self
::$linkFilter->filter(
450 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
456 count(self
::$linkFilter->filter(
457 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
458 array(false, 'PSR-2')
463 count(self
::$linkFilter->filter(
464 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
469 ReferenceLinkDB
::$NB_LINKS_TOTAL,
470 count(self
::$linkFilter->filter(
471 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
478 * Filter links by #hashtag.
480 public function testFilterByHashtag()
482 $hashtag = 'hashtag';
485 count(self
::$linkFilter->filter(
486 LinkFilter
::$FILTER_TAG,
491 $hashtag = 'private';
494 count(self
::$linkFilter->filter(
495 LinkFilter
::$FILTER_TAG,