test_youtube_noapi.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. # -*- coding: utf-8 -*-
  2. from collections import defaultdict
  3. import mock
  4. from searx.engines import youtube_noapi
  5. from searx.testing import SearxTestCase
  6. class TestYoutubeNoAPIEngine(SearxTestCase):
  7. def test_request(self):
  8. query = 'test_query'
  9. dicto = defaultdict(dict)
  10. dicto['pageno'] = 0
  11. dicto['time_range'] = ''
  12. params = youtube_noapi.request(query, dicto)
  13. self.assertIn('url', params)
  14. self.assertIn(query, params['url'])
  15. self.assertIn('youtube.com', params['url'])
  16. def test_time_range_search(self):
  17. dicto = defaultdict(dict)
  18. query = 'test_query'
  19. dicto['time_range'] = 'year'
  20. params = youtube_noapi.request(query, dicto)
  21. self.assertIn('&sp=EgIIBQ%253D%253D', params['url'])
  22. dicto['time_range'] = 'month'
  23. params = youtube_noapi.request(query, dicto)
  24. self.assertIn('&sp=EgIIBA%253D%253D', params['url'])
  25. dicto['time_range'] = 'week'
  26. params = youtube_noapi.request(query, dicto)
  27. self.assertIn('&sp=EgIIAw%253D%253D', params['url'])
  28. dicto['time_range'] = 'day'
  29. params = youtube_noapi.request(query, dicto)
  30. self.assertIn('&sp=EgIIAg%253D%253D', params['url'])
  31. def test_response(self):
  32. self.assertRaises(AttributeError, youtube_noapi.response, None)
  33. self.assertRaises(AttributeError, youtube_noapi.response, [])
  34. self.assertRaises(AttributeError, youtube_noapi.response, '')
  35. self.assertRaises(AttributeError, youtube_noapi.response, '[]')
  36. response = mock.Mock(text='<html></html>')
  37. self.assertEqual(youtube_noapi.response(response), [])
  38. html = """
  39. <div></div>
  40. <script>
  41. window["ytInitialData"] = {
  42. "contents": {
  43. "twoColumnSearchResultsRenderer": {
  44. "primaryContents": {
  45. "sectionListRenderer": {
  46. "contents": [
  47. {
  48. "itemSectionRenderer": {
  49. "contents": [
  50. {
  51. "videoRenderer": {
  52. "videoId": "DIVZCPfAOeM",
  53. "title": {
  54. "simpleText": "Title"
  55. },
  56. "descriptionSnippet": {
  57. "runs": [
  58. {
  59. "text": "Des"
  60. },
  61. {
  62. "text": "cription"
  63. }
  64. ]
  65. }
  66. }
  67. },
  68. {
  69. "videoRenderer": {
  70. "videoId": "9C_HReR_McQ",
  71. "title": {
  72. "simpleText": "Title"
  73. },
  74. "descriptionSnippet": {
  75. "simpleText": "Description"
  76. }
  77. }
  78. }
  79. ]
  80. }
  81. }
  82. ]
  83. }
  84. }
  85. }
  86. }
  87. };
  88. </script>
  89. """
  90. response = mock.Mock(text=html)
  91. results = youtube_noapi.response(response)
  92. self.assertEqual(type(results), list)
  93. self.assertEqual(len(results), 2)
  94. self.assertEqual(results[0]['title'], 'Title')
  95. self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
  96. self.assertEqual(results[0]['content'], 'Description')
  97. self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg')
  98. self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
  99. self.assertEqual(results[1]['title'], 'Title')
  100. self.assertEqual(results[1]['url'], 'https://www.youtube.com/watch?v=9C_HReR_McQ')
  101. self.assertEqual(results[1]['content'], 'Description')
  102. self.assertEqual(results[1]['thumbnail'], 'https://i.ytimg.com/vi/9C_HReR_McQ/hqdefault.jpg')
  103. self.assertTrue('9C_HReR_McQ' in results[1]['embedded'])
  104. html = """
  105. <ol id="item-section-063864" class="item-section">
  106. <li>
  107. </li>
  108. </ol>
  109. """
  110. response = mock.Mock(text=html)
  111. results = youtube_noapi.response(response)
  112. self.assertEqual(type(results), list)
  113. self.assertEqual(len(results), 0)