@@ -0,0 +1,317 @@
1+from collections import defaultdict
2+import mock
3+from searx.engines import qwant
4+from searx.testing import SearxTestCase
5+
6+
7+class TestQwantEngine(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+ qwant.categories = ['']
15+ params = qwant.request(query, dicto)
16+ self.assertIn('url', params)
17+ self.assertIn(query, params['url'])
18+ self.assertIn('web', params['url'])
19+ self.assertIn('qwant.com', params['url'])
20+ self.assertIn('fr_fr', params['url'])
21+
22+ dicto['language'] = 'all'
23+ qwant.categories = ['news']
24+ params = qwant.request(query, dicto)
25+ self.assertFalse('fr' in params['url'])
26+ self.assertIn('news', params['url'])
27+
28+ def test_response(self):
29+ self.assertRaises(AttributeError, qwant.response, None)
30+ self.assertRaises(AttributeError, qwant.response, [])
31+ self.assertRaises(AttributeError, qwant.response, '')
32+ self.assertRaises(AttributeError, qwant.response, '[]')
33+
34+ response = mock.Mock(text='{}')
35+ self.assertEqual(qwant.response(response), [])
36+
37+ response = mock.Mock(text='{"data": {}}')
38+ self.assertEqual(qwant.response(response), [])
39+
40+ json = """
41+ {
42+ "status": "success",
43+ "data": {
44+ "query": {
45+ "locale": "en_us",
46+ "query": "Test",
47+ "offset": 10
48+ },
49+ "result": {
50+ "items": [
51+ {
52+ "title": "Title",
53+ "score": 9999,
54+ "url": "http://www.url.xyz",
55+ "source": "...",
56+ "desc": "Description",
57+ "date": "",
58+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
59+ "favicon": "https://s.qwant.com/fav.ico"
60+ }
61+ ],
62+ "filters": []
63+ },
64+ "cache": {
65+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
66+ "created": 1433092754,
67+ "expiration": 259200,
68+ "status": "miss",
69+ "age": 0
70+ }
71+ }
72+ }
73+ """
74+ response = mock.Mock(text=json)
75+ qwant.categories = ['general']
76+ results = qwant.response(response)
77+ self.assertEqual(type(results), list)
78+ self.assertEqual(len(results), 1)
79+ self.assertEqual(results[0]['title'], 'Title')
80+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
81+ self.assertEqual(results[0]['content'], 'Description')
82+
83+ json = """
84+ {
85+ "status": "success",
86+ "data": {
87+ "query": {
88+ "locale": "en_us",
89+ "query": "Test",
90+ "offset": 10
91+ },
92+ "result": {
93+ "items": [
94+ {
95+ "title": "Title",
96+ "score": 9999,
97+ "url": "http://www.url.xyz",
98+ "source": "...",
99+ "media": "http://image.jpg",
100+ "desc": "",
101+ "thumbnail": "http://thumbnail.jpg",
102+ "date": "",
103+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
104+ "favicon": "https://s.qwant.com/fav.ico"
105+ }
106+ ],
107+ "filters": []
108+ },
109+ "cache": {
110+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
111+ "created": 1433092754,
112+ "expiration": 259200,
113+ "status": "miss",
114+ "age": 0
115+ }
116+ }
117+ }
118+ """
119+ response = mock.Mock(text=json)
120+ qwant.categories = ['images']
121+ results = qwant.response(response)
122+ self.assertEqual(type(results), list)
123+ self.assertEqual(len(results), 1)
124+ self.assertEqual(results[0]['title'], 'Title')
125+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
126+ self.assertEqual(results[0]['content'], '')
127+ self.assertEqual(results[0]['thumbnail_src'], 'http://thumbnail.jpg')
128+ self.assertEqual(results[0]['img_src'], 'http://image.jpg')
129+
130+ json = """
131+ {
132+ "status": "success",
133+ "data": {
134+ "query": {
135+ "locale": "en_us",
136+ "query": "Test",
137+ "offset": 10
138+ },
139+ "result": {
140+ "items": [
141+ {
142+ "title": "Title",
143+ "score": 9999,
144+ "url": "http://www.url.xyz",
145+ "source": "...",
146+ "desc": "Description",
147+ "date": 1433260920,
148+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
149+ "favicon": "https://s.qwant.com/fav.ico"
150+ }
151+ ],
152+ "filters": []
153+ },
154+ "cache": {
155+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
156+ "created": 1433092754,
157+ "expiration": 259200,
158+ "status": "miss",
159+ "age": 0
160+ }
161+ }
162+ }
163+ """
164+ response = mock.Mock(text=json)
165+ qwant.categories = ['news']
166+ results = qwant.response(response)
167+ self.assertEqual(type(results), list)
168+ self.assertEqual(len(results), 1)
169+ self.assertEqual(results[0]['title'], 'Title')
170+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
171+ self.assertEqual(results[0]['content'], 'Description')
172+ self.assertIn('publishedDate', results[0])
173+
174+ json = """
175+ {
176+ "status": "success",
177+ "data": {
178+ "query": {
179+ "locale": "en_us",
180+ "query": "Test",
181+ "offset": 10
182+ },
183+ "result": {
184+ "items": [
185+ {
186+ "title": "Title",
187+ "score": 9999,
188+ "url": "http://www.url.xyz",
189+ "source": "...",
190+ "desc": "Description",
191+ "date": 1433260920,
192+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
193+ "favicon": "https://s.qwant.com/fav.ico"
194+ }
195+ ],
196+ "filters": []
197+ },
198+ "cache": {
199+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
200+ "created": 1433092754,
201+ "expiration": 259200,
202+ "status": "miss",
203+ "age": 0
204+ }
205+ }
206+ }
207+ """
208+ response = mock.Mock(text=json)
209+ qwant.categories = ['social media']
210+ results = qwant.response(response)
211+ self.assertEqual(type(results), list)
212+ self.assertEqual(len(results), 1)
213+ self.assertEqual(results[0]['title'], 'Title')
214+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
215+ self.assertEqual(results[0]['content'], 'Description')
216+ self.assertIn('publishedDate', results[0])
217+
218+ json = """
219+ {
220+ "status": "success",
221+ "data": {
222+ "query": {
223+ "locale": "en_us",
224+ "query": "Test",
225+ "offset": 10
226+ },
227+ "result": {
228+ "items": [
229+ {
230+ "title": "Title",
231+ "score": 9999,
232+ "url": "http://www.url.xyz",
233+ "source": "...",
234+ "desc": "Description",
235+ "date": 1433260920,
236+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
237+ "favicon": "https://s.qwant.com/fav.ico"
238+ }
239+ ],
240+ "filters": []
241+ },
242+ "cache": {
243+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
244+ "created": 1433092754,
245+ "expiration": 259200,
246+ "status": "miss",
247+ "age": 0
248+ }
249+ }
250+ }
251+ """
252+ response = mock.Mock(text=json)
253+ qwant.categories = ['']
254+ results = qwant.response(response)
255+ self.assertEqual(type(results), list)
256+ self.assertEqual(len(results), 0)
257+
258+ json = """
259+ {
260+ "status": "success",
261+ "data": {
262+ "query": {
263+ "locale": "en_us",
264+ "query": "Test",
265+ "offset": 10
266+ },
267+ "result": {
268+ "filters": []
269+ },
270+ "cache": {
271+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
272+ "created": 1433092754,
273+ "expiration": 259200,
274+ "status": "miss",
275+ "age": 0
276+ }
277+ }
278+ }
279+ """
280+ response = mock.Mock(text=json)
281+ results = qwant.response(response)
282+ self.assertEqual(type(results), list)
283+ self.assertEqual(len(results), 0)
284+
285+ json = """
286+ {
287+ "status": "success",
288+ "data": {
289+ "query": {
290+ "locale": "en_us",
291+ "query": "Test",
292+ "offset": 10
293+ },
294+ "cache": {
295+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
296+ "created": 1433092754,
297+ "expiration": 259200,
298+ "status": "miss",
299+ "age": 0
300+ }
301+ }
302+ }
303+ """
304+ response = mock.Mock(text=json)
305+ results = qwant.response(response)
306+ self.assertEqual(type(results), list)
307+ self.assertEqual(len(results), 0)
308+
309+ json = """
310+ {
311+ "status": "success"
312+ }
313+ """
314+ response = mock.Mock(text=json)
315+ results = qwant.response(response)
316+ self.assertEqual(type(results), list)
317+ self.assertEqual(len(results), 0)