test_swisscows.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. from collections import defaultdict
  2. import mock
  3. from searx.engines import swisscows
  4. from searx.testing import SearxTestCase
  5. class TestSwisscowsEngine(SearxTestCase):
  6. def test_request(self):
  7. swisscows.supported_languages = ['de-AT', 'de-DE']
  8. swisscows.language_aliases = {}
  9. query = 'test_query'
  10. dicto = defaultdict(dict)
  11. dicto['pageno'] = 1
  12. dicto['language'] = 'de-DE'
  13. params = swisscows.request(query, dicto)
  14. self.assertTrue('url' in params)
  15. self.assertTrue(query in params['url'])
  16. self.assertTrue('swisscows.ch' in params['url'])
  17. self.assertTrue('uiLanguage=de' in params['url'])
  18. self.assertTrue('region=de-DE' in params['url'])
  19. dicto['category'] = 'images'
  20. params = swisscows.request(query, dicto)
  21. self.assertIn('image', params['url'])
  22. def test_response(self):
  23. self.assertRaises(AttributeError, swisscows.response, None)
  24. self.assertRaises(AttributeError, swisscows.response, [])
  25. self.assertRaises(AttributeError, swisscows.response, '')
  26. self.assertRaises(AttributeError, swisscows.response, '[]')
  27. response = mock.Mock(text=b'<html></html>')
  28. self.assertEqual(swisscows.response(response), [])
  29. response = mock.Mock(text=b'<html></html>')
  30. self.assertEqual(swisscows.response(response), [])
  31. html = b"""
  32. <script>
  33. App.Dispatcher.dispatch("initialize", {
  34. html5history: true,
  35. initialData: {"Request":
  36. {"Page":1,
  37. "ItemsCount":1,
  38. "Query":"This should ",
  39. "NormalizedQuery":"This should ",
  40. "Region":"de-AT",
  41. "UILanguage":"de"},
  42. "Results":{"items":[
  43. {"Title":"\uE000This should\uE001 be the title",
  44. "Description":"\uE000This should\uE001 be the content.",
  45. "Url":"http://this.should.be.the.link/",
  46. "DisplayUrl":"www.\uE000this.should.be.the\uE001.link",
  47. "Id":"782ef287-e439-451c-b380-6ebc14ba033d"},
  48. {"Title":"Datei:This should1.svg",
  49. "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should1.png",
  50. "SourceUrl":"http://de.wikipedia.org/wiki/Datei:This should1.svg",
  51. "DisplayUrl":"de.wikipedia.org/wiki/Datei:This should1.svg",
  52. "Width":950,
  53. "Height":534,
  54. "FileSize":92100,
  55. "ContentType":"image/jpeg",
  56. "Thumbnail":{
  57. "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should1.png",
  58. "ContentType":"image/jpeg",
  59. "Width":300,
  60. "Height":168,
  61. "FileSize":9134},
  62. "Id":"6a97a542-8f65-425f-b7f6-1178c3aba7be"
  63. }
  64. ],"TotalCount":55300,
  65. "Query":"This should "
  66. },
  67. "Images":[{"Title":"Datei:This should.svg",
  68. "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should.png",
  69. "SourceUrl":"http://de.wikipedia.org/wiki/Datei:This should.svg",
  70. "DisplayUrl":"de.wikipedia.org/wiki/Datei:This should.svg",
  71. "Width":1280,
  72. "Height":677,
  73. "FileSize":50053,
  74. "ContentType":"image/png",
  75. "Thumbnail":{"Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should.png",
  76. "ContentType":"image/png",
  77. "Width":300,
  78. "Height":158,
  79. "FileSize":8023},
  80. "Id":"ae230fd8-a06a-47d6-99d5-e74766d8143a"}]},
  81. environment: "production"
  82. }).then(function (options) {
  83. $('#Search_Form').on('submit', function (e) {
  84. if (!Modernizr.history) return;
  85. e.preventDefault();
  86. var $form = $(this),
  87. $query = $('#Query'),
  88. query = $.trim($query.val()),
  89. path = App.Router.makePath($form.attr('action'), null, $form.serializeObject())
  90. if (query.length) {
  91. options.html5history ?
  92. ReactRouter.HistoryLocation.push(path) :
  93. ReactRouter.RefreshLocation.push(path);
  94. }
  95. else $('#Query').trigger('blur');
  96. });
  97. });
  98. </script>
  99. """
  100. response = mock.Mock(text=html)
  101. results = swisscows.response(response)
  102. self.assertEqual(type(results), list)
  103. self.assertEqual(len(results), 3)
  104. self.assertEqual(results[0]['title'], 'This should be the title')
  105. self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
  106. self.assertEqual(results[0]['content'], 'This should be the content.')
  107. self.assertEqual(results[1]['title'], 'Datei:This should1.svg')
  108. self.assertEqual(results[1]['url'], 'http://de.wikipedia.org/wiki/Datei:This should1.svg')
  109. self.assertEqual(results[1]['img_src'], 'http://ts2.mm.This/should1.png')
  110. self.assertEqual(results[1]['template'], 'images.html')
  111. self.assertEqual(results[2]['title'], 'Datei:This should.svg')
  112. self.assertEqual(results[2]['url'], 'http://de.wikipedia.org/wiki/Datei:This should.svg')
  113. self.assertEqual(results[2]['img_src'], 'http://ts2.mm.This/should.png')
  114. self.assertEqual(results[2]['template'], 'images.html')
  115. def test_fetch_supported_languages(self):
  116. html = """<html></html>"""
  117. response = mock.Mock(text=html)
  118. languages = swisscows._fetch_supported_languages(response)
  119. self.assertEqual(type(languages), list)
  120. self.assertEqual(len(languages), 0)
  121. html = """
  122. <html>
  123. <div id="regions-popup">
  124. <div>
  125. <ul>
  126. <li><a data-search-language="browser"></a></li>
  127. <li><a data-search-language="de-CH"></a></li>
  128. <li><a data-search-language="fr-CH"></a></li>
  129. </ul>
  130. </div>
  131. </div>
  132. </html>
  133. """
  134. response = mock.Mock(text=html)
  135. languages = swisscows._fetch_supported_languages(response)
  136. self.assertEqual(type(languages), list)
  137. self.assertEqual(len(languages), 3)
  138. self.assertIn('de-CH', languages)
  139. self.assertIn('fr-CH', languages)