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(),
79 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, /*$request=*/'', /*$casesensitive=*/false, /*$visibility=*/'all', /*$untaggedonly=*/true))
83 ReferenceLinkDB
::$NB_LINKS_TOTAL,
84 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, ''))
89 * Filter links using a tag
91 public function testFilterOneTag()
95 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false))
100 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'all'))
105 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'default-blabla'))
111 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'private'))
117 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'web', false, 'public'))
122 * Filter links using a tag - case-sensitive
124 public function testFilterCaseSensitiveTag()
128 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'mercurial', true))
133 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'Mercurial', true))
138 * Filter links using a tag combination
140 public function testFilterMultipleTags()
144 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'dev cartoon', false))
149 * Filter links using a non-existent tag
151 public function testFilterUnknownTag()
155 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'null', false))
160 * Return links for a given day
162 public function testFilterDay()
166 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20121206'))
171 * 404 - day not found
173 public function testFilterUnknownDay()
177 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '19700101'))
182 * Use an invalid date format
183 * @expectedException Exception
184 * @expectedExceptionMessageRegExp /Invalid date format/
186 public function testFilterInvalidDayWithChars()
188 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, 'Rainy day, dream away');
192 * Use an invalid date format
193 * @expectedException Exception
194 * @expectedExceptionMessageRegExp /Invalid date format/
196 public function testFilterInvalidDayDigits()
198 self
::$linkFilter->filter(LinkFilter
::$FILTER_DAY, '20');
202 * Retrieve a link entry with its hash
204 public function testFilterSmallHash()
206 $links = self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'IuWvgA');
220 * No link for this hash
222 * @expectedException LinkNotFoundException
224 public function testFilterUnknownSmallHash()
226 self
::$linkFilter->filter(LinkFilter
::$FILTER_HASH, 'Iblaah');
230 * Full-text search - no result found.
232 public function testFilterFullTextNoResult()
236 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'azertyuiop'))
241 * Full-text search - result from a link's URL
243 public function testFilterFullTextURL()
247 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars.userfriendly.org'))
252 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'ars org'))
257 * Full-text search - result from a link's title only
259 public function testFilterFullTextTitle()
261 // use miscellaneous cases
264 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'userfriendly -'))
268 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'UserFriendly -'))
272 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'uSeRFrIendlY -'))
275 // use miscellaneous case and offset
278 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'RFrIendL'))
283 * Full-text search - result from the link's description only
285 public function testFilterFullTextDescription()
289 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'publishing media'))
294 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'mercurial w3c'))
299 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '"free software"'))
304 * Full-text search - result from the link's tags only
306 public function testFilterFullTextTags()
310 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web'))
315 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'all'))
320 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', 'bla'))
326 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'private'))
332 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'web', false, 'public'))
337 * Full-text search - result set from mixed sources
339 public function testFilterFullTextMixed()
343 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free software'))
348 * Full-text search - test exclusion with '-'.
350 public function testExcludeSearch()
354 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, 'free -gnu'))
358 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
359 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TEXT, '-revolution'))
364 * Full-text search - test AND, exact terms and exclusion combined, across fields.
366 public function testMultiSearch()
370 count(self
::$linkFilter->filter(
371 LinkFilter
::$FILTER_TEXT,
372 '"Free Software " stallman "read this" @website stuff'
378 count(self
::$linkFilter->filter(
379 LinkFilter
::$FILTER_TEXT,
380 '"free software " stallman "read this" -beard @website stuff'
386 * Full-text search - make sure that exact search won't work across fields.
388 public function testSearchExactTermMultiFieldsKo()
392 count(self
::$linkFilter->filter(
393 LinkFilter
::$FILTER_TEXT,
400 count(self
::$linkFilter->filter(
401 LinkFilter
::$FILTER_TEXT,
408 * Tag search with exclusion.
410 public function testTagFilterWithExclusion()
414 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, 'gnu -free'))
418 ReferenceLinkDB
::$NB_LINKS_TOTAL - 1,
419 count(self
::$linkFilter->filter(LinkFilter
::$FILTER_TAG, '-free'))
424 * Test crossed search (terms + tags).
426 public function testFilterCrossedSearch()
428 $terms = '"Free Software " stallman "read this" @website stuff';
432 count(self
::$linkFilter->filter(
433 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
439 count(self
::$linkFilter->filter(
440 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
446 count(self
::$linkFilter->filter(
447 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
448 array(false, 'PSR-2')
453 count(self
::$linkFilter->filter(
454 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
459 ReferenceLinkDB
::$NB_LINKS_TOTAL,
460 count(self
::$linkFilter->filter(
461 LinkFilter
::$FILTER_TAG | LinkFilter
::$FILTER_TEXT,
468 * Filter links by #hashtag.
470 public function testFilterByHashtag()
472 $hashtag = 'hashtag';
475 count(self
::$linkFilter->filter(
476 LinkFilter
::$FILTER_TAG,
481 $hashtag = 'private';
484 count(self
::$linkFilter->filter(
485 LinkFilter
::$FILTER_TAG,