LinkFilterTest.php 10 KB

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