]> git.immae.eu Git - github/shaarli/Shaarli.git/blame - tests/LinkFilterTest.php
Allow crossed search between terms and tags
[github/shaarli/Shaarli.git] / tests / LinkFilterTest.php
CommitLineData
822bffce
A
1<?php
2
3require_once 'application/LinkFilter.php';
4
5/**
6 * Class LinkFilterTest.
7 */
8class LinkFilterTest extends PHPUnit_Framework_TestCase
9{
10 /**
11 * @var LinkFilter instance.
12 */
13 protected static $linkFilter;
14
c51fae92
A
15 protected static $NB_LINKS_REFDB = 7;
16
822bffce
A
17 /**
18 * Instanciate linkFilter with ReferenceLinkDB data.
19 */
20 public static function setUpBeforeClass()
21 {
22 $refDB = new ReferenceLinkDB();
23 self::$linkFilter = new LinkFilter($refDB->getLinks());
24 }
25
26 /**
27 * Blank filter.
28 */
29 public function testFilter()
30 {
31 $this->assertEquals(
c51fae92 32 self::$NB_LINKS_REFDB,
822bffce
A
33 count(self::$linkFilter->filter('', ''))
34 );
35
36 // Private only.
37 $this->assertEquals(
38 2,
39 count(self::$linkFilter->filter('', '', false, true))
40 );
c51fae92
A
41
42 $this->assertEquals(
43 self::$NB_LINKS_REFDB,
44 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, ''))
45 );
46
47 $this->assertEquals(
48 self::$NB_LINKS_REFDB,
49 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, ''))
50 );
822bffce
A
51 }
52
53 /**
54 * Filter links using a tag
55 */
56 public function testFilterOneTag()
57 {
58 $this->assertEquals(
59 4,
60 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
61 );
62
63 // Private only.
64 $this->assertEquals(
65 1,
66 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true))
67 );
68 }
69
70 /**
71 * Filter links using a tag - case-sensitive
72 */
73 public function testFilterCaseSensitiveTag()
74 {
75 $this->assertEquals(
76 0,
77 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'mercurial', true))
78 );
79
80 $this->assertEquals(
81 1,
82 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'Mercurial', true))
83 );
84 }
85
86 /**
87 * Filter links using a tag combination
88 */
89 public function testFilterMultipleTags()
90 {
91 $this->assertEquals(
92 2,
93 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'dev cartoon', false))
94 );
95 }
96
97 /**
98 * Filter links using a non-existent tag
99 */
100 public function testFilterUnknownTag()
101 {
102 $this->assertEquals(
103 0,
104 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'null', false))
105 );
106 }
107
108 /**
109 * Return links for a given day
110 */
111 public function testFilterDay()
112 {
113 $this->assertEquals(
114 3,
115 count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206'))
116 );
117 }
118
119 /**
120 * 404 - day not found
121 */
122 public function testFilterUnknownDay()
123 {
124 $this->assertEquals(
125 0,
126 count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '19700101'))
127 );
128 }
129
130 /**
131 * Use an invalid date format
132 * @expectedException Exception
133 * @expectedExceptionMessageRegExp /Invalid date format/
134 */
135 public function testFilterInvalidDayWithChars()
136 {
137 self::$linkFilter->filter(LinkFilter::$FILTER_DAY, 'Rainy day, dream away');
138 }
139
140 /**
141 * Use an invalid date format
142 * @expectedException Exception
143 * @expectedExceptionMessageRegExp /Invalid date format/
144 */
145 public function testFilterInvalidDayDigits()
146 {
147 self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20');
148 }
149
150 /**
151 * Retrieve a link entry with its hash
152 */
153 public function testFilterSmallHash()
154 {
155 $links = self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'IuWvgA');
156
157 $this->assertEquals(
158 1,
159 count($links)
160 );
161
162 $this->assertEquals(
163 'MediaGoblin',
164 $links['20130614_184135']['title']
165 );
166 }
167
168 /**
169 * No link for this hash
170 */
171 public function testFilterUnknownSmallHash()
172 {
173 $this->assertEquals(
174 0,
175 count(self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'Iblaah'))
176 );
177 }
178
522b278b
A
179 /**
180 * Full-text search - no result found.
181 */
182 public function testFilterFullTextNoResult()
183 {
184 $this->assertEquals(
185 0,
186 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'azertyuiop'))
187 );
188 }
189
822bffce
A
190 /**
191 * Full-text search - result from a link's URL
192 */
193 public function testFilterFullTextURL()
194 {
195 $this->assertEquals(
196 2,
197 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
198 );
ebd8075a
FV
199
200 $this->assertEquals(
201 2,
202 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars org'))
203 );
822bffce
A
204 }
205
206 /**
207 * Full-text search - result from a link's title only
208 */
209 public function testFilterFullTextTitle()
210 {
211 // use miscellaneous cases
212 $this->assertEquals(
213 2,
214 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'userfriendly -'))
215 );
216 $this->assertEquals(
217 2,
218 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'UserFriendly -'))
219 );
220 $this->assertEquals(
221 2,
222 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
223 );
224
225 // use miscellaneous case and offset
226 $this->assertEquals(
227 2,
228 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'RFrIendL'))
229 );
230 }
231
232 /**
233 * Full-text search - result from the link's description only
234 */
235 public function testFilterFullTextDescription()
236 {
237 $this->assertEquals(
238 1,
ebd8075a
FV
239 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'publishing media'))
240 );
241
242 $this->assertEquals(
243 1,
244 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'mercurial w3c'))
822bffce 245 );
ebd8075a
FV
246
247 $this->assertEquals(
bedd176a 248 3,
ebd8075a
FV
249 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '"free software"'))
250 );
822bffce
A
251 }
252
253 /**
254 * Full-text search - result from the link's tags only
255 */
256 public function testFilterFullTextTags()
257 {
258 $this->assertEquals(
259 2,
260 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu'))
261 );
262
263 // Private only.
264 $this->assertEquals(
265 1,
266 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true))
267 );
268 }
269
270 /**
271 * Full-text search - result set from mixed sources
272 */
273 public function testFilterFullTextMixed()
274 {
275 $this->assertEquals(
bedd176a 276 3,
822bffce
A
277 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free software'))
278 );
279 }
21979ff1 280
bedd176a
A
281 /**
282 * Full-text search - test exclusion with '-'.
283 */
284 public function testExcludeSearch()
285 {
286 $this->assertEquals(
287 1,
522b278b 288 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free -gnu'))
bedd176a
A
289 );
290
291 $this->assertEquals(
522b278b
A
292 6,
293 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '-revolution'))
bedd176a
A
294 );
295 }
296
297 /**
522b278b 298 * Full-text search - test AND, exact terms and exclusion combined, across fields.
bedd176a
A
299 */
300 public function testMultiSearch()
301 {
302 $this->assertEquals(
303 2,
522b278b
A
304 count(self::$linkFilter->filter(
305 LinkFilter::$FILTER_TEXT,
306 '"Free Software " stallman "read this" @website stuff'
307 ))
bedd176a
A
308 );
309
310 $this->assertEquals(
311 1,
522b278b
A
312 count(self::$linkFilter->filter(
313 LinkFilter::$FILTER_TEXT,
314 '"free software " stallman "read this" -beard @website stuff'
315 ))
316 );
317 }
318
319 /**
320 * Full-text search - make sure that exact search won't work across fields.
321 */
322 public function testSearchExactTermMultiFieldsKo()
323 {
324 $this->assertEquals(
325 0,
326 count(self::$linkFilter->filter(
327 LinkFilter::$FILTER_TEXT,
328 '"designer naming"'
329 ))
330 );
331
332 $this->assertEquals(
333 0,
334 count(self::$linkFilter->filter(
335 LinkFilter::$FILTER_TEXT,
336 '"designernaming"'
337 ))
bedd176a
A
338 );
339 }
340
21979ff1
A
341 /**
342 * Tag search with exclusion.
343 */
344 public function testTagFilterWithExclusion()
345 {
346 $this->assertEquals(
347 1,
348 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'gnu -free'))
349 );
350
351 $this->assertEquals(
bedd176a 352 6,
21979ff1
A
353 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '-free'))
354 );
355 }
c51fae92
A
356
357 /**
358 * Test crossed search (terms + tags).
359 */
360 public function testFilterCrossedSearch()
361 {
362 $terms = '"Free Software " stallman "read this" @website stuff';
363 $tags = 'free';
364 $this->assertEquals(
365 1,
366 count(self::$linkFilter->filter(
367 LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
368 array($tags, $terms)
369 ))
370 );
371 $this->assertEquals(
372 2,
373 count(self::$linkFilter->filter(
374 LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
375 array('', $terms)
376 ))
377 );
378 $this->assertEquals(
379 1,
380 count(self::$linkFilter->filter(
381 LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
382 array($tags, '')
383 ))
384 );
385 $this->assertEquals(
386 self::$NB_LINKS_REFDB,
387 count(self::$linkFilter->filter(
388 LinkFilter::$FILTER_TAG | LinkFilter::$FILTER_TEXT,
389 ''
390 ))
391 );
392 }
822bffce 393}