LinkFilterTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. 6,
  27. count(self::$linkFilter->filter('', ''))
  28. );
  29. // Private only.
  30. $this->assertEquals(
  31. 2,
  32. count(self::$linkFilter->filter('', '', false, true))
  33. );
  34. }
  35. /**
  36. * Filter links using a tag
  37. */
  38. public function testFilterOneTag()
  39. {
  40. $this->assertEquals(
  41. 4,
  42. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false))
  43. );
  44. // Private only.
  45. $this->assertEquals(
  46. 1,
  47. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'web', false, true))
  48. );
  49. }
  50. /**
  51. * Filter links using a tag - case-sensitive
  52. */
  53. public function testFilterCaseSensitiveTag()
  54. {
  55. $this->assertEquals(
  56. 0,
  57. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'mercurial', true))
  58. );
  59. $this->assertEquals(
  60. 1,
  61. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'Mercurial', true))
  62. );
  63. }
  64. /**
  65. * Filter links using a tag combination
  66. */
  67. public function testFilterMultipleTags()
  68. {
  69. $this->assertEquals(
  70. 2,
  71. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'dev cartoon', false))
  72. );
  73. }
  74. /**
  75. * Filter links using a non-existent tag
  76. */
  77. public function testFilterUnknownTag()
  78. {
  79. $this->assertEquals(
  80. 0,
  81. count(self::$linkFilter->filter(LinkFilter::$FILTER_TAG, 'null', false))
  82. );
  83. }
  84. /**
  85. * Return links for a given day
  86. */
  87. public function testFilterDay()
  88. {
  89. $this->assertEquals(
  90. 3,
  91. count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20121206'))
  92. );
  93. }
  94. /**
  95. * 404 - day not found
  96. */
  97. public function testFilterUnknownDay()
  98. {
  99. $this->assertEquals(
  100. 0,
  101. count(self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '19700101'))
  102. );
  103. }
  104. /**
  105. * Use an invalid date format
  106. * @expectedException Exception
  107. * @expectedExceptionMessageRegExp /Invalid date format/
  108. */
  109. public function testFilterInvalidDayWithChars()
  110. {
  111. self::$linkFilter->filter(LinkFilter::$FILTER_DAY, 'Rainy day, dream away');
  112. }
  113. /**
  114. * Use an invalid date format
  115. * @expectedException Exception
  116. * @expectedExceptionMessageRegExp /Invalid date format/
  117. */
  118. public function testFilterInvalidDayDigits()
  119. {
  120. self::$linkFilter->filter(LinkFilter::$FILTER_DAY, '20');
  121. }
  122. /**
  123. * Retrieve a link entry with its hash
  124. */
  125. public function testFilterSmallHash()
  126. {
  127. $links = self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'IuWvgA');
  128. $this->assertEquals(
  129. 1,
  130. count($links)
  131. );
  132. $this->assertEquals(
  133. 'MediaGoblin',
  134. $links['20130614_184135']['title']
  135. );
  136. }
  137. /**
  138. * No link for this hash
  139. */
  140. public function testFilterUnknownSmallHash()
  141. {
  142. $this->assertEquals(
  143. 0,
  144. count(self::$linkFilter->filter(LinkFilter::$FILTER_HASH, 'Iblaah'))
  145. );
  146. }
  147. /**
  148. * Full-text search - result from a link's URL
  149. */
  150. public function testFilterFullTextURL()
  151. {
  152. $this->assertEquals(
  153. 2,
  154. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
  155. );
  156. }
  157. /**
  158. * Full-text search - result from a link's title only
  159. */
  160. public function testFilterFullTextTitle()
  161. {
  162. // use miscellaneous cases
  163. $this->assertEquals(
  164. 2,
  165. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'userfriendly -'))
  166. );
  167. $this->assertEquals(
  168. 2,
  169. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'UserFriendly -'))
  170. );
  171. $this->assertEquals(
  172. 2,
  173. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
  174. );
  175. // use miscellaneous case and offset
  176. $this->assertEquals(
  177. 2,
  178. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'RFrIendL'))
  179. );
  180. }
  181. /**
  182. * Full-text search - result from the link's description only
  183. */
  184. public function testFilterFullTextDescription()
  185. {
  186. $this->assertEquals(
  187. 1,
  188. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'media publishing'))
  189. );
  190. }
  191. /**
  192. * Full-text search - result from the link's tags only
  193. */
  194. public function testFilterFullTextTags()
  195. {
  196. $this->assertEquals(
  197. 2,
  198. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'gnu'))
  199. );
  200. // Private only.
  201. $this->assertEquals(
  202. 1,
  203. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'web', false, true))
  204. );
  205. }
  206. /**
  207. * Full-text search - result set from mixed sources
  208. */
  209. public function testFilterFullTextMixed()
  210. {
  211. $this->assertEquals(
  212. 2,
  213. count(self::$linkFilter->filter(LinkFilter::$FILTER_TEXT, 'free software'))
  214. );
  215. }
  216. }