@@ -0,0 +1,111 @@
1+from collections import defaultdict
2+import mock
3+from searx.engines import youtube_api
4+from searx.testing import SearxTestCase
5+
6+
7+class TestYoutubeAPIEngine(SearxTestCase):
8+
9+ def test_request(self):
10+ query = 'test_query'
11+ dicto = defaultdict(dict)
12+ dicto['pageno'] = 0
13+ dicto['language'] = 'fr_FR'
14+ params = youtube_api.request(query, dicto)
15+ self.assertTrue('url' in params)
16+ self.assertTrue(query in params['url'])
17+ self.assertIn('googleapis.com', params['url'])
18+ self.assertIn('youtube', params['url'])
19+ self.assertIn('fr', params['url'])
20+
21+ dicto['language'] = 'all'
22+ params = youtube_api.request(query, dicto)
23+ self.assertFalse('fr' in params['url'])
24+
25+ def test_response(self):
26+ self.assertRaises(AttributeError, youtube_api.response, None)
27+ self.assertRaises(AttributeError, youtube_api.response, [])
28+ self.assertRaises(AttributeError, youtube_api.response, '')
29+ self.assertRaises(AttributeError, youtube_api.response, '[]')
30+
31+ response = mock.Mock(text='{}')
32+ self.assertEqual(youtube_api.response(response), [])
33+
34+ response = mock.Mock(text='{"data": []}')
35+ self.assertEqual(youtube_api.response(response), [])
36+
37+ json = """
38+ {
39+ "kind": "youtube#searchListResponse",
40+ "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/YJQDcTBCDcaBvl-sRZJoXdvy1ME",
41+ "nextPageToken": "CAUQAA",
42+ "pageInfo": {
43+ "totalResults": 1000000,
44+ "resultsPerPage": 20
45+ },
46+ "items": [
47+ {
48+ "kind": "youtube#searchResult",
49+ "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/IbLO64BMhbHIgWLwLw7MDYe7Hs4",
50+ "id": {
51+ "kind": "youtube#video",
52+ "videoId": "DIVZCPfAOeM"
53+ },
54+ "snippet": {
55+ "publishedAt": "2015-05-29T22:41:04.000Z",
56+ "channelId": "UCNodmx1ERIjKqvcJLtdzH5Q",
57+ "title": "Title",
58+ "description": "Description",
59+ "thumbnails": {
60+ "default": {
61+ "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/default.jpg"
62+ },
63+ "medium": {
64+ "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/mqdefault.jpg"
65+ },
66+ "high": {
67+ "url": "https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg"
68+ }
69+ },
70+ "channelTitle": "MinecraftUniverse",
71+ "liveBroadcastContent": "none"
72+ }
73+ }
74+ ]
75+ }
76+ """
77+ response = mock.Mock(text=json)
78+ results = youtube_api.response(response)
79+ self.assertEqual(type(results), list)
80+ self.assertEqual(len(results), 1)
81+ self.assertEqual(results[0]['title'], 'Title')
82+ self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
83+ self.assertEqual(results[0]['content'], 'Description')
84+ self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg')
85+ self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
86+
87+ json = """
88+ {
89+ "kind": "youtube#searchListResponse",
90+ "etag": "xmg9xJZuZD438sF4hb-VcBBREXc/YJQDcTBCDcaBvl-sRZJoXdvy1ME",
91+ "nextPageToken": "CAUQAA",
92+ "pageInfo": {
93+ "totalResults": 1000000,
94+ "resultsPerPage": 20
95+ }
96+ }
97+ """
98+ response = mock.Mock(text=json)
99+ results = youtube_api.response(response)
100+ self.assertEqual(type(results), list)
101+ self.assertEqual(len(results), 0)
102+
103+ json = """
104+ {"toto":{"entry":[]
105+ }
106+ }
107+ """
108+ response = mock.Mock(text=json)
109+ results = youtube_api.response(response)
110+ self.assertEqual(type(results), list)
111+ self.assertEqual(len(results), 0)