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, ''))
68 self
::$refDB->countUntaggedLinks(),
69 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, false))
73 ReferenceLinkDB
::$NB_LINKS_TOTAL,
74 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
79 * Filter links using a tag
81 public function testFilterOneTag()
85 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
90 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
95 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
101 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
107 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
112 * Filter links using a tag - case-sensitive
114 public function testFilterCaseSensitiveTag()
118 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
123 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
128 * Filter links using a tag combination
130 public function testFilterMultipleTags()
134 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
139 * Filter links using a non-existent tag
141 public function testFilterUnknownTag()
145 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
150 * Return links for a given day
152 public function testFilterDay()
156 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
161 * 404 - day not found
163 public function testFilterUnknownDay()
167 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
172 * Use an invalid date format
173 * @expectedException Exception
174 * @expectedExceptionMessageRegExp /Invalid date format/
176 public function testFilterInvalidDayWithChars()
178 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
182 * Use an invalid date format
183 * @expectedException Exception
184 * @expectedExceptionMessageRegExp /Invalid date format/
186 public function testFilterInvalidDayDigits()
188 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
192 * Retrieve a link entry with its hash
194 public function testFilterSmallHash()
196 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
210 * No link for this hash
212 * @expectedException LinkNotFoundException
214 public function testFilterUnknownSmallHash()
216 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
220 * Full-text search - no result found.
222 public function testFilterFullTextNoResult()
226 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
231 * Full-text search - result from a link's URL
233 public function testFilterFullTextURL()
237 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
242 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
247 * Full-text search - result from a link's title only
249 public function testFilterFullTextTitle()
251 // use miscellaneous cases
254 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
258 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
262 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
265 // use miscellaneous case and offset
268 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
273 * Full-text search - result from the link's description only
275 public function testFilterFullTextDescription()
279 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
284 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
289 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
294 * Full-text search - result from the link's tags only
296 public function testFilterFullTextTags()
300 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
305 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
310 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
316 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
322 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
327 * Full-text search - result set from mixed sources
329 public function testFilterFullTextMixed()
333 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
338 * Full-text search - test exclusion with '-'.
340 public function testExcludeSearch()
344 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
348 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
349 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
354 * Full-text search - test AND, exact terms and exclusion combined, across fields.
356 public function testMultiSearch()
360 count(self
::$linkFilter->filter(
361 LinkFilter
::$FILTER_TEXT,
362 '"Free Software " stallman "read this" @website stuff'
368 count(self
::$linkFilter->filter(
369 LinkFilter
::$FILTER_TEXT,
370 '"free software " stallman "read this" -beard @website stuff'
376 * Full-text search - make sure that exact search won't work across fields.
378 public function testSearchExactTermMultiFieldsKo()
382 count(self
::$linkFilter->filter(
383 LinkFilter
::$FILTER_TEXT,
390 count(self
::$linkFilter->filter(
391 LinkFilter
::$FILTER_TEXT,
398 * Tag search with exclusion.
400 public function testTagFilterWithExclusion()
404 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
408 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
409 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
414 * Test crossed search (terms + tags).
416 public function testFilterCrossedSearch()
418 $terms = '"Free Software " stallman "read this" @website stuff';
422 count(self
::$linkFilter->filter(
423 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
429 count(self
::$linkFilter->filter(
430 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
436 count(self
::$linkFilter->filter(
437 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
438 array(false, 'PSR-2')
443 count(self
::$linkFilter->filter(
444 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
449 ReferenceLinkDB
::$NB_LINKS_TOTAL,
450 count(self
::$linkFilter->filter(
451 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
458 * Filter links by #hashtag.
460 public function testFilterByHashtag()
462 $hashtag = 'hashtag';
465 count(self
::$linkFilter->filter(
466 LinkFilter
::$FILTER_TAG,
471 $hashtag = 'private';
474 count(self
::$linkFilter->filter(
475 LinkFilter
::$FILTER_TAG,