3 require_once 'application/LinkFilter.php';
6 * Class LinkFilterTest.
8 class LinkFilterTest
extends PHPUnit_Framework_TestCase
11 * @var LinkFilter instance.
13 protected static $linkFilter;
16 * @var ReferenceLinkDB instance
18 protected static $refDB;
21 * Instanciate linkFilter with ReferenceLinkDB data.
23 public static function setUpBeforeClass()
25 self
::$refDB = new ReferenceLinkDB();
26 self
::$linkFilter = new LinkFilter(self
::$refDB->getLinks());
32 public function testFilter()
35 self
::$refDB->countLinks(),
36 count(self
::$linkFilter->filter('', ''))
40 self
::$refDB->countLinks(),
41 count(self
::$linkFilter->filter('', '', 'all'))
45 self
::$refDB->countLinks(),
46 count(self
::$linkFilter->filter('', '', 'randomstr'))
51 self
::$refDB->countPrivateLinks(),
52 count(self
::$linkFilter->filter('', '', false, 'private'))
57 self
::$refDB->countPublicLinks(),
58 count(self
::$linkFilter->filter('', '', false, 'public'))
62 ReferenceLinkDB
::$NB_LINKS_TOTAL,
63 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, ''))
67 self
::$refDB->countUntaggedLinks(),
68 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, /*$request=*/'', /*$casesensitive=*/false, /*$visibility=*/'all', /*$untaggedonly=*/true))
72 ReferenceLinkDB
::$NB_LINKS_TOTAL,
73 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
78 * Filter links using a tag
80 public function testFilterOneTag()
84 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
89 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
94 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
100 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
106 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
111 * Filter links using a tag - case-sensitive
113 public function testFilterCaseSensitiveTag()
117 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
122 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
127 * Filter links using a tag combination
129 public function testFilterMultipleTags()
133 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
138 * Filter links using a non-existent tag
140 public function testFilterUnknownTag()
144 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
149 * Return links for a given day
151 public function testFilterDay()
155 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
160 * 404 - day not found
162 public function testFilterUnknownDay()
166 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
171 * Use an invalid date format
172 * @expectedException Exception
173 * @expectedExceptionMessageRegExp /Invalid date format/
175 public function testFilterInvalidDayWithChars()
177 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
181 * Use an invalid date format
182 * @expectedException Exception
183 * @expectedExceptionMessageRegExp /Invalid date format/
185 public function testFilterInvalidDayDigits()
187 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
191 * Retrieve a link entry with its hash
193 public function testFilterSmallHash()
195 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
209 * No link for this hash
211 * @expectedException LinkNotFoundException
213 public function testFilterUnknownSmallHash()
215 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
219 * Full-text search - no result found.
221 public function testFilterFullTextNoResult()
225 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
230 * Full-text search - result from a link's URL
232 public function testFilterFullTextURL()
236 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
241 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
246 * Full-text search - result from a link's title only
248 public function testFilterFullTextTitle()
250 // use miscellaneous cases
253 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
257 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
261 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
264 // use miscellaneous case and offset
267 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
272 * Full-text search - result from the link's description only
274 public function testFilterFullTextDescription()
278 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
283 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
288 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
293 * Full-text search - result from the link's tags only
295 public function testFilterFullTextTags()
299 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
304 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
309 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
315 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
321 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
326 * Full-text search - result set from mixed sources
328 public function testFilterFullTextMixed()
332 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
337 * Full-text search - test exclusion with '-'.
339 public function testExcludeSearch()
343 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
347 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
348 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
353 * Full-text search - test AND, exact terms and exclusion combined, across fields.
355 public function testMultiSearch()
359 count(self
::$linkFilter->filter(
360 LinkFilter
::$FILTER_TEXT,
361 '"Free Software " stallman "read this" @website stuff'
367 count(self
::$linkFilter->filter(
368 LinkFilter
::$FILTER_TEXT,
369 '"free software " stallman "read this" -beard @website stuff'
375 * Full-text search - make sure that exact search won't work across fields.
377 public function testSearchExactTermMultiFieldsKo()
381 count(self
::$linkFilter->filter(
382 LinkFilter
::$FILTER_TEXT,
389 count(self
::$linkFilter->filter(
390 LinkFilter
::$FILTER_TEXT,
397 * Tag search with exclusion.
399 public function testTagFilterWithExclusion()
403 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
407 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
408 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
413 * Test crossed search (terms + tags).
415 public function testFilterCrossedSearch()
417 $terms = '"Free Software " stallman "read this" @website stuff';
421 count(self
::$linkFilter->filter(
422 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
428 count(self
::$linkFilter->filter(
429 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
435 count(self
::$linkFilter->filter(
436 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
437 array(false, 'PSR-2')
442 count(self
::$linkFilter->filter(
443 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
448 ReferenceLinkDB
::$NB_LINKS_TOTAL,
449 count(self
::$linkFilter->filter(
450 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
457 * Filter links by #hashtag.
459 public function testFilterByHashtag()
461 $hashtag = 'hashtag';
464 count(self
::$linkFilter->filter(
465 LinkFilter
::$FILTER_TAG,
470 $hashtag = 'private';
473 count(self
::$linkFilter->filter(
474 LinkFilter
::$FILTER_TAG,