test_bing_news.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. from collections import defaultdict
  2. import mock
  3. from searx.engines import bing_news
  4. from searx.testing import SearxTestCase
  5. class TestBingNewsEngine(SearxTestCase):
  6. def test_request(self):
  7. query = 'test_query'
  8. dicto = defaultdict(dict)
  9. dicto['pageno'] = 1
  10. dicto['language'] = 'fr_FR'
  11. params = bing_news.request(query, dicto)
  12. self.assertIn('url', params)
  13. self.assertIn(query, params['url'])
  14. self.assertIn('bing.com', params['url'])
  15. self.assertIn('fr', params['url'])
  16. self.assertIn('_FP', params['cookies'])
  17. self.assertIn('en', params['cookies']['_FP'])
  18. dicto['language'] = 'all'
  19. params = bing_news.request(query, dicto)
  20. self.assertIn('en', params['url'])
  21. self.assertIn('_FP', params['cookies'])
  22. self.assertIn('en', params['cookies']['_FP'])
  23. def test_response(self):
  24. self.assertRaises(AttributeError, bing_news.response, None)
  25. self.assertRaises(AttributeError, bing_news.response, [])
  26. self.assertRaises(AttributeError, bing_news.response, '')
  27. self.assertRaises(AttributeError, bing_news.response, '[]')
  28. response = mock.Mock(content='<html></html>')
  29. self.assertEqual(bing_news.response(response), [])
  30. response = mock.Mock(content='<html></html>')
  31. self.assertEqual(bing_news.response(response), [])
  32. html = """
  33. <div class="sn_r">
  34. <div class="newstitle">
  35. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  36. Title
  37. </a>
  38. </div>
  39. <div class="sn_img">
  40. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  41. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  42. </a>
  43. </div>
  44. <div class="sn_txt">
  45. <div class="sn_oi">
  46. <span class="sn_snip">Article Content</span>
  47. <div class="sn_ST">
  48. <cite class="sn_src">metronews.fr</cite>
  49. &nbsp;&#0183;&#32;
  50. <span class="sn_tm">44 minutes ago</span>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. """
  56. response = mock.Mock(content=html)
  57. results = bing_news.response(response)
  58. self.assertEqual(type(results), list)
  59. self.assertEqual(len(results), 1)
  60. self.assertEqual(results[0]['title'], 'Title')
  61. self.assertEqual(results[0]['url'], 'http://url.of.article/')
  62. self.assertEqual(results[0]['content'], 'Article Content')
  63. html = """
  64. <div class="sn_r">
  65. <div class="newstitle">
  66. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  67. Title
  68. </a>
  69. </div>
  70. <div class="sn_img">
  71. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  72. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  73. </a>
  74. </div>
  75. <div class="sn_txt">
  76. <div class="sn_oi">
  77. <span class="sn_snip">Article Content</span>
  78. <div class="sn_ST">
  79. <cite class="sn_src">metronews.fr</cite>
  80. &nbsp;&#0183;&#32;
  81. <span class="sn_tm">44 minutes ago</span>
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="sn_r">
  87. <div class="newstitle">
  88. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  89. Title
  90. </a>
  91. </div>
  92. <div class="sn_img">
  93. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  94. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  95. </a>
  96. </div>
  97. <div class="sn_txt">
  98. <div class="sn_oi">
  99. <span class="sn_snip">Article Content</span>
  100. <div class="sn_ST">
  101. <cite class="sn_src">metronews.fr</cite>
  102. &nbsp;&#0183;&#32;
  103. <span class="sn_tm">3 hours, 44 minutes ago</span>
  104. </div>
  105. </div>
  106. </div>
  107. </div>
  108. <div class="sn_r">
  109. <div class="newstitle">
  110. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  111. Title
  112. </a>
  113. </div>
  114. <div class="sn_img">
  115. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  116. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  117. </a>
  118. </div>
  119. <div class="sn_txt">
  120. <div class="sn_oi">
  121. <span class="sn_snip">Article Content</span>
  122. <div class="sn_ST">
  123. <cite class="sn_src">metronews.fr</cite>
  124. &nbsp;&#0183;&#32;
  125. <span class="sn_tm">44 hours ago</span>
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. <div class="sn_r">
  131. <div class="newstitle">
  132. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  133. Title
  134. </a>
  135. </div>
  136. <div class="sn_img">
  137. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  138. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  139. </a>
  140. </div>
  141. <div class="sn_txt">
  142. <div class="sn_oi">
  143. <span class="sn_snip">Article Content</span>
  144. <div class="sn_ST">
  145. <cite class="sn_src">metronews.fr</cite>
  146. &nbsp;&#0183;&#32;
  147. <span class="sn_tm">2 days ago</span>
  148. </div>
  149. </div>
  150. </div>
  151. </div>
  152. <div class="sn_r">
  153. <div class="newstitle">
  154. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  155. Title
  156. </a>
  157. </div>
  158. <div class="sn_img">
  159. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  160. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  161. </a>
  162. </div>
  163. <div class="sn_txt">
  164. <div class="sn_oi">
  165. <span class="sn_snip">Article Content</span>
  166. <div class="sn_ST">
  167. <cite class="sn_src">metronews.fr</cite>
  168. &nbsp;&#0183;&#32;
  169. <span class="sn_tm">27/01/2015</span>
  170. </div>
  171. </div>
  172. </div>
  173. </div>
  174. <div class="sn_r">
  175. <div class="newstitle">
  176. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  177. Title
  178. </a>
  179. </div>
  180. <div class="sn_img">
  181. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  182. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  183. </a>
  184. </div>
  185. <div class="sn_txt">
  186. <div class="sn_oi">
  187. <span class="sn_snip">Article Content</span>
  188. <div class="sn_ST">
  189. <cite class="sn_src">metronews.fr</cite>
  190. &nbsp;&#0183;&#32;
  191. <span class="sn_tm">Il y a 3 heures</span>
  192. </div>
  193. </div>
  194. </div>
  195. </div>
  196. """
  197. response = mock.Mock(content=html)
  198. results = bing_news.response(response)
  199. self.assertEqual(type(results), list)
  200. self.assertEqual(len(results), 6)
  201. html = """
  202. <div class="newstitle">
  203. <a href="http://url.of.article/" target="_blank" h="ID=news,5022.1">
  204. Title
  205. </a>
  206. </div>
  207. <div class="sn_img">
  208. <a href="http://url.of.article2/" target="_blank" h="ID=news,5024.1">
  209. <img class="rms_img" height="80" id="emb1" src="/image.src" title="Title" width="80" />
  210. </a>
  211. </div>
  212. <div class="sn_txt">
  213. <div class="sn_oi">
  214. <span class="sn_snip">Article Content</span>
  215. <div class="sn_ST">
  216. <cite class="sn_src">metronews.fr</cite>
  217. &nbsp;&#0183;&#32;
  218. <span class="sn_tm">44 minutes ago</span>
  219. </div>
  220. </div>
  221. </div>
  222. """
  223. response = mock.Mock(content=html)
  224. results = bing_news.response(response)
  225. self.assertEqual(type(results), list)
  226. self.assertEqual(len(results), 0)