]> git.immae.eu Git - github/shaarli/Shaarli.git/blob - tests/LinkFilterTest.php
4d754d2522987d21d05d53e10179e1a4e9008804
[github/shaarli/Shaarli.git] / tests / LinkFilterTest.php
1 <?php
2
3 require_once 'application/LinkFilter.php';
4
5 /**
6 * Class LinkFilterTest.
7 */
8 class LinkFilterTest extends PHPUnit_Framework_TestCase
9 {
10 /**
11 * @var LinkFilter instance.
12 */
13 protected static $linkFilter;
14
15 /**
16 * Instanciate linkFilter with ReferenceLinkDB data.
17 */
18 public static function setUpBeforeClass()
19 {
20 $refDB = new ReferenceLinkDB();
21 self::$linkFilter = new LinkFilter($refDB->getLinks());
22 }
23
24 /**
25 * Blank filter.
26 */
27 public function testFilter()
28 {
29 $this->assertEquals(
30 7,
31 count(self::$linkFilter->filter('', ''))
32 );
33
34 // Private only.
35 $this->assertEquals(
36 2,
37 count(self::$linkFilter->filter('', '', false, true))
38 );
39 }
40
41 /**
42 * Filter links using a tag
43 */
44 public function testFilterOneTag()
45 {
46 $this->assertEquals(
47 4,
48 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
49 );
50
51 // Private only.
52 $this->assertEquals(
53 1,
54 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true))
55 );
56 }
57
58 /**
59 * Filter links using a tag - case-sensitive
60 */
61 public function testFilterCaseSensitiveTag()
62 {
63 $this->assertEquals(
64 0,
65 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'mercurial', true))
66 );
67
68 $this->assertEquals(
69 1,
70 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'Mercurial', true))
71 );
72 }
73
74 /**
75 * Filter links using a tag combination
76 */
77 public function testFilterMultipleTags()
78 {
79 $this->assertEquals(
80 2,
81 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'dev cartoon', false))
82 );
83 }
84
85 /**
86 * Filter links using a non-existent tag
87 */
88 public function testFilterUnknownTag()
89 {
90 $this->assertEquals(
91 0,
92 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'null', false))
93 );
94 }
95
96 /**
97 * Return links for a given day
98 */
99 public function testFilterDay()
100 {
101 $this->assertEquals(
102 3,
103 count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206'))
104 );
105 }
106
107 /**
108 * 404 - day not found
109 */
110 public function testFilterUnknownDay()
111 {
112 $this->assertEquals(
113 0,
114 count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '19700101'))
115 );
116 }
117
118 /**
119 * Use an invalid date format
120 * @expectedException Exception
121 * @expectedExceptionMessageRegExp /Invalid date format/
122 */
123 public function testFilterInvalidDayWithChars()
124 {
125 self::$linkFilter->filter(LinkFilter::$FILTER_DAY, 'Rainy day, dream away');
126 }
127
128 /**
129 * Use an invalid date format
130 * @expectedException Exception
131 * @expectedExceptionMessageRegExp /Invalid date format/
132 */
133 public function testFilterInvalidDayDigits()
134 {
135 self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20');
136 }
137
138 /**
139 * Retrieve a link entry with its hash
140 */
141 public function testFilterSmallHash()
142 {
143 $links = self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'IuWvgA');
144
145 $this->assertEquals(
146 1,
147 count($links)
148 );
149
150 $this->assertEquals(
151 'MediaGoblin',
152 $links['20130614_184135']['title']
153 );
154 }
155
156 /**
157 * No link for this hash
158 */
159 public function testFilterUnknownSmallHash()
160 {
161 $this->assertEquals(
162 0,
163 count(self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'Iblaah'))
164 );
165 }
166
167 /**
168 * Full-text search - result from a link's URL
169 */
170 public function testFilterFullTextURL()
171 {
172 $this->assertEquals(
173 2,
174 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
175 );
176
177 $this->assertEquals(
178 2,
179 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars org'))
180 );
181 }
182
183 /**
184 * Full-text search - result from a link's title only
185 */
186 public function testFilterFullTextTitle()
187 {
188 // use miscellaneous cases
189 $this->assertEquals(
190 2,
191 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'userfriendly -'))
192 );
193 $this->assertEquals(
194 2,
195 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'UserFriendly -'))
196 );
197 $this->assertEquals(
198 2,
199 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
200 );
201
202 // use miscellaneous case and offset
203 $this->assertEquals(
204 2,
205 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'RFrIendL'))
206 );
207 }
208
209 /**
210 * Full-text search - result from the link's description only
211 */
212 public function testFilterFullTextDescription()
213 {
214 $this->assertEquals(
215 1,
216 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'publishing media'))
217 );
218
219 $this->assertEquals(
220 1,
221 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'mercurial w3c'))
222 );
223
224 $this->assertEquals(
225 3,
226 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '"free software"'))
227 );
228 }
229
230 /**
231 * Full-text search - result from the link's tags only
232 */
233 public function testFilterFullTextTags()
234 {
235 $this->assertEquals(
236 2,
237 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu'))
238 );
239
240 // Private only.
241 $this->assertEquals(
242 1,
243 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true))
244 );
245 }
246
247 /**
248 * Full-text search - result set from mixed sources
249 */
250 public function testFilterFullTextMixed()
251 {
252 $this->assertEquals(
253 3,
254 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free software'))
255 );
256 }
257
258 /**
259 * Full-text search - test exclusion with '-'.
260 */
261 public function testExcludeSearch()
262 {
263 $this->assertEquals(
264 1,
265 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free -software'))
266 );
267
268 $this->assertEquals(
269 7,
270 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '-software'))
271 );
272 }
273
274 /**
275 * Full-text search - test AND, exact terms and exclusion combined.
276 */
277 public function testMultiSearch()
278 {
279 $this->assertEquals(
280 2,
281 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '"Free Software " stallman "read this"'))
282 );
283
284 $this->assertEquals(
285 1,
286 count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, '"free software " stallman "read this" -beard'))
287 );
288 }
289
290 /**
291 * Tag search with exclusion.
292 */
293 public function testTagFilterWithExclusion()
294 {
295 $this->assertEquals(
296 1,
297 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'gnu -free'))
298 );
299
300 $this->assertEquals(
301 6,
302 count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, '-free'))
303 );
304 }
305 }