on master help sign in
New Qwant engines

- Web - Images - News - Social media

commit884eeb8541e0a4cf3d65c2a17e1c2f788cab7fb1 authorCqoicebordel <Cqoicebordel@users.noreply.github.com> dateMon 1 Jun 2015, 00:00 (11 years ago) parentf965c97
10 files changed+853
searx/engines/qwant.py+66 searx/engines/qwant_images.py+70 searx/engines/qwant_news.py+69 searx/engines/qwant_social.py+69 searx/settings.yml+16 searx/tests/engines/test_qwant.py+137 searx/tests/engines/test_qwant_images.py+145 searx/tests/engines/test_qwant_news.py+137 searx/tests/engines/test_qwant_social.py+140 searx/tests/test_engines.py+4
searx/engines/qwant.pynew file+66
@@ -0,0 +1,66 @@
1+"""
2+ Qwant (Web)
3+
4+ @website https://qwant.com/
5+ @provide-api not officially (https://api.qwant.com/api/search/)
6+
7+ @using-api yes
8+ @results JSON
9+ @stable yes
10+ @parse url, title, content
11+"""
12+
13+from urllib import urlencode
14+from json import loads
15+
16+# engine dependent config
17+categories = ['general']
18+paging = True
19+language_support = True
20+
21+# search-url
22+url = 'https://api.qwant.com/api/search/web?count=10&offset={offset}&f=&{query}'
23+
24+
25+# do search-request
26+def request(query, params):
27+ offset = (params['pageno'] - 1) * 10
28+
29+ params['url'] = url.format(query=urlencode({'q': query}),
30+ offset=offset)
31+
32+ # add language tag if specified
33+ if params['language'] != 'all':
34+ params['url'] += '&locale=' + params['language'].lower()
35+
36+ return params
37+
38+
39+# get response from search-request
40+def response(resp):
41+ results = []
42+
43+ search_results = loads(resp.text)
44+
45+ # return empty array if there are no results
46+ if 'data' not in search_results:
47+ return []
48+
49+ data = search_results.get('data', {})
50+
51+ res = data.get('result', {})
52+
53+ # parse results
54+ for result in res.get('items', {}):
55+
56+ title = result['title']
57+ res_url = result['url']
58+ content = result['desc']
59+
60+ # append result
61+ results.append({'title': title,
62+ 'content': content,
63+ 'url': res_url})
64+
65+ # return results
66+ return results
searx/engines/qwant_images.pynew file+70
@@ -0,0 +1,70 @@
1+"""
2+ Qwant (Images)
3+
4+ @website https://qwant.com/
5+ @provide-api not officially (https://api.qwant.com/api/search/)
6+
7+ @using-api yes
8+ @results JSON
9+ @stable yes
10+ @parse url, title, content
11+"""
12+
13+from urllib import urlencode
14+from json import loads
15+
16+# engine dependent config
17+categories = ['images']
18+paging = True
19+language_support = True
20+
21+# search-url
22+url = 'https://api.qwant.com/api/search/images?count=10&offset={offset}&f=&{query}'
23+
24+
25+# do search-request
26+def request(query, params):
27+ offset = (params['pageno'] - 1) * 10
28+
29+ params['url'] = url.format(query=urlencode({'q': query}),
30+ offset=offset)
31+
32+ # add language tag if specified
33+ if params['language'] != 'all':
34+ params['url'] += '&locale=' + params['language'].lower()
35+
36+ return params
37+
38+
39+# get response from search-request
40+def response(resp):
41+ results = []
42+
43+ search_results = loads(resp.text)
44+
45+ # return empty array if there are no results
46+ if 'data' not in search_results:
47+ return []
48+
49+ data = search_results.get('data', {})
50+
51+ res = data.get('result', {})
52+
53+ # parse results
54+ for result in res.get('items', {}):
55+
56+ title = result['title']
57+ res_url = result['url']
58+ thumbnail_src = result['thumbnail']
59+ img_src = result['media']
60+
61+ # append result
62+ results.append({'template': 'images.html',
63+ 'url': res_url,
64+ 'title': title,
65+ 'content': '',
66+ 'thumbnail_src': thumbnail_src,
67+ 'img_src': img_src})
68+
69+ # return results
70+ return results
searx/engines/qwant_news.pynew file+69
@@ -0,0 +1,69 @@
1+"""
2+ Qwant (News)
3+
4+ @website https://qwant.com/
5+ @provide-api not officially (https://api.qwant.com/api/search/)
6+
7+ @using-api yes
8+ @results JSON
9+ @stable yes
10+ @parse url, title, content
11+"""
12+
13+from urllib import urlencode
14+from json import loads
15+from datetime import datetime
16+
17+# engine dependent config
18+categories = ['news']
19+paging = True
20+language_support = True
21+
22+# search-url
23+url = 'https://api.qwant.com/api/search/news?count=10&offset={offset}&f=&{query}'
24+
25+
26+# do search-request
27+def request(query, params):
28+ offset = (params['pageno'] - 1) * 10
29+
30+ params['url'] = url.format(query=urlencode({'q': query}),
31+ offset=offset)
32+
33+ # add language tag if specified
34+ if params['language'] != 'all':
35+ params['url'] += '&locale=' + params['language'].lower()
36+
37+ return params
38+
39+
40+# get response from search-request
41+def response(resp):
42+ results = []
43+
44+ search_results = loads(resp.text)
45+
46+ # return empty array if there are no results
47+ if 'data' not in search_results:
48+ return []
49+
50+ data = search_results.get('data', {})
51+
52+ res = data.get('result', {})
53+
54+ # parse results
55+ for result in res.get('items', {}):
56+
57+ title = result['title']
58+ res_url = result['url']
59+ content = result['desc']
60+ published_date = datetime.fromtimestamp(result['date'], None)
61+
62+ # append result
63+ results.append({'url': res_url,
64+ 'title': title,
65+ 'publishedDate': published_date,
66+ 'content': content})
67+
68+ # return results
69+ return results
searx/engines/qwant_social.pynew file+69
@@ -0,0 +1,69 @@
1+"""
2+ Qwant (social media)
3+
4+ @website https://qwant.com/
5+ @provide-api not officially (https://api.qwant.com/api/search/)
6+
7+ @using-api yes
8+ @results JSON
9+ @stable yes
10+ @parse url, title, content
11+"""
12+
13+from urllib import urlencode
14+from json import loads
15+from datetime import datetime
16+
17+# engine dependent config
18+categories = ['social media']
19+paging = True
20+language_support = True
21+
22+# search-url
23+url = 'https://api.qwant.com/api/search/social?count=10&offset={offset}&f=&{query}'
24+
25+
26+# do search-request
27+def request(query, params):
28+ offset = (params['pageno'] - 1) * 10
29+
30+ params['url'] = url.format(query=urlencode({'q': query}),
31+ offset=offset)
32+
33+ # add language tag if specified
34+ if params['language'] != 'all':
35+ params['url'] += '&locale=' + params['language'].lower()
36+
37+ return params
38+
39+
40+# get response from search-request
41+def response(resp):
42+ results = []
43+
44+ search_results = loads(resp.text)
45+
46+ # return empty array if there are no results
47+ if 'data' not in search_results:
48+ return []
49+
50+ data = search_results.get('data', {})
51+
52+ res = data.get('result', {})
53+
54+ # parse results
55+ for result in res.get('items', {}):
56+
57+ title = result['title']
58+ res_url = result['url']
59+ content = result['desc']
60+ published_date = datetime.fromtimestamp(result['date'], None)
61+
62+ # append result
63+ results.append({'url': res_url,
64+ 'title': title,
65+ 'content': content,
66+ 'publishedDate': published_date})
67+
68+ # return results
69+ return results
searx/settings.yml+16
@@ -168,6 +168,22 @@ engines:
168168 engine : piratebay
169169 shortcut : tpb
170170
171+ - name : qwant
172+ engine : qwant
173+ shortcut : qw
174+
175+ - name : qwant images
176+ engine : qwant_images
177+ shortcut : qwi
178+
179+ - name : qwant news
180+ engine : qwant_news
181+ shortcut : qwn
182+
183+ - name : qwant social
184+ engine : qwant_social
185+ shortcut : qws
186+
171187 - name : kickass
172188 engine : kickass
173189 shortcut : ka
searx/tests/engines/test_qwant.pynew file+137
@@ -0,0 +1,137 @@
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+ params = qwant.request(query, dicto)
15+ self.assertIn('url', params)
16+ self.assertIn(query, params['url'])
17+ self.assertIn('qwant.com', params['url'])
18+ self.assertIn('fr_fr', params['url'])
19+
20+ dicto['language'] = 'all'
21+ params = qwant.request(query, dicto)
22+ self.assertFalse('fr' in params['url'])
23+
24+ def test_response(self):
25+ self.assertRaises(AttributeError, qwant.response, None)
26+ self.assertRaises(AttributeError, qwant.response, [])
27+ self.assertRaises(AttributeError, qwant.response, '')
28+ self.assertRaises(AttributeError, qwant.response, '[]')
29+
30+ response = mock.Mock(text='{}')
31+ self.assertEqual(qwant.response(response), [])
32+
33+ response = mock.Mock(text='{"data": {}}')
34+ self.assertEqual(qwant.response(response), [])
35+
36+ json = """
37+ {
38+ "status": "success",
39+ "data": {
40+ "query": {
41+ "locale": "en_us",
42+ "query": "Test",
43+ "offset": 10
44+ },
45+ "result": {
46+ "items": [
47+ {
48+ "title": "Title",
49+ "score": 9999,
50+ "url": "http://www.url.xyz",
51+ "source": "...",
52+ "desc": "Description",
53+ "date": "",
54+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
55+ "favicon": "https://s.qwant.com/fav.ico"
56+ }
57+ ],
58+ "filters": []
59+ },
60+ "cache": {
61+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
62+ "created": 1433092754,
63+ "expiration": 259200,
64+ "status": "miss",
65+ "age": 0
66+ }
67+ }
68+ }
69+ """
70+ response = mock.Mock(text=json)
71+ results = qwant.response(response)
72+ self.assertEqual(type(results), list)
73+ self.assertEqual(len(results), 1)
74+ self.assertEqual(results[0]['title'], 'Title')
75+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
76+ self.assertEqual(results[0]['content'], 'Description')
77+
78+ json = """
79+ {
80+ "status": "success",
81+ "data": {
82+ "query": {
83+ "locale": "en_us",
84+ "query": "Test",
85+ "offset": 10
86+ },
87+ "result": {
88+ "filters": []
89+ },
90+ "cache": {
91+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
92+ "created": 1433092754,
93+ "expiration": 259200,
94+ "status": "miss",
95+ "age": 0
96+ }
97+ }
98+ }
99+ """
100+ response = mock.Mock(text=json)
101+ results = qwant.response(response)
102+ self.assertEqual(type(results), list)
103+ self.assertEqual(len(results), 0)
104+
105+ json = """
106+ {
107+ "status": "success",
108+ "data": {
109+ "query": {
110+ "locale": "en_us",
111+ "query": "Test",
112+ "offset": 10
113+ },
114+ "cache": {
115+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
116+ "created": 1433092754,
117+ "expiration": 259200,
118+ "status": "miss",
119+ "age": 0
120+ }
121+ }
122+ }
123+ """
124+ response = mock.Mock(text=json)
125+ results = qwant.response(response)
126+ self.assertEqual(type(results), list)
127+ self.assertEqual(len(results), 0)
128+
129+ json = """
130+ {
131+ "status": "success"
132+ }
133+ """
134+ response = mock.Mock(text=json)
135+ results = qwant.response(response)
136+ self.assertEqual(type(results), list)
137+ self.assertEqual(len(results), 0)
searx/tests/engines/test_qwant_images.pynew file+145
@@ -0,0 +1,145 @@
1+from collections import defaultdict
2+import mock
3+from searx.engines import qwant_images
4+from searx.testing import SearxTestCase
5+
6+
7+class TestQwantImagesEngine(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 = qwant_images.request(query, dicto)
15+ self.assertIn('url', params)
16+ self.assertIn(query, params['url'])
17+ self.assertIn('qwant.com', params['url'])
18+ self.assertIn('fr_fr', params['url'])
19+
20+ dicto['language'] = 'all'
21+ params = qwant_images.request(query, dicto)
22+ self.assertFalse('fr' in params['url'])
23+
24+ def test_response(self):
25+ self.assertRaises(AttributeError, qwant_images.response, None)
26+ self.assertRaises(AttributeError, qwant_images.response, [])
27+ self.assertRaises(AttributeError, qwant_images.response, '')
28+ self.assertRaises(AttributeError, qwant_images.response, '[]')
29+
30+ response = mock.Mock(text='{}')
31+ self.assertEqual(qwant_images.response(response), [])
32+
33+ response = mock.Mock(text='{"data": {}}')
34+ self.assertEqual(qwant_images.response(response), [])
35+
36+ json = """
37+ {
38+ "status": "success",
39+ "data": {
40+ "query": {
41+ "locale": "en_us",
42+ "query": "Test",
43+ "offset": 10
44+ },
45+ "result": {
46+ "items": [
47+ {
48+ "title": "Title",
49+ "type": "image",
50+ "media": "http://www.url.xyz/fullimage.jpg",
51+ "desc": "",
52+ "thumbnail": "http://www.url.xyz/thumbnail.jpg",
53+ "thumb_width": 365,
54+ "thumb_height": 230,
55+ "width": "365",
56+ "height": "230",
57+ "size": "187.7KB",
58+ "url": "http://www.url.xyz",
59+ "_id": "0ffd93fb26f3e192a6020af8fc16fbb1",
60+ "media_fullsize": "http://www.proxy/fullimage.jpg",
61+ "count": 0
62+ }
63+ ],
64+ "filters": []
65+ },
66+ "cache": {
67+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
68+ "created": 1433092754,
69+ "expiration": 259200,
70+ "status": "miss",
71+ "age": 0
72+ }
73+ }
74+ }
75+ """
76+ response = mock.Mock(text=json)
77+ results = qwant_images.response(response)
78+ self.assertEqual(type(results), list)
79+ self.assertEqual(len(results), 1)
80+ self.assertEqual(results[0]['title'], 'Title')
81+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
82+ self.assertEqual(results[0]['content'], '')
83+ self.assertEqual(results[0]['thumbnail_src'], 'http://www.url.xyz/thumbnail.jpg')
84+ self.assertEqual(results[0]['img_src'], 'http://www.url.xyz/fullimage.jpg')
85+
86+ json = """
87+ {
88+ "status": "success",
89+ "data": {
90+ "query": {
91+ "locale": "en_us",
92+ "query": "Test",
93+ "offset": 10
94+ },
95+ "result": {
96+ "filters": []
97+ },
98+ "cache": {
99+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
100+ "created": 1433092754,
101+ "expiration": 259200,
102+ "status": "miss",
103+ "age": 0
104+ }
105+ }
106+ }
107+ """
108+ response = mock.Mock(text=json)
109+ results = qwant_images.response(response)
110+ self.assertEqual(type(results), list)
111+ self.assertEqual(len(results), 0)
112+
113+ json = """
114+ {
115+ "status": "success",
116+ "data": {
117+ "query": {
118+ "locale": "en_us",
119+ "query": "Test",
120+ "offset": 10
121+ },
122+ "cache": {
123+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
124+ "created": 1433092754,
125+ "expiration": 259200,
126+ "status": "miss",
127+ "age": 0
128+ }
129+ }
130+ }
131+ """
132+ response = mock.Mock(text=json)
133+ results = qwant_images.response(response)
134+ self.assertEqual(type(results), list)
135+ self.assertEqual(len(results), 0)
136+
137+ json = """
138+ {
139+ "status": "success"
140+ }
141+ """
142+ response = mock.Mock(text=json)
143+ results = qwant_images.response(response)
144+ self.assertEqual(type(results), list)
145+ self.assertEqual(len(results), 0)
searx/tests/engines/test_qwant_news.pynew file+137
@@ -0,0 +1,137 @@
1+from collections import defaultdict
2+import mock
3+from searx.engines import qwant_news
4+from searx.testing import SearxTestCase
5+
6+
7+class TestQwantNewsEngine(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 = qwant_news.request(query, dicto)
15+ self.assertIn('url', params)
16+ self.assertIn(query, params['url'])
17+ self.assertIn('qwant.com', params['url'])
18+ self.assertIn('fr_fr', params['url'])
19+
20+ dicto['language'] = 'all'
21+ params = qwant_news.request(query, dicto)
22+ self.assertFalse('fr' in params['url'])
23+
24+ def test_response(self):
25+ self.assertRaises(AttributeError, qwant_news.response, None)
26+ self.assertRaises(AttributeError, qwant_news.response, [])
27+ self.assertRaises(AttributeError, qwant_news.response, '')
28+ self.assertRaises(AttributeError, qwant_news.response, '[]')
29+
30+ response = mock.Mock(text='{}')
31+ self.assertEqual(qwant_news.response(response), [])
32+
33+ response = mock.Mock(text='{"data": {}}')
34+ self.assertEqual(qwant_news.response(response), [])
35+
36+ json = """
37+ {
38+ "status": "success",
39+ "data": {
40+ "query": {
41+ "locale": "en_us",
42+ "query": "Test",
43+ "offset": 10
44+ },
45+ "result": {
46+ "items": [
47+ {
48+ "title": "Title",
49+ "score": 9999,
50+ "url": "http://www.url.xyz",
51+ "source": "...",
52+ "desc": "Description",
53+ "date": 1433065411,
54+ "_id": "db0aadd62c2a8565567ffc382f5c61fa",
55+ "favicon": "https://s.qwant.com/fav.ico"
56+ }
57+ ],
58+ "filters": []
59+ },
60+ "cache": {
61+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
62+ "created": 1433092754,
63+ "expiration": 259200,
64+ "status": "miss",
65+ "age": 0
66+ }
67+ }
68+ }
69+ """
70+ response = mock.Mock(text=json)
71+ results = qwant_news.response(response)
72+ self.assertEqual(type(results), list)
73+ self.assertEqual(len(results), 1)
74+ self.assertEqual(results[0]['title'], 'Title')
75+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
76+ self.assertEqual(results[0]['content'], 'Description')
77+
78+ json = """
79+ {
80+ "status": "success",
81+ "data": {
82+ "query": {
83+ "locale": "en_us",
84+ "query": "Test",
85+ "offset": 10
86+ },
87+ "result": {
88+ "filters": []
89+ },
90+ "cache": {
91+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
92+ "created": 1433092754,
93+ "expiration": 259200,
94+ "status": "miss",
95+ "age": 0
96+ }
97+ }
98+ }
99+ """
100+ response = mock.Mock(text=json)
101+ results = qwant_news.response(response)
102+ self.assertEqual(type(results), list)
103+ self.assertEqual(len(results), 0)
104+
105+ json = """
106+ {
107+ "status": "success",
108+ "data": {
109+ "query": {
110+ "locale": "en_us",
111+ "query": "Test",
112+ "offset": 10
113+ },
114+ "cache": {
115+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
116+ "created": 1433092754,
117+ "expiration": 259200,
118+ "status": "miss",
119+ "age": 0
120+ }
121+ }
122+ }
123+ """
124+ response = mock.Mock(text=json)
125+ results = qwant_news.response(response)
126+ self.assertEqual(type(results), list)
127+ self.assertEqual(len(results), 0)
128+
129+ json = """
130+ {
131+ "status": "success"
132+ }
133+ """
134+ response = mock.Mock(text=json)
135+ results = qwant_news.response(response)
136+ self.assertEqual(type(results), list)
137+ self.assertEqual(len(results), 0)
searx/tests/engines/test_qwant_social.pynew file+140
@@ -0,0 +1,140 @@
1+from collections import defaultdict
2+import mock
3+from searx.engines import qwant_social
4+from searx.testing import SearxTestCase
5+
6+
7+class TestQwantSocialEngine(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 = qwant_social.request(query, dicto)
15+ self.assertIn('url', params)
16+ self.assertIn(query, params['url'])
17+ self.assertIn('qwant.com', params['url'])
18+ self.assertIn('fr_fr', params['url'])
19+
20+ dicto['language'] = 'all'
21+ params = qwant_social.request(query, dicto)
22+ self.assertFalse('fr' in params['url'])
23+
24+ def test_response(self):
25+ self.assertRaises(AttributeError, qwant_social.response, None)
26+ self.assertRaises(AttributeError, qwant_social.response, [])
27+ self.assertRaises(AttributeError, qwant_social.response, '')
28+ self.assertRaises(AttributeError, qwant_social.response, '[]')
29+
30+ response = mock.Mock(text='{}')
31+ self.assertEqual(qwant_social.response(response), [])
32+
33+ response = mock.Mock(text='{"data": {}}')
34+ self.assertEqual(qwant_social.response(response), [])
35+
36+ json = """
37+ {
38+ "status": "success",
39+ "data": {
40+ "query": {
41+ "locale": "en_us",
42+ "query": "Test",
43+ "offset": 10
44+ },
45+ "result": {
46+ "items": [
47+ {
48+ "_id": "dc0b3f24c93684c7d7f1b0a4c2d9f1b0",
49+ "__index": 32,
50+ "title": "Title",
51+ "img": "img",
52+ "desc": "Description",
53+ "date": 1432643480,
54+ "type": "twitter",
55+ "card": "XXX",
56+ "post": "603176590856556545",
57+ "url": "http://www.url.xyz",
58+ "userUrl": "https://twitter.com/XXX"
59+ }
60+ ],
61+ "filters": []
62+ },
63+ "cache": {
64+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
65+ "created": 1433092754,
66+ "expiration": 259200,
67+ "status": "miss",
68+ "age": 0
69+ }
70+ }
71+ }
72+ """
73+ response = mock.Mock(text=json)
74+ results = qwant_social.response(response)
75+ self.assertEqual(type(results), list)
76+ self.assertEqual(len(results), 1)
77+ self.assertEqual(results[0]['title'], 'Title')
78+ self.assertEqual(results[0]['url'], 'http://www.url.xyz')
79+ self.assertEqual(results[0]['content'], 'Description')
80+
81+ json = """
82+ {
83+ "status": "success",
84+ "data": {
85+ "query": {
86+ "locale": "en_us",
87+ "query": "Test",
88+ "offset": 10
89+ },
90+ "result": {
91+ "filters": []
92+ },
93+ "cache": {
94+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
95+ "created": 1433092754,
96+ "expiration": 259200,
97+ "status": "miss",
98+ "age": 0
99+ }
100+ }
101+ }
102+ """
103+ response = mock.Mock(text=json)
104+ results = qwant_social.response(response)
105+ self.assertEqual(type(results), list)
106+ self.assertEqual(len(results), 0)
107+
108+ json = """
109+ {
110+ "status": "success",
111+ "data": {
112+ "query": {
113+ "locale": "en_us",
114+ "query": "Test",
115+ "offset": 10
116+ },
117+ "cache": {
118+ "key": "e66aa864c00147a0e3a16ff7a5efafde",
119+ "created": 1433092754,
120+ "expiration": 259200,
121+ "status": "miss",
122+ "age": 0
123+ }
124+ }
125+ }
126+ """
127+ response = mock.Mock(text=json)
128+ results = qwant_social.response(response)
129+ self.assertEqual(type(results), list)
130+ self.assertEqual(len(results), 0)
131+
132+ json = """
133+ {
134+ "status": "success"
135+ }
136+ """
137+ response = mock.Mock(text=json)
138+ results = qwant_social.response(response)
139+ self.assertEqual(type(results), list)
140+ self.assertEqual(len(results), 0)
searx/tests/test_engines.py+4
@@ -25,6 +25,10 @@ from searx.tests.engines.test_mixcloud import * # noqa
2525from searx.tests.engines.test_openstreetmap import * # noqa
2626from searx.tests.engines.test_photon import * # noqa
2727from searx.tests.engines.test_piratebay import * # noqa
28+from searx.tests.engines.test_qwant import * # noqa
29+from searx.tests.engines.test_qwant_images import * # noqa
30+from searx.tests.engines.test_qwant_news import * # noqa
31+from searx.tests.engines.test_qwant_social import * # noqa
2832from searx.tests.engines.test_searchcode_code import * # noqa
2933from searx.tests.engines.test_searchcode_doc import * # noqa
3034from searx.tests.engines.test_soundcloud import * # noqa