3 require_once 'application/LinkFilter.php';
6 * Class LinkFilterTest.
8 class LinkFilterTest
extends PHPUnit_Framework_TestCase
11 * @var string Test datastore path.
13 protected static $testDatastore = 'sandbox/datastore.php';
15 * @var LinkFilter instance.
17 protected static $linkFilter;
20 * @var ReferenceLinkDB instance
22 protected static $refDB;
25 * @var LinkDB instance
27 protected static $linkDB;
30 * Instanciate linkFilter with ReferenceLinkDB data.
32 public static function setUpBeforeClass()
34 self
::$refDB = new ReferenceLinkDB();
35 self
::$refDB->write(self
::$testDatastore);
36 self
::$linkDB = new LinkDB(self
::$testDatastore, true, false);
37 self
::$linkFilter = new LinkFilter(self
::$linkDB);
43 public function testFilter()
46 self
::$refDB->countLinks(),
47 count(self
::$linkFilter->filter('', ''))
51 self
::$refDB->countLinks(),
52 count(self
::$linkFilter->filter('', '', 'all'))
56 self
::$refDB->countLinks(),
57 count(self
::$linkFilter->filter('', '', 'randomstr'))
62 self
::$refDB->countPrivateLinks(),
63 count(self
::$linkFilter->filter('', '', false, 'private'))
68 self
::$refDB->countPublicLinks(),
69 count(self
::$linkFilter->filter('', '', false, 'public'))
73 ReferenceLinkDB
::$NB_LINKS_TOTAL,
74 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, ''))
78 self
::$refDB->countUntaggedLinks(),
80 self
::$linkFilter->filter(
81 LinkFilter
::$FILTER_TAG,
83 /*$casesensitive=*/false,
84 /*$visibility=*/'all',
85 /*$untaggedonly=*/true
91 ReferenceLinkDB
::$NB_LINKS_TOTAL,
92 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
97 * Filter links using a tag
99 public function testFilterOneTag()
103 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
108 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
113 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
119 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
125 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
130 * Filter links using a tag - case-sensitive
132 public function testFilterCaseSensitiveTag()
136 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
141 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
146 * Filter links using a tag combination
148 public function testFilterMultipleTags()
152 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
157 * Filter links using a non-existent tag
159 public function testFilterUnknownTag()
163 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
168 * Return links for a given day
170 public function testFilterDay()
174 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
179 * 404 - day not found
181 public function testFilterUnknownDay()
185 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
190 * Use an invalid date format
191 * @expectedException Exception
192 * @expectedExceptionMessageRegExp /Invalid date format/
194 public function testFilterInvalidDayWithChars()
196 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
200 * Use an invalid date format
201 * @expectedException Exception
202 * @expectedExceptionMessageRegExp /Invalid date format/
204 public function testFilterInvalidDayDigits()
206 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
210 * Retrieve a link entry with its hash
212 public function testFilterSmallHash()
214 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
228 * No link for this hash
230 * @expectedException LinkNotFoundException
232 public function testFilterUnknownSmallHash()
234 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
238 * Full-text search - no result found.
240 public function testFilterFullTextNoResult()
244 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
249 * Full-text search - result from a link's URL
251 public function testFilterFullTextURL()
255 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
260 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
265 * Full-text search - result from a link's title only
267 public function testFilterFullTextTitle()
269 // use miscellaneous cases
272 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
276 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
280 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
283 // use miscellaneous case and offset
286 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
291 * Full-text search - result from the link's description only
293 public function testFilterFullTextDescription()
297 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
302 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
307 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
312 * Full-text search - result from the link's tags only
314 public function testFilterFullTextTags()
318 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
323 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
328 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
334 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
340 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
345 * Full-text search - result set from mixed sources
347 public function testFilterFullTextMixed()
351 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
356 * Full-text search - test exclusion with '-'.
358 public function testExcludeSearch()
362 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
366 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
367 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
372 * Full-text search - test AND, exact terms and exclusion combined, across fields.
374 public function testMultiSearch()
378 count(self
::$linkFilter->filter(
379 LinkFilter
::$FILTER_TEXT,
380 '"Free Software " stallman "read this" @website stuff'
386 count(self
::$linkFilter->filter(
387 LinkFilter
::$FILTER_TEXT,
388 '"free software " stallman "read this" -beard @website stuff'
394 * Full-text search - make sure that exact search won't work across fields.
396 public function testSearchExactTermMultiFieldsKo()
400 count(self
::$linkFilter->filter(
401 LinkFilter
::$FILTER_TEXT,
408 count(self
::$linkFilter->filter(
409 LinkFilter
::$FILTER_TEXT,
416 * Tag search with exclusion.
418 public function testTagFilterWithExclusion()
422 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
426 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
427 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
432 * Test crossed search (terms + tags).
434 public function testFilterCrossedSearch()
436 $terms = '"Free Software " stallman "read this" @website stuff';
440 count(self
::$linkFilter->filter(
441 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
447 count(self
::$linkFilter->filter(
448 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
454 count(self
::$linkFilter->filter(
455 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
456 array(false, 'PSR-2')
461 count(self
::$linkFilter->filter(
462 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
467 ReferenceLinkDB
::$NB_LINKS_TOTAL,
468 count(self
::$linkFilter->filter(
469 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
476 * Filter links by #hashtag.
478 public function testFilterByHashtag()
480 $hashtag = 'hashtag';
483 count(self
::$linkFilter->filter(
484 LinkFilter
::$FILTER_TAG,
489 $hashtag = 'private';
492 count(self
::$linkFilter->filter(
493 LinkFilter
::$FILTER_TAG,