summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/engines/test_archlinux.py2
-rw-r--r--tests/unit/engines/test_arxiv.py2
-rw-r--r--tests/unit/engines/test_bing.py129
-rw-r--r--tests/unit/engines/test_bing_images.py23
-rw-r--r--tests/unit/engines/test_bing_news.py4
-rw-r--r--tests/unit/engines/test_bing_videos.py55
-rw-r--r--tests/unit/engines/test_btdigg.py414
-rw-r--r--tests/unit/engines/test_dailymotion.py4
-rw-r--r--tests/unit/engines/test_deviantart.py71
-rw-r--r--tests/unit/engines/test_digg.py85
-rw-r--r--tests/unit/engines/test_duckduckgo_images.py4
-rw-r--r--tests/unit/engines/test_duden.py28
-rw-r--r--tests/unit/engines/test_faroo.py4
-rw-r--r--tests/unit/engines/test_fdroid.py55
-rw-r--r--tests/unit/engines/test_flickr_noapi.py470
-rw-r--r--tests/unit/engines/test_gigablast.py7
-rw-r--r--tests/unit/engines/test_google.py156
-rw-r--r--tests/unit/engines/test_google_news.py6
-rw-r--r--tests/unit/engines/test_google_videos.py27
-rw-r--r--tests/unit/engines/test_mediawiki.py4
-rw-r--r--tests/unit/engines/test_qwant.py4
-rw-r--r--tests/unit/engines/test_seedpeer.py71
-rw-r--r--tests/unit/engines/test_startpage.py125
-rw-r--r--tests/unit/engines/test_subtitleseeker.py138
-rw-r--r--tests/unit/engines/test_swisscows.py151
-rw-r--r--tests/unit/engines/test_twitter.py6
-rw-r--r--tests/unit/engines/test_unsplash.py38
-rw-r--r--tests/unit/engines/test_wikidata.py41
-rw-r--r--tests/unit/engines/test_wikipedia.py12
-rw-r--r--tests/unit/engines/test_wolframalpha_api.py6
-rw-r--r--tests/unit/engines/test_www1x.py43
-rw-r--r--tests/unit/engines/test_yacy.py5
-rw-r--r--tests/unit/engines/test_yahoo.py7
-rw-r--r--tests/unit/engines/test_yahoo_news.py7
-rw-r--r--tests/unit/engines/test_youtube_noapi.py162
-rw-r--r--tests/unit/engines/unsplash_fixture.json241
-rw-r--r--tests/unit/test_preferences.py35
-rw-r--r--tests/unit/test_query.py42
-rw-r--r--tests/unit/test_search.py56
-rw-r--r--tests/unit/test_utils.py21
-rw-r--r--tests/unit/test_webapp.py33
41 files changed, 1245 insertions, 1549 deletions
diff --git a/tests/unit/engines/test_archlinux.py b/tests/unit/engines/test_archlinux.py
index f2ba483c1..062f023bd 100644
--- a/tests/unit/engines/test_archlinux.py
+++ b/tests/unit/engines/test_archlinux.py
@@ -4,7 +4,7 @@ from searx.engines import archlinux
from searx.testing import SearxTestCase
domains = {
- 'en': 'https://wiki.archlinux.org',
+ 'all': 'https://wiki.archlinux.org',
'de': 'https://wiki.archlinux.de',
'fr': 'https://wiki.archlinux.fr',
'ja': 'https://wiki.archlinuxjp.org',
diff --git a/tests/unit/engines/test_arxiv.py b/tests/unit/engines/test_arxiv.py
index b32c0e605..83c4f8595 100644
--- a/tests/unit/engines/test_arxiv.py
+++ b/tests/unit/engines/test_arxiv.py
@@ -8,7 +8,7 @@ from searx.testing import SearxTestCase
class TestBaseEngine(SearxTestCase):
def test_request(self):
- query = 'test_query'
+ query = 'test_query'.encode('utf-8')
dicto = defaultdict(dict)
dicto['pageno'] = 1
params = arxiv.request(query, dicto)
diff --git a/tests/unit/engines/test_bing.py b/tests/unit/engines/test_bing.py
index 48a5e744a..387034735 100644
--- a/tests/unit/engines/test_bing.py
+++ b/tests/unit/engines/test_bing.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
from collections import defaultdict
import mock
from searx.engines import bing
@@ -10,7 +11,7 @@ class TestBingEngine(SearxTestCase):
bing.supported_languages = ['en', 'fr', 'zh-CHS', 'zh-CHT', 'pt-PT', 'pt-BR']
query = u'test_query'
dicto = defaultdict(dict)
- dicto['pageno'] = 0
+ dicto['pageno'] = 1
dicto['language'] = 'fr-FR'
params = bing.request(query.encode('utf-8'), dicto)
self.assertTrue('url' in params)
@@ -18,71 +19,131 @@ class TestBingEngine(SearxTestCase):
self.assertTrue('language%3AFR' in params['url'])
self.assertTrue('bing.com' in params['url'])
+ dicto['language'] = 'all'
+ params = bing.request(query.encode('utf-8'), dicto)
+ self.assertTrue('language' in params['url'])
+
def test_response(self):
+ dicto = defaultdict(dict)
+ dicto['pageno'] = 1
+ dicto['language'] = 'fr-FR'
self.assertRaises(AttributeError, bing.response, None)
self.assertRaises(AttributeError, bing.response, [])
self.assertRaises(AttributeError, bing.response, '')
self.assertRaises(AttributeError, bing.response, '[]')
response = mock.Mock(text='<html></html>')
+ response.search_params = dicto
self.assertEqual(bing.response(response), [])
response = mock.Mock(text='<html></html>')
+ response.search_params = dicto
self.assertEqual(bing.response(response), [])
html = """
- <div class="sa_cc" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- <div Class="sa_mc">
- <div class="sb_tlst">
- <h3>
- <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
- <strong>This</strong> should be the title</a>
- </h3>
- </div>
- <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
- <span class="c_tlbxTrg">
- <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
- </span>
- </span>
- </div>
- <p><strong>This</strong> should be the content.</p>
+ <div>
+ <div id="b_tween">
+ <span class="sb_count" data-bm="4">23 900 000 résultats</span>
</div>
+ <ol id="b_results" role="main">
+ <div class="sa_cc" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
+ <div Class="sa_mc">
+ <div class="sb_tlst">
+ <h3>
+ <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
+ <strong>This</strong> should be the title</a>
+ </h3>
+ </div>
+ <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
+ <span class="c_tlbxTrg">
+ <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
+ </span>
+ </span>
+ </div>
+ <p><strong>This</strong> should be the content.</p>
+ </div>
+ </div>
+ </ol>
</div>
"""
response = mock.Mock(text=html)
+ response.search_params = dicto
results = bing.response(response)
self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
+ self.assertEqual(len(results), 2)
self.assertEqual(results[0]['title'], 'This should be the title')
self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
self.assertEqual(results[0]['content'], 'This should be the content.')
+ self.assertEqual(results[-1]['number_of_results'], 23900000)
html = """
- <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
- <div Class="sa_mc">
- <div class="sb_tlst">
- <h2>
- <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
- <strong>This</strong> should be the title</a>
- </h2>
- </div>
- <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
- <span class="c_tlbxTrg">
- <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
- </span>
- </span>
- </div>
- <p><strong>This</strong> should be the content.</p>
+ <div>
+ <div id="b_tween">
+ <span class="sb_count" data-bm="4">9-18 résultats sur 23 900 000</span>
</div>
- </li>
+ <ol id="b_results" role="main">
+ <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
+ <div Class="sa_mc">
+ <div class="sb_tlst">
+ <h2>
+ <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
+ <strong>This</strong> should be the title</a>
+ </h2>
+ </div>
+ <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
+ <span class="c_tlbxTrg">
+ <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
+ </span>
+ </span>
+ </div>
+ <p><strong>This</strong> should be the content.</p>
+ </div>
+ </li>
+ </ol>
+ </div>
"""
+ dicto['pageno'] = 2
response = mock.Mock(text=html)
+ response.search_params = dicto
results = bing.response(response)
self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
+ self.assertEqual(len(results), 2)
self.assertEqual(results[0]['title'], 'This should be the title')
self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
self.assertEqual(results[0]['content'], 'This should be the content.')
+ self.assertEqual(results[-1]['number_of_results'], 23900000)
+
+ html = """
+ <div>
+ <div id="b_tween">
+ <span class="sb_count" data-bm="4">23 900 000 résultats</span>
+ </div>
+ <ol id="b_results" role="main">
+ <li class="b_algo" u="0|5109|4755453613245655|UAGjXgIrPH5yh-o5oNHRx_3Zta87f_QO">
+ <div Class="sa_mc">
+ <div class="sb_tlst">
+ <h2>
+ <a href="http://this.should.be.the.link/" h="ID=SERP,5124.1">
+ <strong>This</strong> should be the title</a>
+ </h2>
+ </div>
+ <div class="sb_meta"><cite><strong>this</strong>.meta.com</cite>
+ <span class="c_tlbxTrg">
+ <span class="c_tlbxH" H="BASE:CACHEDPAGEDEFAULT" K="SERP,5125.1">
+ </span>
+ </span>
+ </div>
+ <p><strong>This</strong> should be the content.</p>
+ </div>
+ </li>
+ </ol>
+ </div>
+ """
+ dicto['pageno'] = 33900000
+ response = mock.Mock(text=html)
+ response.search_params = dicto
+ results = bing.response(response)
+ self.assertEqual(bing.response(response), [])
def test_fetch_supported_languages(self):
html = """<html></html>"""
diff --git a/tests/unit/engines/test_bing_images.py b/tests/unit/engines/test_bing_images.py
index afc4cd6f0..a4efcab58 100644
--- a/tests/unit/engines/test_bing_images.py
+++ b/tests/unit/engines/test_bing_images.py
@@ -9,6 +9,7 @@ class TestBingImagesEngine(SearxTestCase):
def test_request(self):
bing_images.supported_languages = ['fr-FR', 'en-US']
+ bing_images.language_aliases = {}
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 1
@@ -52,17 +53,25 @@ class TestBingImagesEngine(SearxTestCase):
<li>
<div>
<div class="imgpt">
- <a m='{"purl":"page_url","murl":"img_url"}' mad='{"turl":"thumb_url"}'>
+ <a m='{"purl":"page_url","murl":"img_url","turl":"thumb_url","t":"Page 1 title"}'>
<img src="" alt="alt text" />
</a>
+ <div class="img_info">
+ <span>1 x 1 - jpeg</span>
+ <a>1.example.org</a>
+ </div>
</div>
<div></div>
</div>
<div>
<div class="imgpt">
- <a m='{"purl":"page_url2","murl":"img_url2"}' mad='{"turl":"thumb_url2"}'>
+ <a m='{"purl":"page_url2","murl":"img_url2","turl":"thumb_url2","t":"Page 2 title"}'>
<img src="" alt="alt text 2" />
</a>
+ <div class="img_info">
+ <span>2 x 2 - jpeg</span>
+ <a>2.example.org</a>
+ </div>
</div>
</div>
</li>
@@ -71,9 +80,13 @@ class TestBingImagesEngine(SearxTestCase):
<li>
<div>
<div class="imgpt">
- <a m='{"purl":"page_url3","murl":"img_url3"}' mad='{"turl":"thumb_url3"}'>
+ <a m='{"purl":"page_url3","murl":"img_url3","turl":"thumb_url3","t":"Page 3 title"}'>
<img src="" alt="alt text 3" />
</a>
+ <div class="img_info">
+ <span>3 x 3 - jpeg</span>
+ <a>3.example.org</a>
+ </div>
</div>
</div>
</li>
@@ -85,11 +98,13 @@ class TestBingImagesEngine(SearxTestCase):
results = bing_images.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'alt text')
+ self.assertEqual(results[0]['title'], 'Page 1 title')
self.assertEqual(results[0]['url'], 'page_url')
self.assertEqual(results[0]['content'], '')
self.assertEqual(results[0]['thumbnail_src'], 'thumb_url')
self.assertEqual(results[0]['img_src'], 'img_url')
+ self.assertEqual(results[0]['img_format'], '1 x 1 - jpeg')
+ self.assertEqual(results[0]['source'], '1.example.org')
def test_fetch_supported_languages(self):
html = """
diff --git a/tests/unit/engines/test_bing_news.py b/tests/unit/engines/test_bing_news.py
index 8fc26ee32..1155e79c4 100644
--- a/tests/unit/engines/test_bing_news.py
+++ b/tests/unit/engines/test_bing_news.py
@@ -20,6 +20,10 @@ class TestBingNewsEngine(SearxTestCase):
self.assertIn('bing.com', params['url'])
self.assertIn('fr', params['url'])
+ dicto['language'] = 'all'
+ params = bing_news.request(query, dicto)
+ self.assertIn('en', params['url'])
+
def test_no_url_in_request_year_time_range(self):
dicto = defaultdict(dict)
query = 'test_query'
diff --git a/tests/unit/engines/test_bing_videos.py b/tests/unit/engines/test_bing_videos.py
index 24387c888..5e171eb53 100644
--- a/tests/unit/engines/test_bing_videos.py
+++ b/tests/unit/engines/test_bing_videos.py
@@ -9,6 +9,7 @@ class TestBingVideosEngine(SearxTestCase):
def test_request(self):
bing_videos.supported_languages = ['fr-FR', 'en-US']
+ bing_videos.language_aliases = {}
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 1
@@ -28,7 +29,7 @@ class TestBingVideosEngine(SearxTestCase):
dicto['time_range'] = 'day'
dicto['safesearch'] = 2
params = bing_videos.request(query, dicto)
- self.assertTrue('first=11' in params['url'])
+ self.assertTrue('first=29' in params['url'])
self.assertTrue('1440' in params['url'])
self.assertIn('SRCHHPGUSR', params['cookies'])
self.assertTrue('STRICT' in params['cookies']['SRCHHPGUSR'])
@@ -47,53 +48,25 @@ class TestBingVideosEngine(SearxTestCase):
html = """
<div class="dg_u">
- <div id="mc_vtvc_1" class="mc_vtvc">
- <a class="mc_vtvc_link" href="/video">
- <div class="mc_vtvc_th">
- <div class="cico">
- <img src="thumb_1.jpg" />
- </div>
- <div class="mc_vtvc_ban_lo">
- <div class="vtbc">
- <div class="mc_bc_w b_smText">
- <div class="mc_bc pivot bpi_2">
- <span title="">
- <span class="mv_vtvc_play cipg "></span>
- </span>
- </div>
- <div class="mc_bc items">10:06</div>
- </div>
+ <div>
+ <a>
+ <div>
+ <div>
+ <div class="mc_vtvc_meta_block">
+ <div><span>100 views</span><span>1 year ago</span></div><div><span>ExampleTube</span><span>Channel 1<span></div> #noqa
</div>
</div>
- </div>
- <div class="mc_vtvc_meta">
- <div class="mc_vtvc_title" title="Title 1"></div>
- <div class="mc_vtvc_meta_block_area">
- <div class="mc_vtvc_meta_block">
- <div class="mc_vtvc_meta_row">
- <span>65,696,000+ views</span>
- <span>1 year ago</span>
- </div>
- <div class="mc_vtvc_meta_row mc_vtvc_meta_row_channel">Content 1</div>
- <div class="mc_vtvc_meta_row"><span>
- <div class="cico mc_vtvc_src_ico">
- <div></div>
- </div>
- <span>YouTube</span>
- </span></div>
- </div>
- </div>
+ <div class="vrhdata" vrhm='{"du":"01:11","murl":"https://www.example.com/watch?v=DEADBEEF","thid":"OVP.BINGTHUMB1","vt":"Title 1"}'></div> # noqa
</div>
- <div class="vrhdata"></div>
- </a>
- </div>
+ </a>
</div>
+ </div>
"""
response = mock.Mock(text=html)
results = bing_videos.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['title'], 'Title 1')
- self.assertEqual(results[0]['url'], 'https://bing.com/video')
- self.assertEqual(results[0]['content'], 'Content 1')
- self.assertEqual(results[0]['thumbnail'], 'thumb_1.jpg')
+ self.assertEqual(results[0]['url'], 'https://www.example.com/watch?v=DEADBEEF')
+ self.assertEqual(results[0]['content'], '01:11 - 100 views - 1 year ago - ExampleTube - Channel 1')
+ self.assertEqual(results[0]['thumbnail'], 'https://www.bing.com/th?id=OVP.BINGTHUMB1')
diff --git a/tests/unit/engines/test_btdigg.py b/tests/unit/engines/test_btdigg.py
index 6a88e3f75..45ddaa6e3 100644
--- a/tests/unit/engines/test_btdigg.py
+++ b/tests/unit/engines/test_btdigg.py
@@ -14,7 +14,7 @@ class TestBtdiggEngine(SearxTestCase):
params = btdigg.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
- self.assertIn('btdigg.org', params['url'])
+ self.assertIn('btdig.com', params['url'])
def test_response(self):
self.assertRaises(AttributeError, btdigg.response, None)
@@ -26,359 +26,87 @@ class TestBtdiggEngine(SearxTestCase):
self.assertEqual(btdigg.response(response), [])
html = u"""
- <div id="search_res">
- <table>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">8 B</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">5</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- </table>
+ <div class="one_result" style="display:table-row;background-color:#e8e8e8">
+ <div style="display:table-cell;color:rgb(0, 0, 0)">
+ <div style="display:table">
+ <div style="display:table-row">
+ <div class="torrent_name" style="display:table-cell">
+ <a style="color:rgb(0, 0, 204);text-decoration:underline;font-size:150%"
+ href="http://btdig.com/a72f35b7ee3a10928f02bb799e40ae5db701ed1c/pdf?q=pdf&amp;p=1&amp;order=0"
+ >3.9GBdeLibrosByHuasoFromHell(3de4)</a>
+ </div>
+ </div>
+ </div>
+ <div style="display:table">
+ <div style="display:table-row">
+ <div style="display:table-cell">
+ <span class="torrent_files" style="color:#666;padding-left:10px">4217</span> files <span
+ class="torrent_size" style="color:#666;padding-left:10px">1 GB</span><span
+ class="torrent_age" style="color:rgb(0, 102, 0);padding-left:10px;margin: 0px 4px"
+ >found 3 years ago</span>
+ </div>
+ </div>
+ </div>
+ <div style="display:table;width:100%;padding:10px">
+ <div style="display:table-row">
+ <div class="torrent_magnet" style="display:table-cell">
+ <div class="fa fa-magnet" style="color:#cc0000">
+ <a href="magnet:?xt=urn:btih:a72f35b7ee3a10928f02bb799e40ae5db701ed1c&amp;dn=3.9GBdeLibrosBy..."
+ title="Download via magnet-link"> magnet:?xt=urn:btih:a72f35b7ee...</a>
+ </div>
+ </div>
+ <div style="display:table-cell;color:rgb(0, 0, 0);text-align:right">
+ <span style="color:rgb(136, 136, 136);margin: 0px 0px 0px 4px"></span><span
+ style="color:rgb(0, 102, 0);margin: 0px 4px">found 3 years ago</span>
+ </div>
+ </div>
+ </div>
+ <div class="torrent_excerpt" style="display:table;padding:10px;white-space:nowrap">
+ <div class="fa fa-folder-open" style="padding-left:0em"> 3.9GBdeLibrosByHuasoFromHell(3de4)</div><br/>
+ <div class="fa fa-folder-open" style="padding-left:1em"> Libros H-Z</div><br/>
+ <div class="fa fa-folder-open" style="padding-left:2em"> H</div><br/><div class="fa fa-file-archive-o"
+ style="padding-left:3em"> H.H. Hollis - El truco de la espada-<b
+ style="color:red; background-color:yellow">pdf</b>.zip</div><span
+ style="color:#666;padding-left:10px">17 KB</span><br/>
+ <div class="fa fa-file-archive-o" style="padding-left:3em"> Hagakure - El Libro del Samurai-<b
+ style="color:red; background-color:yellow">pdf</b>.zip</div><span
+ style="color:#666;padding-left:10px">95 KB</span><br/>
+ <div class="fa fa-folder-open" style="padding-left:3em"> Hamsun, Knut (1859-1952)</div><br/>
+ <div class="fa fa-file-archive-o" style="padding-left:4em"> Hamsun, Knut - Hambre-<b
+ style="color:red; background-color:yellow">pdf</b>.zip</div><span
+ style="color:#666;padding-left:10px">786 KB</span><br/>
+ <div class="fa fa-plus-circle"><a
+ href="http://btdig.com/a72f35b7ee3a10928f02bb799e40ae5db701ed1c/pdf?q=pdf&amp;p=1&amp;order=0"
+ > 4214 hidden files<span style="color:#666;padding-left:10px">1 GB</span></a></div>
+ </div>
+ </div>
</div>
"""
response = mock.Mock(text=html.encode('utf-8'))
results = btdigg.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Should be the title')
- self.assertEqual(results[0]['url'], 'https://btdigg.org/url')
- self.assertEqual(results[0]['content'], 'Content')
- self.assertEqual(results[0]['seed'], 5)
- self.assertEqual(results[0]['leech'], 0)
- self.assertEqual(results[0]['filesize'], 8)
- self.assertEqual(results[0]['files'], 710)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:magnet&dn=Test')
+ self.assertEqual(results[0]['title'], '3.9GBdeLibrosByHuasoFromHell(3de4)')
+ self.assertEqual(results[0]['url'],
+ 'http://btdig.com/a72f35b7ee3a10928f02bb799e40ae5db701ed1c/pdf?q=pdf&p=1&order=0')
+ self.assertEqual(results[0]['content'],
+ '3.9GBdeLibrosByHuasoFromHell(3de4) | ' +
+ 'Libros H-Z | ' +
+ 'H H.H. Hollis - El truco de la espada-pdf.zip17 KB | ' +
+ 'Hagakure - El Libro del Samurai-pdf.zip95 KB | ' +
+ 'Hamsun, Knut (1859-1952) | Hamsun, Knut - Hambre-pdf.zip786 KB | ' +
+ '4214 hidden files1 GB')
+ self.assertEqual(results[0]['filesize'], 1 * 1024 * 1024 * 1024)
+ self.assertEqual(results[0]['files'], 4217)
+ self.assertEqual(results[0]['magnetlink'],
+ 'magnet:?xt=urn:btih:a72f35b7ee3a10928f02bb799e40ae5db701ed1c&dn=3.9GBdeLibrosBy...')
html = """
- <div id="search_res">
- <table>
- </table>
- </div>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = btdigg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
+ <div style="display:table-row;background-color:#e8e8e8">
- html = u"""
- <div id="search_res">
- <table>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 KB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">5</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 MB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">a</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">4</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 GB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">3</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">1 TB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">2</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- <tr>
- <td class="idx">1</td>
- <td>
- <table class="torrent_name_tbl">
- <tr>
- <td class="torrent_name">
- <a href="/url">Should be the title</a>
- </td>
- </tr>
- </table>
- <table class="torrent_name_tbl">
- <tr>
- <td class="ttth">
- <a onclick="fclck(this.href)" href="magnet:?xt=urn:btih:magnet&amp;dn=Test"
- title="Télécharger des liens Magnet">[magnet]</a>
- </td>
- <td class="ttth">
- <a href="https://btcloud.io/manager?cmd=add&amp;info_hash=hash"
- target="_blank" title="Ajouter à BTCloud">[cloud]</a>
- </td>
- <td>
- <span class="attr_name">Taille:</span>
- <span class="attr_val">a TB</span>
- </td>
- <td>
- <span class="attr_name">Fichiers:</span>
- <span class="attr_val">710</span>
- </td>
- <td>
- <span class="attr_name">Téléchargements:</span>
- <span class="attr_val">z</span>
- </td>
- <td>
- <span class="attr_name">Temps:</span>
- <span class="attr_val">417.8&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Dernière&nbsp;mise&nbsp;à&nbsp;jour:</span>
- <span class="attr_val">5.3&nbsp;jours</span>
- </td>
- <td>
- <span class="attr_name">Faux:</span>
- <span class="attr_val">Aucun</span>
- </td>
- </tr>
- </table>
- <pre class="snippet">
- Content
- </pre>
- </td>
- </tr>
- </table>
</div>
"""
response = mock.Mock(text=html.encode('utf-8'))
results = btdigg.response(response)
self.assertEqual(type(results), list)
- self.assertEqual(len(results), 5)
- self.assertEqual(results[0]['title'], 'Should be the title')
- self.assertEqual(results[0]['url'], 'https://btdigg.org/url')
- self.assertEqual(results[0]['content'], 'Content')
- self.assertEqual(results[0]['seed'], 5)
- self.assertEqual(results[0]['leech'], 0)
- self.assertEqual(results[0]['files'], 710)
- self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:magnet&dn=Test')
- self.assertEqual(results[0]['filesize'], 1024)
- self.assertEqual(results[1]['filesize'], 1048576)
- self.assertEqual(results[2]['filesize'], 1073741824)
- self.assertEqual(results[3]['filesize'], 1099511627776)
+ self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_dailymotion.py b/tests/unit/engines/test_dailymotion.py
index 803b5c4d2..ad7f3d283 100644
--- a/tests/unit/engines/test_dailymotion.py
+++ b/tests/unit/engines/test_dailymotion.py
@@ -19,6 +19,10 @@ class TestDailymotionEngine(SearxTestCase):
self.assertTrue('dailymotion.com' in params['url'])
self.assertTrue('fr' in params['url'])
+ dicto['language'] = 'all'
+ params = dailymotion.request(query, dicto)
+ self.assertTrue('en' in params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, dailymotion.response, None)
self.assertRaises(AttributeError, dailymotion.response, [])
diff --git a/tests/unit/engines/test_deviantart.py b/tests/unit/engines/test_deviantart.py
index bd2cf182f..a31151037 100644
--- a/tests/unit/engines/test_deviantart.py
+++ b/tests/unit/engines/test_deviantart.py
@@ -22,74 +22,3 @@ class TestDeviantartEngine(SearxTestCase):
dicto['time_range'] = 'year'
params = deviantart.request(query, dicto)
self.assertEqual({}, params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, deviantart.response, None)
- self.assertRaises(AttributeError, deviantart.response, [])
- self.assertRaises(AttributeError, deviantart.response, '')
- self.assertRaises(AttributeError, deviantart.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(deviantart.response(response), [])
-
- response = mock.Mock(status_code=302)
- self.assertEqual(deviantart.response(response), [])
-
- html = """
- <div id="page-1-results" class="page-results results-page-thumb torpedo-container">
- <span class="thumb wide" href="http://amai911.deviantart.com/art/Horse-195212845"
- data-super-full-width="900" data-super-full-height="600">
- <a class="torpedo-thumb-link" href="https://url.of.image">
- <img data-sigil="torpedo-img" src="https://url.of.thumbnail" />
- </a>
- <span class="info"><span class="title-wrap"><span class="title">Title of image</span></span>
- </div>
- """
- response = mock.Mock(text=html)
- results = deviantart.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of image')
- self.assertEqual(results[0]['url'], 'https://url.of.image')
- self.assertNotIn('content', results[0])
- self.assertEqual(results[0]['thumbnail_src'], 'https://url.of.thumbnail')
-
- html = """
- <span class="tt-fh-tc" style="width: 202px;">
- <span class="tt-bb" style="width: 202px;">
- </span>
- <span class="shadow">
- <a class="thumb" href="http://url.of.result/2nd.part.of.url"
- title="Behoimi BE Animation Test by test-0, Jan 4,
- 2010 in Digital Art &gt; Animation"> <i></i>
- <img width="200" height="200" alt="Test"
- src="http://url.of.thumbnail" data-src="http://th08.deviantart.net/test.jpg">
- </a>
- </span>
- <!-- ^TTT -->
- </span>
- <span class="details">
- <a href="http://test-0.deviantart.com/art/Test" class="t"
- title="Behoimi BE Animation Test by test-0, Jan 4, 2010">
- <span class="tt-fh-oe">Title of image</span> </a>
- <small>
- <span class="category">
- <span class="age">
- 5 years ago
- </span>
- in <a title="Behoimi BE Animation Test by test-0, Jan 4, 2010"
- href="http://www.deviantart.com/browse/all/digitalart/animation/">Animation</a>
- </span>
- <div class="commentcount">
- <a href="http://test-0.deviantart.com/art/Test#comments">
- <span class="iconcommentsstats"></span>9 Comments</a>
- </div>
- <a class="mlt-link" href="http://www.deviantart.com/morelikethis/149167425">
- <span class="mlt-icon"></span> <span class="mlt-text">More Like This</span> </a>
- </span>
- </small> <!-- TTT$ -->
- """
- response = mock.Mock(text=html)
- results = deviantart.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_digg.py b/tests/unit/engines/test_digg.py
index 6e7c9cc99..8bc4c67c2 100644
--- a/tests/unit/engines/test_digg.py
+++ b/tests/unit/engines/test_digg.py
@@ -14,88 +14,3 @@ class TestDiggEngine(SearxTestCase):
self.assertIn('url', params)
self.assertIn(query, params['url'])
self.assertIn('digg.com', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, digg.response, None)
- self.assertRaises(AttributeError, digg.response, [])
- self.assertRaises(AttributeError, digg.response, '')
- self.assertRaises(AttributeError, digg.response, '[]')
-
- response = mock.Mock(text='{}')
- self.assertEqual(digg.response(response), [])
-
- response = mock.Mock(text='{"data": []}')
- self.assertEqual(digg.response(response), [])
-
- json = """
- {
- "status": "ok",
- "num": 10,
- "next_position": 20,
- "html": "<article itemscope itemtype=\\"http://schema.org/Article\\"
- class=\\"story-container digg-story-el hentry entry story-1sRANah col-1\\"
- data-content-id=\\"1sRANah\\" data-contenturl=\\"http://url.of.link\\"
- data-position=\\"0\\" data-diggs=\\"24\\" data-tweets=\\"69\\"
- data-digg-score=\\"1190\\"> <div class=\\"story-image story-image-thumb\\">
- <a data-position=\\"0\\" data-content-id=\\"1sRANah\\"
- class=\\"story-link\\" href=\\"http://www.thedailybeast.com/\\"
- target=\\"_blank\\"><img class=\\"story-image-img\\"
- src=\\"http://url.of.image.jpeg\\" width=\\"312\\" height=\\"170\\"
- alt=\\"\\" /> </a> </div> <div class=\\"story-content\\"><header
- class=\\"story-header\\"> <div itemprop=\\"alternativeHeadline\\"
- class=\\"story-kicker\\" >Kicker</div> <h2 itemprop=\\"headline\\"
- class=\\"story-title entry-title\\"><a class=\\"story-title-link story-link\\"
- rel=\\"bookmark\\" itemprop=\\"url\\" href=\\"http://www.thedailybeast.com/\\"
- target=\\"_blank\\">Title of article</h2> <div class=\\"story-meta\\">
- <div class=\\"story-score \\">
- <div class=\\"story-score-diggscore diggscore-1sRANah\\">1190</div>
- <div class=\\"story-score-details\\"> <div class=\\"arrow\\"></div>
- <ul class=\\"story-score-details-list\\"> <li
- class=\\"story-score-detail story-score-diggs\\"><span
- class=\\"label\\">Diggs:</span> <span class=\\"count diggs-1sRANah\\">24</span>
- </li> <li class=\\"story-score-detail story-score-twitter\\"><span
- class=\\"label\\">Tweets:</span> <span class=\\"count tweets-1sRANah\\">69</span>
- </li> <li class=\\"story-score-detail story-score-facebook\\"><span
- class=\\"label\\">Facebook Shares:</span> <span
- class=\\"count fb_shares-1sRANah\\">1097</span></li> </ul> </div> </div>
- <span class=\\"story-meta-item story-source\\"> <a
- itemprop=\\"publisher copyrightHolder sourceOrganization provider\\"
- class=\\"story-meta-item-link story-source-link\\"
- href=\\"/source/thedailybeast.com\\">The Daily Beast </a> </span>
- <span class=\\"story-meta-item story-tag first-tag\\"> <a
- itemprop=\\"keywords\\" rel=\\"tag\\"
- class=\\"story-meta-item-link story-tag-link\\" href=\\"/tag/news\\">News</a>
- </span> <abbr class=\\"published story-meta-item story-timestamp\\"
- title=\\"2014-10-18 14:53:45\\"> <time datetime=\\"2014-10-18 14:53:45\\">18 Oct 2014</time>
- </abbr> </div> </header> </div> <ul class=\\"story-actions\\"> <li
- class=\\"story-action story-action-digg btn-story-action-container\\">
- <a class=\\"target digg-1sRANah\\" href=\\"#\\">Digg</a></li> <li
- class=\\"story-action story-action-save btn-story-action-container\\">
- <a class=\\"target save-1sRANah\\" href=\\"#\\">Save</a></li> <li
- class=\\"story-action story-action-share\\"><a
- class=\\"target share-facebook\\" href=\\"https://www.facebook.com/\\">Facebook</a></li>
- <li class=\\"story-action story-action-share\\"><a class=\\"target share-twitter\\"
- href=\\"https://twitter.com/\\">Twitter</a></li> </ul> </article>"
- }
- """
- json = json.replace('\r\n', '').replace('\n', '').replace('\r', '')
- response = mock.Mock(text=json)
- results = digg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'Title of article')
- self.assertEqual(results[0]['url'], 'http://url.of.link')
- self.assertEqual(results[0]['thumbnail'], 'http://url.of.image.jpeg')
- self.assertEqual(results[0]['content'], '')
-
- json = """
- {
- "status": "error",
- "num": 10,
- "next_position": 20
- }
- """
- response = mock.Mock(text=json)
- results = digg.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_duckduckgo_images.py b/tests/unit/engines/test_duckduckgo_images.py
index 5301057fd..0d152bec1 100644
--- a/tests/unit/engines/test_duckduckgo_images.py
+++ b/tests/unit/engines/test_duckduckgo_images.py
@@ -14,7 +14,7 @@ class TestDuckduckgoImagesEngine(SearxTestCase):
dicto['is_test'] = True
dicto['pageno'] = 1
dicto['safesearch'] = 0
- dicto['language'] = 'en-US'
+ dicto['language'] = 'all'
params = duckduckgo_images.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
@@ -41,7 +41,7 @@ class TestDuckduckgoImagesEngine(SearxTestCase):
self.assertRaises(AttributeError, duckduckgo_images.response, '[]')
response = mock.Mock(text='If this error persists, please let us know: ops@duckduckgo.com')
- self.assertEqual(duckduckgo_images.response(response), [])
+ self.assertRaises(Exception, duckduckgo_images.response, response)
json = u"""
{
diff --git a/tests/unit/engines/test_duden.py b/tests/unit/engines/test_duden.py
index d9bbfef8b..52fc513d0 100644
--- a/tests/unit/engines/test_duden.py
+++ b/tests/unit/engines/test_duden.py
@@ -10,24 +10,30 @@ class TestDudenEngine(SearxTestCase):
def test_request(self):
query = 'Haus'
dic = defaultdict(dict)
- dic['pageno'] = 1
- params = duden.request(query, dic)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('duden.de' in params['url'])
+ data = [
+ [1, 'https://www.duden.de/suchen/dudenonline/Haus'],
+ [2, 'https://www.duden.de/suchen/dudenonline/Haus?search_api_fulltext=&page=1']
+ ]
+ for page_no, exp_res in data:
+ dic['pageno'] = page_no
+ params = duden.request(query, dic)
+ self.assertTrue('url' in params)
+ self.assertTrue(query in params['url'])
+ self.assertTrue('duden.de' in params['url'])
+ self.assertEqual(params['url'], exp_res)
def test_response(self):
resp = mock.Mock(text='<html></html>')
self.assertEqual(duden.response(resp), [])
html = """
- <section class="wide">
- <h2><a href="https://this.is.the.url/" class="hidden-link"><strong>This is the title</strong> also here</a></h2>
- <p>This is the <strong>content</strong></p>
- <a href="https://this.is.the.url/">Zum vollst&auml;ndigen Artikel</a>
+ <section class="vignette">
+ <h2"> <a href="/rechtschreibung/Haus">
+ <strong>This is the title also here</strong>
+ </a> </h2>
+ <p>This is the content</p>
</section>
"""
-
resp = mock.Mock(text=html)
results = duden.response(resp)
@@ -36,6 +42,6 @@ class TestDudenEngine(SearxTestCase):
# testing result (dictionary entry)
r = results[0]
- self.assertEqual(r['url'], 'https://this.is.the.url/')
+ self.assertEqual(r['url'], 'https://www.duden.de/rechtschreibung/Haus')
self.assertEqual(r['title'], 'This is the title also here')
self.assertEqual(r['content'], 'This is the content')
diff --git a/tests/unit/engines/test_faroo.py b/tests/unit/engines/test_faroo.py
index 0cc8bc3e0..1bd9f51c3 100644
--- a/tests/unit/engines/test_faroo.py
+++ b/tests/unit/engines/test_faroo.py
@@ -20,6 +20,10 @@ class TestFarooEngine(SearxTestCase):
self.assertIn('en', params['url'])
self.assertIn('web', params['url'])
+ dicto['language'] = 'all'
+ params = faroo.request(query, dicto)
+ self.assertIn('en', params['url'])
+
dicto['language'] = 'de-DE'
params = faroo.request(query, dicto)
self.assertIn('de', params['url'])
diff --git a/tests/unit/engines/test_fdroid.py b/tests/unit/engines/test_fdroid.py
index d75f4f0b4..42a0a7148 100644
--- a/tests/unit/engines/test_fdroid.py
+++ b/tests/unit/engines/test_fdroid.py
@@ -13,29 +13,40 @@ class TestFdroidEngine(SearxTestCase):
params = fdroid.request(query, dic)
self.assertTrue('url' in params)
self.assertTrue(query in params['url'])
- self.assertTrue('f-droid.org' in params['url'])
+ self.assertTrue('search.f-droid.org' in params['url'])
- def test_response(self):
+ def test_response_empty(self):
resp = mock.Mock(text='<html></html>')
self.assertEqual(fdroid.response(resp), [])
+ def test_response_oneresult(self):
html = """
- <a href="https://google.com/qwerty">
- <div id="appheader">
- <div style="float:left;padding-right:10px;">
- <img src="http://example.com/image.png"
- style="width:48px;border:none;">
- </div>
- <div style="float:right;">
- <p>Details...</p>
- </div>
- <p style="color:#000000;">
- <span style="font-size:20px;">Sample title</span>
- <br>
- Sample content
- </p>
- </div>
- </a>
+<!DOCTYPE html>
+<html>
+<head>
+ <title>test</title>
+</head>
+<body>
+ <div class="site-wrapper">
+ <div class="main-content">
+ <a class="package-header" href="https://example.com/app.url">
+ <img class="package-icon" src="https://example.com/appexample.logo.png" />
+
+ <div class="package-info">
+ <h4 class="package-name">
+ App Example 1
+ </h4>
+
+ <div class="package-desc">
+ <span class="package-summary">Description App Example 1</span>
+ <span class="package-license">GPL-3.0-only</span>
+ </div>
+ </div>
+ </a>
+ </div>
+ </div>
+</body>
+</html>
"""
resp = mock.Mock(text=html)
@@ -43,7 +54,7 @@ class TestFdroidEngine(SearxTestCase):
self.assertEqual(type(results), list)
self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://google.com/qwerty')
- self.assertEqual(results[0]['title'], 'Sample title')
- self.assertEqual(results[0]['content'], 'Sample content')
- self.assertEqual(results[0]['img_src'], 'http://example.com/image.png')
+ self.assertEqual(results[0]['url'], 'https://example.com/app.url')
+ self.assertEqual(results[0]['title'], 'App Example 1')
+ self.assertEqual(results[0]['content'], 'Description App Example 1 - GPL-3.0-only')
+ self.assertEqual(results[0]['img_src'], 'https://example.com/appexample.logo.png')
diff --git a/tests/unit/engines/test_flickr_noapi.py b/tests/unit/engines/test_flickr_noapi.py
index 5f8b069e3..67699f2f0 100644
--- a/tests/unit/engines/test_flickr_noapi.py
+++ b/tests/unit/engines/test_flickr_noapi.py
@@ -27,116 +27,132 @@ class TestFlickrNoapiEngine(SearxTestCase):
self.assertRaises(AttributeError, flickr_noapi.response, '')
self.assertRaises(AttributeError, flickr_noapi.response, '[]')
- response = mock.Mock(text='"search-photos-lite-models","photos":{},"totalItems":')
+ response = mock.Mock(text='"modelExport:{"legend":[],"main":{"search-photos-lite-models":[{"photos":{}}]}}')
self.assertEqual(flickr_noapi.response(response), [])
- response = mock.Mock(text='search-photos-lite-models","photos":{"data": []},"totalItems":')
+ response = \
+ mock.Mock(text='"modelExport:{"legend":[],"main":{"search-photos-lite-models":[{"photos":{"_data":[]}}]}}')
self.assertEqual(flickr_noapi.response(response), [])
# everthing is ok test
json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "c": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_c.jpg",
- "width": 541,
- "height": 800,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_c.jpg",
- "key": "c"
- },
- "h": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_761d32237a_h.jpg",
- "width": 1081,
- "height": 1600,
- "url": "//c4.staticflickr.com/8/7246/14001294434_761d32237a_h.jpg",
- "key": "h"
- },
- "k": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_f145a2c11a_k.jpg",
- "width": 1383,
- "height": 2048,
- "url": "//c4.staticflickr.com/8/7246/14001294434_f145a2c11a_k.jpg",
- "key": "k"
- },
- "l": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_b.jpg",
- "width": 692,
- "height": 1024,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_b.jpg",
- "key": "l"
- },
- "m": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777.jpg",
- "width": 338,
- "height": 500,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777.jpg",
- "key": "m"
- },
- "n": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_n.jpg",
- "width": 216,
- "height": 320,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_n.jpg",
- "key": "n"
- },
- "q": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_q.jpg",
- "width": 150,
- "height": 150,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_q.jpg",
- "key": "q"
- },
- "s": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_m.jpg",
- "width": 162,
- "height": 240,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_m.jpg",
- "key": "s"
- },
- "sq": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_s.jpg",
- "width": 75,
- "height": 75,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_s.jpg",
- "key": "sq"
- },
- "t": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_t.jpg",
- "width": 68,
- "height": 100,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_t.jpg",
- "key": "t"
- },
- "z": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
- "key": "z"
+ modelExport: {
+ "legend": [
+ [
+ "search-photos-lite-models",
+ "0",
+ "photos",
+ "_data",
+ "0"
+ ]
+ ],
+ "main": {
+ "search-photos-lite-models": [
+ {
+ "photos": {
+ "_data": [
+ {
+ "_flickrModelRegistry": "photo-lite-models",
+ "title": "This%20is%20the%20title",
+ "username": "Owner",
+ "pathAlias": "klink692",
+ "realname": "Owner",
+ "license": 0,
+ "ownerNsid": "59729010@N00",
+ "canComment": false,
+ "commentCount": 14,
+ "faveCount": 21,
+ "id": "14001294434",
+ "sizes": {
+ "c": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_c.jpg",
+ "width": 541,
+ "height": 800,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_c.jpg",
+ "key": "c"
+ },
+ "h": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_761d32237a_h.jpg",
+ "width": 1081,
+ "height": 1600,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_761d32237a_h.jpg",
+ "key": "h"
+ },
+ "k": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_f145a2c11a_k.jpg",
+ "width": 1383,
+ "height": 2048,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_f145a2c11a_k.jpg",
+ "key": "k"
+ },
+ "l": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_b.jpg",
+ "width": 692,
+ "height": 1024,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_b.jpg",
+ "key": "l"
+ },
+ "m": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777.jpg",
+ "width": 338,
+ "height": 500,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777.jpg",
+ "key": "m"
+ },
+ "n": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_n.jpg",
+ "width": 216,
+ "height": 320,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_n.jpg",
+ "key": "n"
+ },
+ "q": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_q.jpg",
+ "width": 150,
+ "height": 150,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_q.jpg",
+ "key": "q"
+ },
+ "s": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_m.jpg",
+ "width": 162,
+ "height": 240,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_m.jpg",
+ "key": "s"
+ },
+ "sq": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_s.jpg",
+ "width": 75,
+ "height": 75,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_s.jpg",
+ "key": "sq"
+ },
+ "t": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_t.jpg",
+ "width": 68,
+ "height": 100,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_t.jpg",
+ "key": "t"
+ },
+ "z": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
+ "width": 433,
+ "height": 640,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
+ "key": "z"
+ }
+ }
+ }
+ ]
}
}
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
+ ]
+ }
+ }
"""
- json = json.replace('\r\n', '').replace('\n', '').replace('\r', '')
+ # Flickr serves search results in a json block named 'modelExport' buried inside a script tag,
+ # this json is served as a single line terminating with a comma.
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
@@ -149,37 +165,51 @@ class TestFlickrNoapiEngine(SearxTestCase):
# no n size, only the z size
json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "z": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
- "key": "z"
+ modelExport: {
+ "legend": [
+ [
+ "search-photos-lite-models",
+ "0",
+ "photos",
+ "_data",
+ "0"
+ ]
+ ],
+ "main": {
+ "search-photos-lite-models": [
+ {
+ "photos": {
+ "_data": [
+ {
+ "_flickrModelRegistry": "photo-lite-models",
+ "title": "This%20is%20the%20title",
+ "username": "Owner",
+ "pathAlias": "klink692",
+ "realname": "Owner",
+ "license": 0,
+ "ownerNsid": "59729010@N00",
+ "canComment": false,
+ "commentCount": 14,
+ "faveCount": 21,
+ "id": "14001294434",
+ "sizes": {
+ "z": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_z.jpg",
+ "width": 433,
+ "height": 640,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_z.jpg",
+ "key": "z"
+ }
+ }
+ }
+ ]
}
}
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
+ ]
+ }
+ }
"""
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
@@ -192,37 +222,51 @@ class TestFlickrNoapiEngine(SearxTestCase):
# no z or n size
json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "o": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_o.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_o.jpg",
- "key": "o"
+ modelExport: {
+ "legend": [
+ [
+ "search-photos-lite-models",
+ "0",
+ "photos",
+ "_data",
+ "0"
+ ]
+ ],
+ "main": {
+ "search-photos-lite-models": [
+ {
+ "photos": {
+ "_data": [
+ {
+ "_flickrModelRegistry": "photo-lite-models",
+ "title": "This%20is%20the%20title",
+ "username": "Owner",
+ "pathAlias": "klink692",
+ "realname": "Owner",
+ "license": 0,
+ "ownerNsid": "59729010@N00",
+ "canComment": false,
+ "commentCount": 14,
+ "faveCount": 21,
+ "id": "14001294434",
+ "sizes": {
+ "o": {
+ "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_o.jpg",
+ "width": 433,
+ "height": 640,
+ "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_o.jpg",
+ "key": "o"
+ }
+ }
+ }
+ ]
}
}
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
+ ]
+ }
+ }
"""
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
@@ -235,30 +279,44 @@ class TestFlickrNoapiEngine(SearxTestCase):
# no image test
json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "ownerNsid": "59729010@N00",
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- }
- }
+ modelExport: {
+ "legend": [
+ [
+ "search-photos-lite-models",
+ "0",
+ "photos",
+ "_data",
+ "0"
+ ]
],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
+ "main": {
+ "search-photos-lite-models": [
+ {
+ "photos": {
+ "_data": [
+ {
+ "_flickrModelRegistry": "photo-lite-models",
+ "title": "This is the title",
+ "username": "Owner",
+ "pathAlias": "klink692",
+ "realname": "Owner",
+ "license": 0,
+ "ownerNsid": "59729010@N00",
+ "canComment": false,
+ "commentCount": 14,
+ "faveCount": 21,
+ "id": "14001294434",
+ "sizes": {
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
"""
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
@@ -266,51 +324,20 @@ class TestFlickrNoapiEngine(SearxTestCase):
# null test
json = """
- "search-photos-models","photos":
- {
- "_data": [null],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
- """
- response = mock.Mock(text=json)
- results = flickr_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
-
- # no ownerNsid test
- json = """
- "search-photos-lite-models","photos":
- {
- "_data": [
- {
- "_flickrModelRegistry": "photo-lite-models",
- "title": "This is the title",
- "username": "Owner",
- "pathAlias": "klink692",
- "realname": "Owner",
- "license": 0,
- "canComment": false,
- "commentCount": 14,
- "faveCount": 21,
- "id": "14001294434",
- "sizes": {
- "o": {
- "displayUrl": "//farm8.staticflickr.com/7246/14001294434_410f653777_o.jpg",
- "width": 433,
- "height": 640,
- "url": "//c4.staticflickr.com/8/7246/14001294434_410f653777_o.jpg",
- "key": "o"
+ modelExport: {
+ "legend": [null],
+ "main": {
+ "search-photos-lite-models": [
+ {
+ "photos": {
+ "_data": [null]
}
}
- }
- ],
- "fetchedStart": true,
- "fetchedEnd": false,
- "totalItems": "4386039"
- },"totalItems":
+ ]
+ }
+ }
"""
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
@@ -323,6 +350,7 @@ class TestFlickrNoapiEngine(SearxTestCase):
"link":"http:\/\/www.flickr.com\/artist\/1217","type":"artist"}
]}
"""
+ json = ''.join(json.split()) + ',\n'
response = mock.Mock(text=json)
results = flickr_noapi.response(response)
self.assertEqual(type(results), list)
diff --git a/tests/unit/engines/test_gigablast.py b/tests/unit/engines/test_gigablast.py
index f0ddb63bc..6b2d26458 100644
--- a/tests/unit/engines/test_gigablast.py
+++ b/tests/unit/engines/test_gigablast.py
@@ -11,11 +11,16 @@ class TestGigablastEngine(SearxTestCase):
dicto = defaultdict(dict)
dicto['pageno'] = 0
dicto['safesearch'] = 0
- dicto['language'] = 'en-US'
+ dicto['language'] = 'all'
params = gigablast.request(query, dicto)
self.assertTrue('url' in params)
self.assertTrue(query in params['url'])
self.assertTrue('gigablast.com' in params['url'])
+ self.assertTrue('xx' in params['url'])
+
+ dicto['language'] = 'en-US'
+ params = gigablast.request(query, dicto)
+ self.assertTrue('en' in params['url'])
self.assertFalse('en-US' in params['url'])
def test_response(self):
diff --git a/tests/unit/engines/test_google.py b/tests/unit/engines/test_google.py
index 413b67769..9d0edd439 100644
--- a/tests/unit/engines/test_google.py
+++ b/tests/unit/engines/test_google.py
@@ -15,7 +15,8 @@ class TestGoogleEngine(SearxTestCase):
return response
def test_request(self):
- google.supported_languages = ['en', 'fr', 'zh-CN']
+ google.supported_languages = ['en', 'fr', 'zh-CN', 'iw']
+ google.language_aliases = {'he': 'iw'}
query = 'test_query'
dicto = defaultdict(dict)
@@ -41,6 +42,12 @@ class TestGoogleEngine(SearxTestCase):
self.assertIn('zh-CN', params['url'])
self.assertIn('zh-CN', params['headers']['Accept-Language'])
+ dicto['language'] = 'he'
+ params = google.request(query, dicto)
+ self.assertIn('google.com', params['url'])
+ self.assertIn('iw', params['url'])
+ self.assertIn('iw', params['headers']['Accept-Language'])
+
def test_response(self):
self.assertRaises(AttributeError, google.response, None)
self.assertRaises(AttributeError, google.response, [])
@@ -51,93 +58,50 @@ class TestGoogleEngine(SearxTestCase):
self.assertEqual(google.response(response), [])
html = """
- <div class="g">
- <h3 class="r">
- <a href="http://this.should.be.the.link/">
- <b>This</b> is <b>the</b> title
- </a>
- </h3>
- <div class="s">
- <div class="kv" style="margin-bottom:2px">
- <cite>
- <b>test</b>.psychologies.com/
- </cite>
- <div class="_nBb">‎
- <div style="display:inline" onclick="google.sham(this);" aria-expanded="false"
- aria-haspopup="true" tabindex="0" data-ved="0CBUQ7B0wAA">
- <span class="_O0">
- </span>
+ <div class="ZINbbc xpd O9g5cc uUPGi">
+ <div>
+ <div class="kCrYT">
+ <a href="/url?q=http://this.should.be.the.link/">
+ <div class="BNeawe">
+ <b>This</b> is <b>the</b> title
</div>
- <div style="display:none" class="am-dropdown-menu" role="menu" tabindex="-1">
- <ul>
- <li class="_Ykb">
- <a class="_Zkb" href="http://www.google.fr/url?url=http://webcache.googleusercontent
- .com/search%3Fcache:R1Z_4pGXjuIJ:http://test.psychologies.com/">
- En cache
- </a>
- </li>
- <li class="_Ykb">
- <a class="_Zkb" href="/search?safe=off&amp;q=related:test.psy.com/">
- Pages similaires
- </a>
- </li>
- </ul>
+ <div class="BNeawe">
+ http://website
+ </div>
+ </a>
+ </div>
+ <div class="kCrYT">
+ <div>
+ <div class="BNeawe">
+ <div>
+ <div class="BNeawe">
+ This should be the content.
+ </div>
+ </div>
</div>
</div>
</div>
- <span class="st">
- This should be the content.
- </span>
- <br>
- <div class="osl">‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/tests/">
- Test Personnalité
- </a> - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/test/">
- Tests - Moi
- </a> - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/test/tests-couple">
- Test Couple
- </a>
- - ‎
- <a href="http://www.google.fr/url?url=http://test.psychologies.com/tests/tests-amour">
- Test Amour
+ </div>
+ </p>
+ <div class="ZINbbc xpd O9g5cc uUPGi">
+ <div>
+ <div class="kCrYT">
+ <span>
+ <div class="BNeawe">
+ Related searches
+ </div>
+ </span>
+ </div>
+ <div class="rVLSBd">
+ <a>
+ <div>
+ <div class="BNeawe">
+ suggestion title
+ </div>
+ </div>
</a>
</div>
</div>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="http://www.google.com/images?q=toto">
- <b>This</b>
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="http://www.google.com/search?q=toto">
- <b>This</b> is
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="€">
- <b>This</b> is <b>the</b>
- </a>
- </h3>
- </div>
- <div class="g">
- <h3 class="r">
- <a href="/url?q=url">
- <b>This</b> is <b>the</b>
- </a>
- </h3>
- </div>
- <p class="_Bmc" style="margin:3px 8px">
- <a href="/search?num=20&amp;safe=off&amp;q=t&amp;revid=1754833769&amp;sa=X&amp;ei=-&amp;ved=">
- suggestion <b>title</b>
- </a>
</p>
"""
response = self.mock_response(html)
@@ -198,29 +162,13 @@ class TestGoogleEngine(SearxTestCase):
html = u"""
<html>
<body>
- <table>
- <tbody>
- <tr>
- <td>
- <font>
- <label>
- <span id="ten">English</span>
- </label>
- </font>
- </td>
- <td>
- <font>
- <label>
- <span id="tzh-CN">中文 (简体)</span>
- </label>
- <label>
- <span id="tzh-TW">中文 (繁體)</span>
- </label>
- </font>
- </td>
- </tr>
- </tbody>
- </table>
+ <div id="langSec">
+ <div>
+ <input name="lr" data-name="english" value="lang_en" />
+ <input name="lr" data-name="中文 (简体)" value="lang_zh-CN" />
+ <input name="lr" data-name="中文 (繁體)" value="lang_zh-TW" />
+ </div>
+ </div>
</body>
</html>
"""
diff --git a/tests/unit/engines/test_google_news.py b/tests/unit/engines/test_google_news.py
index a041a79b9..0a122ca6d 100644
--- a/tests/unit/engines/test_google_news.py
+++ b/tests/unit/engines/test_google_news.py
@@ -10,6 +10,7 @@ class TestGoogleNewsEngine(SearxTestCase):
def test_request(self):
google_news.supported_languages = ['en-US', 'fr-FR']
+ google_news.language_aliases = {}
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 1
@@ -20,6 +21,11 @@ class TestGoogleNewsEngine(SearxTestCase):
self.assertIn(query, params['url'])
self.assertIn('fr', params['url'])
+ dicto['language'] = 'all'
+ params = google_news.request(query, dicto)
+ self.assertIn('url', params)
+ self.assertNotIn('fr', params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, google_news.response, None)
self.assertRaises(AttributeError, google_news.response, [])
diff --git a/tests/unit/engines/test_google_videos.py b/tests/unit/engines/test_google_videos.py
index a48e9a755..3b7edf373 100644
--- a/tests/unit/engines/test_google_videos.py
+++ b/tests/unit/engines/test_google_videos.py
@@ -30,16 +30,34 @@ class TestGoogleVideosEngine(SearxTestCase):
<div>
<div>
<div class="g">
- <div>
- <h3><a href="url_1">Title 1</h3>
+ <div class="r">
+ <a href="url_1"><h3>Title 1</h3></a>
+ </div>
+ <div class="s">
+ <div>
+ <a>
+ <g-img>
+ <img id="vidthumb1">
+ </g-img>
+ </a>
+ </div>
</div>
<div>
<span class="st">Content 1</span>
</div>
</div>
<div class="g">
- <div>
- <h3><a href="url_2">Title 2</h3>
+ <div class="r">
+ <a href="url_2"><h3>Title 2</h3></a>
+ </div>
+ <div class="s">
+ <div>
+ <a>
+ <g-img>
+ <img id="vidthumb2">
+ </g-img>
+ </a>
+ </div>
</div>
<div>
<span class="st">Content 2</span>
@@ -47,6 +65,7 @@ class TestGoogleVideosEngine(SearxTestCase):
</div>
</div>
</div>
+ <script>function _setImagesSrc(c,d,e){}</script>
"""
response = mock.Mock(text=html)
results = google_videos.response(response)
diff --git a/tests/unit/engines/test_mediawiki.py b/tests/unit/engines/test_mediawiki.py
index 1b07dd8f4..b86372700 100644
--- a/tests/unit/engines/test_mediawiki.py
+++ b/tests/unit/engines/test_mediawiki.py
@@ -18,6 +18,10 @@ class TestMediawikiEngine(SearxTestCase):
self.assertIn('wikipedia.org', params['url'])
self.assertIn('fr', params['url'])
+ dicto['language'] = 'all'
+ params = mediawiki.request(query, dicto)
+ self.assertIn('en', params['url'])
+
mediawiki.base_url = "http://test.url/"
mediawiki.search_url = mediawiki.base_url +\
'w/api.php?action=query'\
diff --git a/tests/unit/engines/test_qwant.py b/tests/unit/engines/test_qwant.py
index 86bfb22da..6611264f8 100644
--- a/tests/unit/engines/test_qwant.py
+++ b/tests/unit/engines/test_qwant.py
@@ -8,6 +8,7 @@ class TestQwantEngine(SearxTestCase):
def test_request(self):
qwant.supported_languages = ['en-US', 'fr-CA', 'fr-FR']
+ qwant.language_aliases = {}
query = 'test_query'
dicto = defaultdict(dict)
dicto['pageno'] = 0
@@ -20,11 +21,10 @@ class TestQwantEngine(SearxTestCase):
self.assertIn('qwant.com', params['url'])
self.assertIn('fr_fr', params['url'])
- dicto['language'] = 'en-US'
+ dicto['language'] = 'all'
qwant.categories = ['news']
params = qwant.request(query, dicto)
self.assertFalse('fr' in params['url'])
- self.assertIn('en_us', params['url'])
self.assertIn('news', params['url'])
dicto['language'] = 'fr'
diff --git a/tests/unit/engines/test_seedpeer.py b/tests/unit/engines/test_seedpeer.py
index 37b2de8e4..2057c1cb1 100644
--- a/tests/unit/engines/test_seedpeer.py
+++ b/tests/unit/engines/test_seedpeer.py
@@ -1,15 +1,11 @@
-import mock
+# -*- coding: utf-8 -*-
from collections import defaultdict
+import mock
from searx.engines import seedpeer
from searx.testing import SearxTestCase
-from datetime import datetime
-
-class TestSeedPeerEngine(SearxTestCase):
- html = ''
- with open('./tests/unit/engines/seedpeer_fixture.html') as fixture:
- html += fixture.read()
+class TestBtdiggEngine(SearxTestCase):
def test_request(self):
query = 'test_query'
@@ -18,34 +14,53 @@ class TestSeedPeerEngine(SearxTestCase):
params = seedpeer.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
- self.assertIn('seedpeer.eu', params['url'])
+ self.assertIn('seedpeer', params['url'])
- def test_response_raises_attr_error_on_empty_response(self):
+ def test_response(self):
self.assertRaises(AttributeError, seedpeer.response, None)
self.assertRaises(AttributeError, seedpeer.response, [])
self.assertRaises(AttributeError, seedpeer.response, '')
self.assertRaises(AttributeError, seedpeer.response, '[]')
- def test_response_returns_empty_list(self):
response = mock.Mock(text='<html></html>')
self.assertEqual(seedpeer.response(response), [])
- def test_response_returns_all_results(self):
- response = mock.Mock(text=self.html)
- results = seedpeer.response(response)
- self.assertTrue(isinstance(results, list))
- self.assertEqual(len(results), 2)
-
- def test_response_returns_correct_results(self):
- response = mock.Mock(text=self.html)
+ html = u"""
+ <html>
+ <head>
+ <script></script>
+ <script type="text/javascript" src="not_here.js"></script>
+ <script type="text/javascript">
+ window.initialData=
+ {"data": {"list": [{"name": "Title", "seeds": "10", "peers": "20", "size": "1024", "hash": "abc123"}]}}
+ </script>
+ </head>
+ <body>
+ <table></table>
+ <table>
+ <thead><tr></tr></thead>
+ <tbody>
+ <tr>
+ <td><a href="link">Title</a></td>
+ <td>1 year</td>
+ <td>1 KB</td>
+ <td>10</td>
+ <td>20</td>
+ <td></td>
+ </tr>
+ </tbody>
+ </table>
+ </body>
+ </html>
+ """
+ response = mock.Mock(text=html)
results = seedpeer.response(response)
- self.assertEqual(
- results[0]['title'], 'Narcos - Season 2 - 720p WEBRiP - x265 HEVC - ShAaNiG '
- )
- self.assertEqual(
- results[0]['url'],
- 'http://www.seedpeer.eu/details/11685972/Narcos---Season-2---720p-WEBRiP---x265-HEVC---ShAaNiG.html'
- )
- self.assertEqual(results[0]['content'], '2.48 GB, 1 day')
- self.assertEqual(results[0]['seed'], '861')
- self.assertEqual(results[0]['leech'], '332')
+ self.assertEqual(type(results), list)
+ self.assertEqual(len(results), 1)
+ self.assertEqual(results[0]['title'], 'Title')
+ self.assertEqual(results[0]['url'], 'https://seedpeer.me/link')
+ self.assertEqual(results[0]['seed'], 10)
+ self.assertEqual(results[0]['leech'], 20)
+ self.assertEqual(results[0]['filesize'], 1024)
+ self.assertEqual(results[0]['torrentfile'], 'https://seedpeer.me/torrent/abc123')
+ self.assertEqual(results[0]['magnetlink'], 'magnet:?xt=urn:btih:abc123')
diff --git a/tests/unit/engines/test_startpage.py b/tests/unit/engines/test_startpage.py
index bdb3356b7..ac4454738 100644
--- a/tests/unit/engines/test_startpage.py
+++ b/tests/unit/engines/test_startpage.py
@@ -18,8 +18,9 @@ class TestStartpageEngine(SearxTestCase):
self.assertIn('data', params)
self.assertIn('query', params['data'])
self.assertIn(query, params['data']['query'])
- self.assertIn('with_language', params['data'])
- self.assertIn('lang_fr', params['data']['with_language'])
+
+ dicto['language'] = 'all'
+ params = startpage.request(query, dicto)
def test_response(self):
self.assertRaises(AttributeError, startpage.response, None)
@@ -31,33 +32,32 @@ class TestStartpageEngine(SearxTestCase):
self.assertEqual(startpage.response(response), [])
html = """
- <div class='result' style=' *width : auto; *margin-right : 10%;'>
- <h3>
- <a href='http://this.should.be.the.link/' id='title_2' name='title_2' >
- This should be the title
+<div class="w-gl__result">
+ <a
+ class="w-gl__result-title"
+ href="http://this.should.be.the.link/"
+ data-onw="1"
+ rel="noopener noreferrer"
+ target="_blank">
+
+ <h3>This should be the title</h3>
</a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class='desc clk'>
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </div>
- """
+ <div class="w-gl__result-second-line-container">
+ <div class="w-gl__result-url-container">
+ <a
+ class="w-gl__result-url"
+ href="http://this.should.be.the.link/"
+ rel="noopener noreferrer"
+ target="_blank">https://www.cnbc.com/2019/10/12/dj-zedd-banned-in-china-for-liking-a-south-park-tweet.html</a>
+ </div>
+ <a
+ class="w-gl__anonymous-view-url"
+ href="https://eu-browse.startpage.com/do/proxy?ep=556b554d576b6f5054554546423167764b5445616455554d5342675441774659495246304848774f5267385453304941486b5949546c63704e33774f526b705544565647516d4a61554246304847674f4a556f6957415a4f436b455042426b6b4f7a64535a52784a56514a4f45307743446c567250445a4f4c52514e5677554e46776b4b545563704c7931554c5167465467644f42464d4f4255426f4d693152624634525741305845526c595746636b626d67494e42705743466c515252634f4267456e597a7346596b7856435134465345634f564249794b5752785643315863546769515773764a5163494c5877505246315865456f5141426b4f41774167596d6c5a4e30395758773442465251495677596c624770665a6b786344466b4151455663425249794d6a78525a55554157516f4342556766526b51314b57514e&amp;ek=4q58686o5047786n6343527259445247576p6o38&amp;ekdata=84abd523dc13cba5c65164d04d7d7263"
+ target="_blank">Anonymous View</a>
+ </div>
+ <p class="w-gl__description">This should be the content.</p>
+ </div>
+ """ # noqa
response = mock.Mock(text=html.encode('utf-8'))
results = startpage.response(response)
self.assertEqual(type(results), list)
@@ -65,72 +65,3 @@ class TestStartpageEngine(SearxTestCase):
self.assertEqual(results[0]['title'], 'This should be the title')
self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
self.assertEqual(results[0]['content'], 'This should be the content.')
-
- html = """
- <div class='result' style=' *width : auto; *margin-right : 10%;'>
- <h3>
- <a href='http://www.google.com/aclk?sa=l&ai=C' id='title_2' name='title_2' >
- This should be the title
- </a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class='desc clk'>
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </div>
- <div class='result' style=' *width : auto; *margin-right : 10%;'>
- <h3>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p class='desc clk'>
- This should be the content.
- </p>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- </p>
- </div>
- <div class='result' style=' *width : auto; *margin-right : 10%;'>
- <h3>
- <a href='http://this.should.be.the.link/' id='title_2' name='title_2' >
- This should be the title
- </a>
- <span id='title_stars_2' name='title_stars_2'> </span>
- </h3>
- <p>
- <span class='url'>www.speed<b>test</b>.net/fr/
- </span>
- -
- <A class="proxy" id="proxy_link" HREF="https://ixquick-proxy.com/do/spg/proxy?ep=&edata=&ek=&ekdata="
- class='proxy'>
- Navigation avec Ixquick Proxy
- </A>
- -
- <A HREF="https://ixquick-proxy.com/do/spg/highlight.pl?l=francais&c=hf&cat=web&q=test&rl=NONE&rid=
- &hlq=https://startpage.com/do/search&mtabp=-1&mtcmd=process_search&mtlanguage=francais&mtengine0=
- &mtcat=web&u=http:%2F%2Fwww.speedtest.net%2Ffr%2F" class='proxy'>
- Mis en surbrillance
- </A>
- </p>
- </div>
- """
- response = mock.Mock(text=html.encode('utf-8'))
- results = startpage.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['content'], '')
diff --git a/tests/unit/engines/test_subtitleseeker.py b/tests/unit/engines/test_subtitleseeker.py
deleted file mode 100644
index 96b253943..000000000
--- a/tests/unit/engines/test_subtitleseeker.py
+++ /dev/null
@@ -1,138 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import subtitleseeker
-from searx.testing import SearxTestCase
-
-
-class TestSubtitleseekerEngine(SearxTestCase):
-
- def test_request(self):
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'fr-FR'
- params = subtitleseeker.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('subtitleseeker.com' in params['url'])
-
- def test_response(self):
- dicto = defaultdict(dict)
- dicto['language'] = 'fr-FR'
- response = mock.Mock(search_params=dicto)
-
- self.assertRaises(AttributeError, subtitleseeker.response, None)
- self.assertRaises(AttributeError, subtitleseeker.response, [])
- self.assertRaises(AttributeError, subtitleseeker.response, '')
- self.assertRaises(AttributeError, subtitleseeker.response, '[]')
-
- response = mock.Mock(text='<html></html>', search_params=dicto)
- self.assertEqual(subtitleseeker.response(response), [])
-
- html = """
- <div class="boxRows">
- <div class="boxRowsInner" style="width:600px;">
- <img src="http://static.subtitleseeker.com/images/movie.gif"
- style="width:16px; height:16px;" class="icon">
- <a href="http://this.is.the.url/"
- class="blue" title="Title subtitle" >
- This is the Title
- </a>
- <br><br>
- <span class="f10b grey-dark arial" style="padding:0px 0px 5px 20px">
- "Alternative Title"
- </span>
- </div>
- <div class="boxRowsInner f12b red" style="width:70px;">
- 1998
- </div>
- <div class="boxRowsInner grey-web f12" style="width:120px;">
- <img src="http://static.subtitleseeker.com/images/basket_put.png"
- style="width:16px; height:16px;" class="icon">
- 1039 Subs
- </div>
- <div class="boxRowsInner grey-web f10" style="width:130px;">
- <img src="http://static.subtitleseeker.com/images/arrow_refresh_small.png"
- style="width:16px; height:16px;" class="icon">
- 1 hours ago
- </div>
- <div class="clear"></div>
- </div>
- """
- response = mock.Mock(text=html, search_params=dicto)
- results = subtitleseeker.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the Title')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/French/')
- self.assertIn('1998', results[0]['content'])
- self.assertIn('1039 Subs', results[0]['content'])
- self.assertIn('Alternative Title', results[0]['content'])
-
- dicto['language'] = 'pt-BR'
- results = subtitleseeker.response(response)
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/Brazilian/')
-
- html = """
- <div class="boxRows">
- <div class="boxRowsInner" style="width:600px;">
- <img src="http://static.subtitleseeker.com/images/movie.gif"
- style="width:16px; height:16px;" class="icon">
- <a href="http://this.is.the.url/"
- class="blue" title="Title subtitle" >
- This is the Title
- </a>
- </div>
- <div class="boxRowsInner f12b red" style="width:70px;">
- 1998
- </div>
- <div class="boxRowsInner grey-web f12" style="width:120px;">
- <img src="http://static.subtitleseeker.com/images/basket_put.png"
- style="width:16px; height:16px;" class="icon">
- 1039 Subs
- </div>
- <div class="boxRowsInner grey-web f10" style="width:130px;">
- <img src="http://static.subtitleseeker.com/images/arrow_refresh_small.png"
- style="width:16px; height:16px;" class="icon">
- 1 hours ago
- </div>
- <div class="clear"></div>
- </div>
- """
- subtitleseeker.language = 'English'
- response = mock.Mock(text=html, search_params=dicto)
- results = subtitleseeker.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['title'], 'This is the Title')
- self.assertEqual(results[0]['url'], 'http://this.is.the.url/English/')
- self.assertIn('1998', results[0]['content'])
- self.assertIn('1039 Subs', results[0]['content'])
-
- html = """
- <div class="boxRowsInner" style="width:600px;">
- <img src="http://static.subtitleseeker.com/images/movie.gif"
- style="width:16px; height:16px;" class="icon">
- <a href="http://this.is.the.url/"
- class="blue" title="Title subtitle" >
- This is the Title
- </a>
- </div>
- <div class="boxRowsInner f12b red" style="width:70px;">
- 1998
- </div>
- <div class="boxRowsInner grey-web f12" style="width:120px;">
- <img src="http://static.subtitleseeker.com/images/basket_put.png"
- style="width:16px; height:16px;" class="icon">
- 1039 Subs
- </div>
- <div class="boxRowsInner grey-web f10" style="width:130px;">
- <img src="http://static.subtitleseeker.com/images/arrow_refresh_small.png"
- style="width:16px; height:16px;" class="icon">
- 1 hours ago
- </div>
- """
- response = mock.Mock(text=html, search_params=dicto)
- results = subtitleseeker.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 0)
diff --git a/tests/unit/engines/test_swisscows.py b/tests/unit/engines/test_swisscows.py
deleted file mode 100644
index 133f636de..000000000
--- a/tests/unit/engines/test_swisscows.py
+++ /dev/null
@@ -1,151 +0,0 @@
-from collections import defaultdict
-import mock
-from searx.engines import swisscows
-from searx.testing import SearxTestCase
-
-
-class TestSwisscowsEngine(SearxTestCase):
-
- def test_request(self):
- swisscows.supported_languages = ['de-AT', 'de-DE']
- query = 'test_query'
- dicto = defaultdict(dict)
- dicto['pageno'] = 1
- dicto['language'] = 'de-DE'
- params = swisscows.request(query, dicto)
- self.assertTrue('url' in params)
- self.assertTrue(query in params['url'])
- self.assertTrue('swisscows.ch' in params['url'])
- self.assertTrue('uiLanguage=de' in params['url'])
- self.assertTrue('region=de-DE' in params['url'])
-
- dicto['category'] = 'images'
- params = swisscows.request(query, dicto)
- self.assertIn('image', params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, swisscows.response, None)
- self.assertRaises(AttributeError, swisscows.response, [])
- self.assertRaises(AttributeError, swisscows.response, '')
- self.assertRaises(AttributeError, swisscows.response, '[]')
-
- response = mock.Mock(text=b'<html></html>')
- self.assertEqual(swisscows.response(response), [])
-
- response = mock.Mock(text=b'<html></html>')
- self.assertEqual(swisscows.response(response), [])
-
- html = b"""
- <script>
- App.Dispatcher.dispatch("initialize", {
- html5history: true,
- initialData: {"Request":
- {"Page":1,
- "ItemsCount":1,
- "Query":"This should ",
- "NormalizedQuery":"This should ",
- "Region":"de-AT",
- "UILanguage":"de"},
- "Results":{"items":[
- {"Title":"\uE000This should\uE001 be the title",
- "Description":"\uE000This should\uE001 be the content.",
- "Url":"http://this.should.be.the.link/",
- "DisplayUrl":"www.\uE000this.should.be.the\uE001.link",
- "Id":"782ef287-e439-451c-b380-6ebc14ba033d"},
- {"Title":"Datei:This should1.svg",
- "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should1.png",
- "SourceUrl":"http://de.wikipedia.org/wiki/Datei:This should1.svg",
- "DisplayUrl":"de.wikipedia.org/wiki/Datei:This should1.svg",
- "Width":950,
- "Height":534,
- "FileSize":92100,
- "ContentType":"image/jpeg",
- "Thumbnail":{
- "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should1.png",
- "ContentType":"image/jpeg",
- "Width":300,
- "Height":168,
- "FileSize":9134},
- "Id":"6a97a542-8f65-425f-b7f6-1178c3aba7be"
- }
- ],"TotalCount":55300,
- "Query":"This should "
- },
- "Images":[{"Title":"Datei:This should.svg",
- "Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should.png",
- "SourceUrl":"http://de.wikipedia.org/wiki/Datei:This should.svg",
- "DisplayUrl":"de.wikipedia.org/wiki/Datei:This should.svg",
- "Width":1280,
- "Height":677,
- "FileSize":50053,
- "ContentType":"image/png",
- "Thumbnail":{"Url":"https://i.swisscows.ch/?link=http%3a%2f%2fts2.mm.This/should.png",
- "ContentType":"image/png",
- "Width":300,
- "Height":158,
- "FileSize":8023},
- "Id":"ae230fd8-a06a-47d6-99d5-e74766d8143a"}]},
- environment: "production"
- }).then(function (options) {
- $('#Search_Form').on('submit', function (e) {
- if (!Modernizr.history) return;
- e.preventDefault();
-
- var $form = $(this),
- $query = $('#Query'),
- query = $.trim($query.val()),
- path = App.Router.makePath($form.attr('action'), null, $form.serializeObject())
-
- if (query.length) {
- options.html5history ?
- ReactRouter.HistoryLocation.push(path) :
- ReactRouter.RefreshLocation.push(path);
- }
- else $('#Query').trigger('blur');
- });
-
- });
- </script>
- """
- response = mock.Mock(text=html)
- results = swisscows.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 3)
- self.assertEqual(results[0]['title'], 'This should be the title')
- self.assertEqual(results[0]['url'], 'http://this.should.be.the.link/')
- self.assertEqual(results[0]['content'], 'This should be the content.')
- self.assertEqual(results[1]['title'], 'Datei:This should1.svg')
- self.assertEqual(results[1]['url'], 'http://de.wikipedia.org/wiki/Datei:This should1.svg')
- self.assertEqual(results[1]['img_src'], 'http://ts2.mm.This/should1.png')
- self.assertEqual(results[1]['template'], 'images.html')
- self.assertEqual(results[2]['title'], 'Datei:This should.svg')
- self.assertEqual(results[2]['url'], 'http://de.wikipedia.org/wiki/Datei:This should.svg')
- self.assertEqual(results[2]['img_src'], 'http://ts2.mm.This/should.png')
- self.assertEqual(results[2]['template'], 'images.html')
-
- def test_fetch_supported_languages(self):
- html = """<html></html>"""
- response = mock.Mock(text=html)
- languages = swisscows._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 0)
-
- html = """
- <html>
- <div id="regions-popup">
- <div>
- <ul>
- <li><a data-search-language="browser"></a></li>
- <li><a data-search-language="de-CH"></a></li>
- <li><a data-search-language="fr-CH"></a></li>
- </ul>
- </div>
- </div>
- </html>
- """
- response = mock.Mock(text=html)
- languages = swisscows._fetch_supported_languages(response)
- self.assertEqual(type(languages), list)
- self.assertEqual(len(languages), 3)
- self.assertIn('de-CH', languages)
- self.assertIn('fr-CH', languages)
diff --git a/tests/unit/engines/test_twitter.py b/tests/unit/engines/test_twitter.py
index 10e4a0ba9..b444b48ee 100644
--- a/tests/unit/engines/test_twitter.py
+++ b/tests/unit/engines/test_twitter.py
@@ -20,6 +20,12 @@ class TestTwitterEngine(SearxTestCase):
self.assertIn('lang', params['cookies'])
self.assertIn('fr', params['cookies']['lang'])
+ dicto['language'] = 'all'
+ params = twitter.request(query, dicto)
+ self.assertIn('cookies', params)
+ self.assertIn('lang', params['cookies'])
+ self.assertIn('en', params['cookies']['lang'])
+
def test_response(self):
self.assertRaises(AttributeError, twitter.response, None)
self.assertRaises(AttributeError, twitter.response, [])
diff --git a/tests/unit/engines/test_unsplash.py b/tests/unit/engines/test_unsplash.py
new file mode 100644
index 000000000..4501de906
--- /dev/null
+++ b/tests/unit/engines/test_unsplash.py
@@ -0,0 +1,38 @@
+from collections import defaultdict
+import mock
+from searx.testing import SearxTestCase
+from searx.engines import unsplash
+
+
+class TestUnsplashEngine(SearxTestCase):
+ def test_request(self):
+ query = 'penguin'
+ _dict = defaultdict(dict)
+ _dict['pageno'] = 1
+ params = unsplash.request(query, _dict)
+
+ self.assertTrue('url' in params)
+ self.assertTrue(query in params['url'])
+
+ def test_response(self):
+ resp = mock.Mock(text='{}')
+ result = unsplash.response(resp)
+ self.assertEqual([], result)
+
+ resp.text = '{"results": []}'
+ result = unsplash.response(resp)
+ self.assertEqual([], result)
+
+ # Sourced from https://unsplash.com/napi/search/photos?query=penguin&xp=&per_page=20&page=2
+ with open('./tests/unit/engines/unsplash_fixture.json') as fixture:
+ resp.text = fixture.read()
+
+ result = unsplash.response(resp)
+ self.assertEqual(len(result), 2)
+ self.assertEqual(result[0]['title'], 'low angle photography of swimming penguin')
+ self.assertEqual(result[0]['url'], 'https://unsplash.com/photos/FY8d721UO_4')
+ self.assertEqual(result[0]['thumbnail_src'], 'https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80\
+&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max')
+ self.assertEqual(result[0]['img_src'], 'https://images.unsplash.com/photo-1523557148507-1b77641c7e7c\
+?ixlib=rb-0.3.5')
+ self.assertEqual(result[0]['content'], '')
diff --git a/tests/unit/engines/test_wikidata.py b/tests/unit/engines/test_wikidata.py
index 62a409781..48be17bb4 100644
--- a/tests/unit/engines/test_wikidata.py
+++ b/tests/unit/engines/test_wikidata.py
@@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from lxml.html import fromstring
+from lxml import etree
from collections import defaultdict
import mock
from searx.engines import wikidata
@@ -11,11 +12,13 @@ class TestWikidataEngine(SearxTestCase):
def test_request(self):
query = 'test_query'
dicto = defaultdict(dict)
+ dicto['language'] = 'all'
params = wikidata.request(query, dicto)
self.assertIn('url', params)
self.assertIn(query, params['url'])
self.assertIn('wikidata.org', params['url'])
+ dicto['language'] = 'es_ES'
params = wikidata.request(query, dicto)
self.assertIn(query, params['url'])
@@ -27,12 +30,13 @@ class TestWikidataEngine(SearxTestCase):
self.assertRaises(AttributeError, wikidata.response, '[]')
wikidata.supported_languages = ['en', 'es']
- response = mock.Mock(text='<html></html>', search_params={"language": "en"})
+ wikidata.language_aliases = {}
+ response = mock.Mock(content='<html></html>'.encode("utf-8"), search_params={"language": "en"})
self.assertEqual(wikidata.response(response), [])
def test_getDetail(self):
response = {}
- results = wikidata.getDetail(response, "Q123", "en", "en-US")
+ results = wikidata.getDetail(response, "Q123", "en", "en-US", etree.HTMLParser())
self.assertEqual(results, [])
title_html = '<div><div class="wikibase-title-label">Test</div></div>'
@@ -49,7 +53,7 @@ class TestWikidataEngine(SearxTestCase):
"""
response = {"parse": {"displaytitle": title_html, "text": html}}
- results = wikidata.getDetail(response, "Q123", "en", "en-US")
+ results = wikidata.getDetail(response, "Q123", "en", "en-US", etree.HTMLParser())
self.assertEqual(len(results), 1)
self.assertEqual(results[0]['url'], 'https://en.wikipedia.org/wiki/Test')
@@ -89,7 +93,7 @@ class TestWikidataEngine(SearxTestCase):
"""
response = {"parse": {"displaytitle": title_html, "text": html}}
- results = wikidata.getDetail(response, "Q123", "yua", "yua_MX")
+ results = wikidata.getDetail(response, "Q123", "yua", "yua_MX", etree.HTMLParser())
self.assertEqual(len(results), 2)
self.assertEqual(results[0]['title'], 'Official website')
self.assertEqual(results[0]['url'], 'https://officialsite.com')
@@ -136,8 +140,8 @@ class TestWikidataEngine(SearxTestCase):
</div>
"""
html_etree = fromstring(html)
-
- image_src = wikidata.add_image(html_etree)
+ id_cache = wikidata.get_id_cache(html_etree)
+ image_src = wikidata.add_image(id_cache)
self.assertEqual(image_src,
"https://commons.wikimedia.org/wiki/Special:FilePath/image.png?width=500&height=400")
@@ -194,8 +198,9 @@ class TestWikidataEngine(SearxTestCase):
</div>
"""
html_etree = fromstring(html)
+ id_cache = wikidata.get_id_cache(html_etree)
- image_src = wikidata.add_image(html_etree)
+ image_src = wikidata.add_image(id_cache)
self.assertEqual(image_src,
"https://commons.wikimedia.org/wiki/Special:FilePath/logo.png?width=500&height=400")
@@ -229,11 +234,12 @@ class TestWikidataEngine(SearxTestCase):
"""
attributes = []
html_etree = fromstring(html)
+ id_cache = wikidata.get_id_cache(html_etree)
- wikidata.add_attribute(attributes, html_etree, "Fail")
+ wikidata.add_attribute(attributes, id_cache, "Fail")
self.assertEqual(attributes, [])
- wikidata.add_attribute(attributes, html_etree, "P27")
+ wikidata.add_attribute(attributes, id_cache, "P27")
self.assertEqual(len(attributes), 1)
self.assertEqual(attributes[0]["label"], "Country of citizenship")
self.assertEqual(attributes[0]["value"], "United Kingdom")
@@ -268,7 +274,8 @@ class TestWikidataEngine(SearxTestCase):
"""
attributes = []
html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P569", date=True)
+ id_cache = wikidata.get_id_cache(html_etree)
+ wikidata.add_attribute(attributes, id_cache, "P569", date=True)
self.assertEqual(len(attributes), 1)
self.assertEqual(attributes[0]["label"], "Date of birth")
self.assertEqual(attributes[0]["value"], "27 January 1832")
@@ -316,14 +323,16 @@ class TestWikidataEngine(SearxTestCase):
"""
attributes = []
html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P6")
+ id_cache = wikidata.get_id_cache(html_etree)
+ wikidata.add_attribute(attributes, id_cache, "P6")
self.assertEqual(len(attributes), 1)
self.assertEqual(attributes[0]["label"], "Head of government")
self.assertEqual(attributes[0]["value"], "Old Prime Minister, Actual Prime Minister")
attributes = []
html_etree = fromstring(html)
- wikidata.add_attribute(attributes, html_etree, "P6", trim=True)
+ id_cache = wikidata.get_id_cache(html_etree)
+ wikidata.add_attribute(attributes, id_cache, "P6", trim=True)
self.assertEqual(len(attributes), 1)
self.assertEqual(attributes[0]["value"], "Actual Prime Minister")
@@ -354,12 +363,13 @@ class TestWikidataEngine(SearxTestCase):
"""
urls = []
html_etree = fromstring(html)
- wikidata.add_url(urls, html_etree, 'P856')
+ id_cache = wikidata.get_id_cache(html_etree)
+ wikidata.add_url(urls, html_etree, id_cache, 'P856')
self.assertEquals(len(urls), 1)
self.assertIn({'title': 'Official website', 'url': 'https://searx.me/'}, urls)
urls = []
results = []
- wikidata.add_url(urls, html_etree, 'P856', 'custom label', results=results)
+ wikidata.add_url(urls, html_etree, id_cache, 'P856', 'custom label', results=results)
self.assertEquals(len(urls), 1)
self.assertEquals(len(results), 1)
self.assertIn({'title': 'custom label', 'url': 'https://searx.me/'}, urls)
@@ -402,7 +412,8 @@ class TestWikidataEngine(SearxTestCase):
"""
urls = []
html_etree = fromstring(html)
- wikidata.add_url(urls, html_etree, 'P856')
+ id_cache = wikidata.get_id_cache(html_etree)
+ wikidata.add_url(urls, html_etree, id_cache, 'P856')
self.assertEquals(len(urls), 2)
self.assertIn({'title': 'Official website', 'url': 'http://www.worldofwarcraft.com'}, urls)
self.assertIn({'title': 'Official website', 'url': 'http://eu.battle.net/wow/en/'}, urls)
diff --git a/tests/unit/engines/test_wikipedia.py b/tests/unit/engines/test_wikipedia.py
index 21d0225ed..316b12bc5 100644
--- a/tests/unit/engines/test_wikipedia.py
+++ b/tests/unit/engines/test_wikipedia.py
@@ -8,7 +8,8 @@ from searx.testing import SearxTestCase
class TestWikipediaEngine(SearxTestCase):
def test_request(self):
- wikipedia.supported_languages = ['fr', 'en']
+ wikipedia.supported_languages = ['fr', 'en', 'no']
+ wikipedia.language_aliases = {'nb': 'no'}
query = 'test_query'
dicto = defaultdict(dict)
@@ -25,10 +26,17 @@ class TestWikipediaEngine(SearxTestCase):
self.assertIn('Test_Query', params['url'])
self.assertNotIn('test_query', params['url'])
- dicto['language'] = 'xx'
+ dicto['language'] = 'nb'
+ params = wikipedia.request(query, dicto)
+ self.assertIn('no.wikipedia.org', params['url'])
+ dicto['language'] = 'all'
params = wikipedia.request(query, dicto)
self.assertIn('en', params['url'])
+ dicto['language'] = 'xx'
+ params = wikipedia.request(query, dicto)
+ self.assertIn('en.wikipedia.org', params['url'])
+
def test_response(self):
dicto = defaultdict(dict)
dicto['language'] = 'fr'
diff --git a/tests/unit/engines/test_wolframalpha_api.py b/tests/unit/engines/test_wolframalpha_api.py
index 30d337645..0433b34aa 100644
--- a/tests/unit/engines/test_wolframalpha_api.py
+++ b/tests/unit/engines/test_wolframalpha_api.py
@@ -35,7 +35,7 @@ class TestWolframAlphaAPIEngine(SearxTestCase):
xml = '''<?xml version='1.0' encoding='UTF-8'?>
<queryresult success='false' error='false' />
'''
- response = mock.Mock(text=xml.encode('utf-8'))
+ response = mock.Mock(content=xml.encode('utf-8'))
self.assertEqual(wolframalpha_api.response(response), [])
# test basic case
@@ -83,7 +83,7 @@ class TestWolframAlphaAPIEngine(SearxTestCase):
</pod>
</queryresult>
"""
- response = mock.Mock(text=xml, request=request)
+ response = mock.Mock(content=xml, request=request)
results = wolframalpha_api.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 2)
@@ -144,7 +144,7 @@ class TestWolframAlphaAPIEngine(SearxTestCase):
</pod>
</queryresult>
"""
- response = mock.Mock(text=xml, request=request)
+ response = mock.Mock(content=xml, request=request)
results = wolframalpha_api.response(response)
self.assertEqual(type(results), list)
self.assertEqual(len(results), 2)
diff --git a/tests/unit/engines/test_www1x.py b/tests/unit/engines/test_www1x.py
index 9df8de6bf..40f5200fd 100644
--- a/tests/unit/engines/test_www1x.py
+++ b/tests/unit/engines/test_www1x.py
@@ -12,46 +12,3 @@ class TestWww1xEngine(SearxTestCase):
self.assertTrue('url' in params)
self.assertTrue(query in params['url'])
self.assertTrue('1x.com' in params['url'])
-
- def test_response(self):
- self.assertRaises(AttributeError, www1x.response, None)
- self.assertRaises(AttributeError, www1x.response, [])
- self.assertRaises(AttributeError, www1x.response, '')
- self.assertRaises(AttributeError, www1x.response, '[]')
-
- response = mock.Mock(text='<html></html>')
- self.assertEqual(www1x.response(response), [])
- html = """
- <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE characters
- [
- <!ELEMENT characters (character*) >
- <!ELEMENT character (#PCDATA ) >
-
- <!ENTITY iexcl "&#161;" >
- <!ENTITY cent "&#162;" >
- <!ENTITY pound "&#163;" >
- ]
- ><root><searchresult><![CDATA[<table border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td style="min-width: 220px;" valign="top">
- <div style="font-size: 30px; margin: 0px 0px 20px 0px;">Photos</div>
- <div>
- <a href="/photo/123456" class="dynamiclink">
-<img border="0" class="searchresult" src="/images/user/testimage-123456.jpg" style="width: 125px; height: 120px;">
- </a>
- <a title="sjoerd lammers street photography" href="/member/sjoerdlammers" class="dynamiclink">
-<img border="0" class="searchresult" src="/images/profile/60c48b394c677d2fa4d9e7d263aabf44-square.jpg">
- </a>
- </div>
- </td>
- </table>
- ]]></searchresult></root>
- """
- response = mock.Mock(text=html)
- results = www1x.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
- self.assertEqual(results[0]['url'], 'https://1x.com/photo/123456')
- self.assertEqual(results[0]['thumbnail_src'], 'https://1x.com/images/user/testimage-123456.jpg')
- self.assertEqual(results[0]['content'], '')
- self.assertEqual(results[0]['template'], 'images.html')
diff --git a/tests/unit/engines/test_yacy.py b/tests/unit/engines/test_yacy.py
index a60614d3d..f49532cf4 100644
--- a/tests/unit/engines/test_yacy.py
+++ b/tests/unit/engines/test_yacy.py
@@ -17,6 +17,11 @@ class TestYacyEngine(SearxTestCase):
self.assertIn('localhost', params['url'])
self.assertIn('fr', params['url'])
+ dicto['language'] = 'all'
+ params = yacy.request(query, dicto)
+ self.assertIn('url', params)
+ self.assertNotIn('lr=lang_', params['url'])
+
def test_response(self):
self.assertRaises(AttributeError, yacy.response, None)
self.assertRaises(AttributeError, yacy.response, [])
diff --git a/tests/unit/engines/test_yahoo.py b/tests/unit/engines/test_yahoo.py
index 5037bfc7d..e52c1109e 100644
--- a/tests/unit/engines/test_yahoo.py
+++ b/tests/unit/engines/test_yahoo.py
@@ -50,6 +50,13 @@ class TestYahooEngine(SearxTestCase):
self.assertIn('zh_cht', params['url'])
self.assertIn('zh_cht', params['cookies']['sB'])
+ dicto['language'] = 'all'
+ params = yahoo.request(query, dicto)
+ self.assertIn('cookies', params)
+ self.assertIn('sB', params['cookies'])
+ self.assertIn('en', params['cookies']['sB'])
+ self.assertIn('en', params['url'])
+
def test_no_url_in_request_year_time_range(self):
dicto = defaultdict(dict)
query = 'test_query'
diff --git a/tests/unit/engines/test_yahoo_news.py b/tests/unit/engines/test_yahoo_news.py
index c3297dacf..ae27df2a5 100644
--- a/tests/unit/engines/test_yahoo_news.py
+++ b/tests/unit/engines/test_yahoo_news.py
@@ -23,6 +23,13 @@ class TestYahooNewsEngine(SearxTestCase):
self.assertIn('sB', params['cookies'])
self.assertIn('fr', params['cookies']['sB'])
+ dicto['language'] = 'all'
+ params = yahoo_news.request(query, dicto)
+ self.assertIn('cookies', params)
+ self.assertIn('sB', params['cookies'])
+ self.assertIn('en', params['cookies']['sB'])
+ self.assertIn('en', params['url'])
+
def test_sanitize_url(self):
url = "test.url"
self.assertEqual(url, yahoo_news.sanitize_url(url))
diff --git a/tests/unit/engines/test_youtube_noapi.py b/tests/unit/engines/test_youtube_noapi.py
index 41dcbb749..cbf7b9bcd 100644
--- a/tests/unit/engines/test_youtube_noapi.py
+++ b/tests/unit/engines/test_youtube_noapi.py
@@ -46,121 +46,71 @@ class TestYoutubeNoAPIEngine(SearxTestCase):
self.assertEqual(youtube_noapi.response(response), [])
html = """
- <ol id="item-section-063864" class="item-section">
- <li>
- <div class="yt-lockup yt-lockup-tile yt-lockup-video vve-check clearfix yt-uix-tile"
- data-context-item-id="DIVZCPfAOeM"
- data-visibility-tracking="CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JECx_-GK5uqMpcIB">
- <div class="yt-lockup-dismissable"><div class="yt-lockup-thumbnail contains-addto">
- <a aria-hidden="true" href="/watch?v=DIVZCPfAOeM" class=" yt-uix-sessionlink pf-link"
- data-sessionlink="itct=CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JFIEdGVzdA">
- <div class="yt-thumb video-thumb"><img src="//i.ytimg.com/vi/DIVZCPfAOeM/mqdefault.jpg"
- width="196" height="110"/></div><span class="video-time" aria-hidden="true">11:35</span></a>
- <span class="thumb-menu dark-overflow-action-menu video-actions">
- </span>
- </div>
- <div class="yt-lockup-content">
- <h3 class="yt-lockup-title">
- <a href="/watch?v=DIVZCPfAOeM"
- class="yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link"
- data-sessionlink="itct=CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JFIEdGVzdA"
- title="Top Speed Test Kawasaki Ninja H2 (Thailand) By. MEHAY SUPERBIKE"
- aria-describedby="description-id-259079" rel="spf-prefetch" dir="ltr">
- Title
- </a>
- <span class="accessible-description" id="description-id-259079"> - Durée : 11:35.</span>
- </h3>
- <div class="yt-lockup-byline">de
- <a href="/user/mheejapan" class=" yt-uix-sessionlink spf-link g-hovercard"
- data-sessionlink="itct=CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JA" data-ytid="UCzEesu54Hjs0uRKmpy66qeA"
- data-name="">MEHAY SUPERBIKE</a></div><div class="yt-lockup-meta">
- <ul class="yt-lockup-meta-info">
- <li>il y a 20 heures</li>
- <li>8 424 vues</li>
- </ul>
- </div>
- <div class="yt-lockup-description yt-ui-ellipsis yt-ui-ellipsis-2" dir="ltr">
- Description
- </div>
- <div class="yt-lockup-badges">
- <ul class="yt-badge-list ">
- <li class="yt-badge-item" >
- <span class="yt-badge">Nouveauté</span>
- </li>
- <li class="yt-badge-item" ><span class="yt-badge " >HD</span></li>
- </ul>
- </div>
- <div class="yt-lockup-action-menu yt-uix-menu-container">
- <div class="yt-uix-menu yt-uix-videoactionmenu hide-until-delayloaded"
- data-video-id="DIVZCPfAOeM" data-menu-content-id="yt-uix-videoactionmenu-menu">
- </div>
- </div>
- </div>
- </div>
- </div>
- </li>
- </ol>
+ <div></div>
+ <script>
+ window["ytInitialData"] = {
+ "contents": {
+ "twoColumnSearchResultsRenderer": {
+ "primaryContents": {
+ "sectionListRenderer": {
+ "contents": [
+ {
+ "itemSectionRenderer": {
+ "contents": [
+ {
+ "videoRenderer": {
+ "videoId": "DIVZCPfAOeM",
+ "title": {
+ "simpleText": "Title"
+ },
+ "descriptionSnippet": {
+ "runs": [
+ {
+ "text": "Des"
+ },
+ {
+ "text": "cription"
+ }
+ ]
+ }
+ }
+ },
+ {
+ "videoRenderer": {
+ "videoId": "9C_HReR_McQ",
+ "title": {
+ "simpleText": "Title"
+ },
+ "descriptionSnippet": {
+ "simpleText": "Description"
+ }
+ }
+ }
+ ]
+ }
+ }
+ ]
+ }
+ }
+ }
+ }
+ };
+ </script>
"""
response = mock.Mock(text=html)
results = youtube_noapi.response(response)
self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
+ self.assertEqual(len(results), 2)
self.assertEqual(results[0]['title'], 'Title')
self.assertEqual(results[0]['url'], 'https://www.youtube.com/watch?v=DIVZCPfAOeM')
self.assertEqual(results[0]['content'], 'Description')
self.assertEqual(results[0]['thumbnail'], 'https://i.ytimg.com/vi/DIVZCPfAOeM/hqdefault.jpg')
self.assertTrue('DIVZCPfAOeM' in results[0]['embedded'])
-
- html = """
- <ol id="item-section-063864" class="item-section">
- <li>
- <div class="yt-lockup yt-lockup-tile yt-lockup-video vve-check clearfix yt-uix-tile"
- data-context-item-id="DIVZCPfAOeM"
- data-visibility-tracking="CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JECx_-GK5uqMpcIB">
- <div class="yt-lockup-dismissable"><div class="yt-lockup-thumbnail contains-addto">
- <a aria-hidden="true" href="/watch?v=DIVZCPfAOeM" class=" yt-uix-sessionlink pf-link"
- data-sessionlink="itct=CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JFIEdGVzdA">
- <div class="yt-thumb video-thumb"><img src="//i.ytimg.com/vi/DIVZCPfAOeM/mqdefault.jpg"
- width="196" height="110"/></div><span class="video-time" aria-hidden="true">11:35</span></a>
- <span class="thumb-menu dark-overflow-action-menu video-actions">
- </span>
- </div>
- <div class="yt-lockup-content">
- <h3 class="yt-lockup-title">
- <span class="accessible-description" id="description-id-259079"> - Durée : 11:35.</span>
- </h3>
- <div class="yt-lockup-byline">de
- <a href="/user/mheejapan" class=" yt-uix-sessionlink spf-link g-hovercard"
- data-sessionlink="itct=CBgQ3DAYACITCPGXnYau6sUCFZEIHAod-VQASCj0JA" data-ytid="UCzEesu54Hjs0uRKmpy66qeA"
- data-name="">MEHAY SUPERBIKE</a></div><div class="yt-lockup-meta">
- <ul class="yt-lockup-meta-info">
- <li>il y a 20 heures</li>
- <li>8 424 vues</li>
- </ul>
- </div>
- <div class="yt-lockup-badges">
- <ul class="yt-badge-list ">
- <li class="yt-badge-item" >
- <span class="yt-badge">Nouveauté</span>
- </li>
- <li class="yt-badge-item" ><span class="yt-badge " >HD</span></li>
- </ul>
- </div>
- <div class="yt-lockup-action-menu yt-uix-menu-container">
- <div class="yt-uix-menu yt-uix-videoactionmenu hide-until-delayloaded"
- data-video-id="DIVZCPfAOeM" data-menu-content-id="yt-uix-videoactionmenu-menu">
- </div>
- </div>
- </div>
- </div>
- </div>
- </li>
- </ol>
- """
- response = mock.Mock(text=html)
- results = youtube_noapi.response(response)
- self.assertEqual(type(results), list)
- self.assertEqual(len(results), 1)
+ self.assertEqual(results[1]['title'], 'Title')
+ self.assertEqual(results[1]['url'], 'https://www.youtube.com/watch?v=9C_HReR_McQ')
+ self.assertEqual(results[1]['content'], 'Description')
+ self.assertEqual(results[1]['thumbnail'], 'https://i.ytimg.com/vi/9C_HReR_McQ/hqdefault.jpg')
+ self.assertTrue('9C_HReR_McQ' in results[1]['embedded'])
html = """
<ol id="item-section-063864" class="item-section">
diff --git a/tests/unit/engines/unsplash_fixture.json b/tests/unit/engines/unsplash_fixture.json
new file mode 100644
index 000000000..4c8db2a2c
--- /dev/null
+++ b/tests/unit/engines/unsplash_fixture.json
@@ -0,0 +1,241 @@
+{
+ "total": 2,
+ "total_pages": 1,
+ "results": [
+ {
+ "id": "FY8d721UO_4",
+ "created_at": "2018-04-12T14:20:35-04:00",
+ "updated_at": "2018-08-28T20:58:33-04:00",
+ "width": 3891,
+ "height": 5829,
+ "color": "#152C33",
+ "description": "low angle photography of swimming penguin",
+ "urls": {
+ "raw": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=095c5fc319c5a77c705f49ad63e0f195",
+ "full": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjEyMDd9&s=74be977849c173d6929636d491a760c3",
+ "regular": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=ad65df26970bd010085f0ca25434de33",
+ "small": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=5d2edfd073c31eb8ee7b305222bdc5a2",
+ "thumb": "https://images.unsplash.com/photo-1523557148507-1b77641c7e7c?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=a9b9e56e63efc6f4611a87ce7e9a48f8"
+ },
+ "links": {
+ "self": "https://api.unsplash.com/photos/FY8d721UO_4",
+ "html": "https://unsplash.com/photos/FY8d721UO_4",
+ "download": "https://unsplash.com/photos/FY8d721UO_4/download",
+ "download_location": "https://api.unsplash.com/photos/FY8d721UO_4/download"
+ },
+ "categories": [],
+ "sponsored": false,
+ "likes": 31,
+ "liked_by_user": false,
+ "current_user_collections": [],
+ "slug": null,
+ "user": {
+ "id": "N4gE4mrG8lE",
+ "updated_at": "2018-10-03T02:51:19-04:00",
+ "username": "gaspanik",
+ "name": "Masaaki Komori",
+ "first_name": "Masaaki",
+ "last_name": "Komori",
+ "twitter_username": "cipher",
+ "portfolio_url": "https://www.instagram.com/cipher/",
+ "bio": null,
+ "location": "Tokyo, JAPAN",
+ "links": {
+ "self": "https://api.unsplash.com/users/gaspanik",
+ "html": "https://unsplash.com/@gaspanik",
+ "photos": "https://api.unsplash.com/users/gaspanik/photos",
+ "likes": "https://api.unsplash.com/users/gaspanik/likes",
+ "portfolio": "https://api.unsplash.com/users/gaspanik/portfolio",
+ "following": "https://api.unsplash.com/users/gaspanik/following",
+ "followers": "https://api.unsplash.com/users/gaspanik/followers"
+ },
+ "profile_image": {
+ "small": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32&s=9fe12f6d177bd6fdbd56d233a80c01a3",
+ "medium": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64&s=6ad7d156b62e438ae9dc794cba712fff",
+ "large": "https://images.unsplash.com/profile-fb-1502270358-e7c86c1011ce.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128&s=13a08a2e72e7d11632410e92bd3a9406"
+ },
+ "instagram_username": "cipher",
+ "total_collections": 0,
+ "total_likes": 406,
+ "total_photos": 196
+ },
+ "tags": [
+ {
+ "title": "animal"
+ },
+ {
+ "title": "water"
+ },
+ {
+ "title": "swim"
+ },
+ {
+ "title": "aquarium"
+ },
+ {
+ "title": "wallpaper"
+ },
+ {
+ "title": "blue"
+ },
+ {
+ "title": "sealife"
+ },
+ {
+ "title": "wildlife"
+ },
+ {
+ "title": "bird"
+ },
+ {
+ "title": "deep sea"
+ },
+ {
+ "title": "fish"
+ },
+ {
+ "title": "water life"
+ }
+ ],
+ "photo_tags": [
+ {
+ "title": "animal"
+ },
+ {
+ "title": "water"
+ },
+ {
+ "title": "swim"
+ },
+ {
+ "title": "aquarium"
+ },
+ {
+ "title": "wallpaper"
+ }
+ ]
+ },
+ {
+ "id": "ayKyc01xLWA",
+ "created_at": "2018-02-16T23:14:31-05:00",
+ "updated_at": "2018-08-28T20:48:27-04:00",
+ "width": 4928,
+ "height": 3264,
+ "color": "#161618",
+ "description": "black and white penguins on ice field",
+ "urls": {
+ "raw": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=4e107a2bc49ab561ba6272eea2ec725d",
+ "full": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=85&fm=jpg&crop=entropy&cs=srgb&ixid=eyJhcHBfaWQiOjEyMDd9&s=f9b1e4d4572ab44efb2cf3d601d2b4d9",
+ "regular": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=1080&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=4430cedb63841f1fe055d5005316cc96",
+ "small": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=ee73c7af22ce445d408e240821ce07af",
+ "thumb": "https://images.unsplash.com/photo-1518840801558-9770b4a34eeb?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=200&fit=max&ixid=eyJhcHBfaWQiOjEyMDd9&s=934302390d383cad8c571905e3a80bac"
+ },
+ "links": {
+ "self": "https://api.unsplash.com/photos/ayKyc01xLWA",
+ "html": "https://unsplash.com/photos/ayKyc01xLWA",
+ "download": "https://unsplash.com/photos/ayKyc01xLWA/download",
+ "download_location": "https://api.unsplash.com/photos/ayKyc01xLWA/download"
+ },
+ "categories": [],
+ "sponsored": false,
+ "likes": 37,
+ "liked_by_user": false,
+ "current_user_collections": [],
+ "slug": null,
+ "user": {
+ "id": "tRb_KGw60Xk",
+ "updated_at": "2018-09-20T11:51:54-04:00",
+ "username": "ghost_cat",
+ "name": "Danielle Barnes",
+ "first_name": "Danielle",
+ "last_name": "Barnes",
+ "twitter_username": null,
+ "portfolio_url": null,
+ "bio": null,
+ "location": null,
+ "links": {
+ "self": "https://api.unsplash.com/users/ghost_cat",
+ "html": "https://unsplash.com/@ghost_cat",
+ "photos": "https://api.unsplash.com/users/ghost_cat/photos",
+ "likes": "https://api.unsplash.com/users/ghost_cat/likes",
+ "portfolio": "https://api.unsplash.com/users/ghost_cat/portfolio",
+ "following": "https://api.unsplash.com/users/ghost_cat/following",
+ "followers": "https://api.unsplash.com/users/ghost_cat/followers"
+ },
+ "profile_image": {
+ "small": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=32&w=32&s=751bf6a557763648d52ffd7e60e79436",
+ "medium": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=64&w=64&s=e46cd1c8713035f045130e1b093b981e",
+ "large": "https://images.unsplash.com/profile-fb-1508491082-ae77f53e9ac3.jpg?ixlib=rb-0.3.5&q=80&fm=jpg&crop=faces&cs=tinysrgb&fit=crop&h=128&w=128&s=352eabcf107c3ce95fe51a18485f116b"
+ },
+ "instagram_username": null,
+ "total_collections": 0,
+ "total_likes": 0,
+ "total_photos": 21
+ },
+ "tags": [
+ {
+ "title": "ice"
+ },
+ {
+ "title": "bird"
+ },
+ {
+ "title": "ice field"
+ },
+ {
+ "title": "iceberg"
+ },
+ {
+ "title": "snow"
+ },
+ {
+ "title": "frozen"
+ },
+ {
+ "title": "animal"
+ },
+ {
+ "title": "wildlife"
+ },
+ {
+ "title": "wild"
+ },
+ {
+ "title": "antarctica"
+ },
+ {
+ "title": "sunshine"
+ },
+ {
+ "title": "daylight"
+ },
+ {
+ "title": "wilderness"
+ },
+ {
+ "title": "south pole"
+ },
+ {
+ "title": "flock"
+ }
+ ],
+ "photo_tags": [
+ {
+ "title": "ice"
+ },
+ {
+ "title": "bird"
+ },
+ {
+ "title": "ice field"
+ },
+ {
+ "title": "iceberg"
+ },
+ {
+ "title": "snow"
+ }
+ ]
+ }
+ ]
+} \ No newline at end of file
diff --git a/tests/unit/test_preferences.py b/tests/unit/test_preferences.py
index c8f2a4419..61ac0e8e4 100644
--- a/tests/unit/test_preferences.py
+++ b/tests/unit/test_preferences.py
@@ -90,30 +90,25 @@ class TestSettings(SearxTestCase):
# search language settings
def test_lang_setting_valid_choice(self):
- setting = SearchLanguageSetting('en', choices=['de', 'en'])
+ setting = SearchLanguageSetting('all', choices=['all', 'de', 'en'])
setting.parse('de')
self.assertEquals(setting.get_value(), 'de')
def test_lang_setting_invalid_choice(self):
- setting = SearchLanguageSetting('en', choices=['de', 'en'])
+ setting = SearchLanguageSetting('all', choices=['all', 'de', 'en'])
setting.parse('xx')
- self.assertEquals(setting.get_value(), 'en')
+ self.assertEquals(setting.get_value(), 'all')
def test_lang_setting_old_cookie_choice(self):
- setting = SearchLanguageSetting('en', choices=['en', 'es', 'es-ES'])
+ setting = SearchLanguageSetting('all', choices=['all', 'es', 'es-ES'])
setting.parse('es_XA')
self.assertEquals(setting.get_value(), 'es')
def test_lang_setting_old_cookie_format(self):
- setting = SearchLanguageSetting('en', choices=['en', 'es', 'es-ES'])
+ setting = SearchLanguageSetting('all', choices=['all', 'es', 'es-ES'])
setting.parse('es_ES')
self.assertEquals(setting.get_value(), 'es-ES')
- def test_lang_setting_old_default(self):
- setting = SearchLanguageSetting('en', choices=['en', 'es', 'de'])
- setting.parse('all')
- self.assertEquals(setting.get_value(), 'en')
-
# plugins settings
def test_plugins_setting_all_default_enabled(self):
plugin1 = PluginStub('plugin1', True)
@@ -127,3 +122,23 @@ class TestSettings(SearxTestCase):
plugin3 = PluginStub('plugin3', True)
setting = PluginsSetting('name', choices=[plugin1, plugin2, plugin3])
self.assertEquals(setting.get_enabled(), set(['plugin1', 'plugin3']))
+
+
+class TestPreferences(SearxTestCase):
+
+ def test_encode(self):
+ from searx.preferences import Preferences
+ pref = Preferences(['oscar'], ['general'], {}, [])
+ url_params = 'eJx1VMmO2zAM_Zr6YrTocujJh6JF0QEKzKAz7VVgJNohLIseUU7ivy-VcWy5yyGOTVGP73GLKJNPYjiYgGeT4NB8BS9YOSY' \
+ 'TUdifMDYM-vmGY1d5CN0EHTYOK88W_PXNkcDBozOjnzoK0vyi4bWnHs2RU4-zvHr_-RF9a-5Cy3GARByy7X7EkKMoBeMp9CuPQ-SzYMx' \
+ '8Vr9P1qKI-XJ_p1fOkRJWNCgVM0a-zAttmBJbHkaPSZlNts-_jiuBFgUh2mPztkpHHLBhsRArDHvm356eHh5vATS0Mqagr0ZsZO_V8hT' \
+ 'B9srt54_v6jewJugqL4Nn_hYSdhxnI-jRpi05GDQCStOT7UGVmJY8ZnltRKyF23SGiLWjqNcygKGkpyeGZIywJfD1gI5AjRTAmBM55Aw' \
+ 'Q0Tn626lj7jzWo4e5hnEsIlprX6dTgdBRpyRBFKTDgBF8AasVyT4gvSTEoXRpXWRyG3CYQYld65I_V6lboILTMAlZY65_ejRDcHgp0Tv' \
+ 'EPtGAsqTiBf3m76g7pP9B84mwjPvuUtASRDei1nDF2ix_JXW91UJkXrPh6RAhznVmKyQl7dwJdMJ6bz1QOmgzYlrEzHDMcEUuo44AgS1' \
+ 'CvkjaOb2Q2AyY5oGDTs_OLXE_c2I5cg9hk3kEJZ0fu4SuktsIA2RhuJwP86AdripThCBeO9uVUejyPGmFSxPrqEYcuWi25zOEXV9tc1m' \
+ '_KP1nafYtdfv6Q9hKfWmGm9A_3G635UwiVndLGdFCiLWkONk0xUxGLGGweGWTa2nZYZ0fS1YKlE3Uuw8fPl52E5U8HJYbC7sbjXUsrnT' \
+ 'XHXRbELfO-1fGSqskiGnMK7B0dV3t8Lq08pbdtYpuVdoKWA2Yjuyah_vHp2rZWjo0zXL8Gw8DTj0='
+ pref.parse_encoded_data(url_params)
+ self.assertEqual(
+ vars(pref.key_value_settings['categories']),
+ {'value': ['general'], 'choices': ['general', 'none']})
diff --git a/tests/unit/test_query.py b/tests/unit/test_query.py
index 49ccb608f..e4c0bdeed 100644
--- a/tests/unit/test_query.py
+++ b/tests/unit/test_query.py
@@ -62,3 +62,45 @@ class TestQuery(SearxTestCase):
self.assertEquals(len(query.query_parts), 1)
self.assertEquals(len(query.languages), 0)
self.assertFalse(query.specific)
+
+ def test_timeout_below100(self):
+ query_text = '<3 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 3)
+ self.assertFalse(query.specific)
+
+ def test_timeout_above100(self):
+ query_text = '<350 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 0.35)
+ self.assertFalse(query.specific)
+
+ def test_timeout_above1000(self):
+ query_text = '<3500 the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 3)
+ self.assertEquals(query.timeout_limit, 3.5)
+ self.assertFalse(query.specific)
+
+ def test_timeout_invalid(self):
+ # invalid number: it is not bang but it is part of the query
+ query_text = '<xxx the query'
+ query = RawTextQuery(query_text, [])
+ query.parse_query()
+
+ self.assertEquals(query.getFullQuery(), query_text)
+ self.assertEquals(len(query.query_parts), 1)
+ self.assertEquals(query.query_parts[0], query_text)
+ self.assertEquals(query.timeout_limit, None)
+ self.assertFalse(query.specific)
diff --git a/tests/unit/test_search.py b/tests/unit/test_search.py
index af5fffd8b..a39786d1a 100644
--- a/tests/unit/test_search.py
+++ b/tests/unit/test_search.py
@@ -2,9 +2,59 @@
from searx.testing import SearxTestCase
+import searx.preferences
+import searx.search
+import searx.engines
+
-# TODO
class SearchTestCase(SearxTestCase):
- def test_(self):
- pass
+ @classmethod
+ def setUpClass(cls):
+ searx.engines.initialize_engines([{
+ 'name': 'general dummy',
+ 'engine': 'dummy',
+ 'categories': 'general',
+ 'shortcut': 'gd',
+ 'timeout': 3.0
+ }])
+
+ def test_timeout_simple(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': 'general dummy'}],
+ ['general'], 'en-US', 0, 1, None, None)
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 3.0)
+
+ def test_timeout_query_above_default_nomax(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': 'general dummy'}],
+ ['general'], 'en-US', 0, 1, None, 5.0)
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 3.0)
+
+ def test_timeout_query_below_default_nomax(self):
+ searx.search.max_request_timeout = None
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': 'general dummy'}],
+ ['general'], 'en-US', 0, 1, None, 1.0)
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 1.0)
+
+ def test_timeout_query_below_max(self):
+ searx.search.max_request_timeout = 10.0
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': 'general dummy'}],
+ ['general'], 'en-US', 0, 1, None, 5.0)
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 5.0)
+
+ def test_timeout_query_above_max(self):
+ searx.search.max_request_timeout = 10.0
+ search_query = searx.query.SearchQuery('test', [{'category': 'general', 'name': 'general dummy'}],
+ ['general'], 'en-US', 0, 1, None, 15.0)
+ search = searx.search.Search(search_query)
+ search.search()
+ self.assertEquals(search.actual_timeout, 10.0)
diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py
index 4854636c7..b09b9d414 100644
--- a/tests/unit/test_utils.py
+++ b/tests/unit/test_utils.py
@@ -90,6 +90,13 @@ class TestUtils(SearxTestCase):
self.assertEqual(utils.match_language('iw-IL', ['he-IL']), 'he-IL')
self.assertEqual(utils.match_language('he-IL', ['iw-IL'], aliases), 'iw-IL')
+ def test_ecma_unscape(self):
+ self.assertEqual(utils.ecma_unescape('text%20with%20space'), 'text with space')
+ self.assertEqual(utils.ecma_unescape('text using %xx: %F3'),
+ u'text using %xx: ó')
+ self.assertEqual(utils.ecma_unescape('text using %u: %u5409, %u4E16%u754c'),
+ u'text using %u: 吉, 世界')
+
class TestHTMLTextExtractor(SearxTestCase):
@@ -128,3 +135,17 @@ class TestUnicodeWriter(SearxTestCase):
rows = [1, 2, 3]
self.unicode_writer.writerows(rows)
self.assertEqual(self.unicode_writer.writerow.call_count, len(rows))
+
+
+class TestNewHmac(SearxTestCase):
+
+ def test_bytes(self):
+ for secret_key in ['secret', b'secret', 1]:
+ if secret_key == 1:
+ with self.assertRaises(TypeError):
+ utils.new_hmac(secret_key, b'http://example.com')
+ continue
+ res = utils.new_hmac(secret_key, b'http://example.com')
+ self.assertEqual(
+ res,
+ '23e2baa2404012a5cc8e4a18b4aabf0dde4cb9b56f679ddc0fd6d7c24339d819')
diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py
index e6739bfe5..72ace4850 100644
--- a/tests/unit/test_webapp.py
+++ b/tests/unit/test_webapp.py
@@ -15,7 +15,7 @@ class ViewsTestCase(SearxTestCase):
self.app = webapp.app.test_client()
# set some defaults
- self.test_results = [
+ test_results = [
{
'content': 'first test content',
'title': 'First Test',
@@ -33,25 +33,39 @@ class ViewsTestCase(SearxTestCase):
},
]
+ timings = [
+ {
+ 'engine': 'startpage',
+ 'total': 0.8,
+ 'load': 0.7
+ },
+ {
+ 'engine': 'youtube',
+ 'total': 0.9,
+ 'load': 0.6
+ }
+ ]
+
def search_mock(search_self, *args):
- search_self.result_container = Mock(get_ordered_results=lambda: self.test_results,
+ search_self.result_container = Mock(get_ordered_results=lambda: test_results,
answers=set(),
corrections=set(),
suggestions=set(),
infoboxes=[],
unresponsive_engines=set(),
- results=self.test_results,
+ results=test_results,
results_number=lambda: 3,
- results_length=lambda: len(self.test_results))
+ results_length=lambda: len(test_results),
+ get_timings=lambda: timings)
- Search.search = search_mock
+ self.setattr4test(Search, 'search', search_mock)
def get_current_theme_name_mock(override=None):
if override:
return override
return 'legacy'
- webapp.get_current_theme_name = get_current_theme_name_mock
+ self.setattr4test(webapp, 'get_current_theme_name', get_current_theme_name_mock)
self.maxDiff = None # to see full diffs
@@ -77,6 +91,7 @@ class ViewsTestCase(SearxTestCase):
result_dict = json.loads(result.data.decode('utf-8'))
self.assertEqual('test', result_dict['query'])
+ self.assertEqual(len(result_dict['results']), 2)
self.assertEqual(result_dict['results'][0]['content'], 'first test content')
self.assertEqual(result_dict['results'][0]['url'], 'http://first.test.xyz')
@@ -157,3 +172,9 @@ class ViewsTestCase(SearxTestCase):
def test_favicon(self):
result = self.app.get('/favicon.ico')
self.assertEqual(result.status_code, 200)
+
+ def test_config(self):
+ result = self.app.get('/config')
+ self.assertEqual(result.status_code, 200)
+ json_result = result.get_json()
+ self.assertTrue(json_result)