| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | # -*- coding: utf-8 -*- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-05 20:24:31 +01:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  | from urllib.parse import ParseResult | 
					
						
							| 
									
										
										
										
											2015-10-03 17:26:07 +02:00
										 |  |  | from mock import Mock | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | from searx.testing import SearxTestCase | 
					
						
							| 
									
										
										
										
											2016-11-14 22:21:19 +01:00
										 |  |  | from searx.search import Search | 
					
						
							| 
									
										
										
										
											2021-05-05 13:08:54 +02:00
										 |  |  | import searx.search.processors | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ViewsTestCase(SearxTestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2021-04-08 18:44:29 +02:00
										 |  |  |         # skip init function (no external HTTP request) | 
					
						
							| 
									
										
										
										
											2021-05-05 13:08:54 +02:00
										 |  |  |         def dummy(*args, **kwargs): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         self.setattr4test(searx.search.processors, 'initialize_processor', dummy) | 
					
						
							| 
									
										
										
										
											2021-04-08 18:44:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         from searx import webapp  # pylint disable=import-outside-toplevel | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         webapp.app.config['TESTING'] = True  # to get better error messages | 
					
						
							|  |  |  |         self.app = webapp.app.test_client() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # set some defaults | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |         test_results = [ | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             { | 
					
						
							|  |  |  |                 'content': 'first test content', | 
					
						
							|  |  |  |                 'title': 'First Test', | 
					
						
							|  |  |  |                 'url': 'http://first.test.xyz', | 
					
						
							|  |  |  |                 'engines': ['youtube', 'startpage'], | 
					
						
							|  |  |  |                 'engine': 'startpage', | 
					
						
							|  |  |  |                 'parsed_url': ParseResult(scheme='http', netloc='first.test.xyz', path='/', params='', query='', fragment=''),  # noqa | 
					
						
							|  |  |  |             }, { | 
					
						
							|  |  |  |                 'content': 'second test content', | 
					
						
							|  |  |  |                 'title': 'Second Test', | 
					
						
							|  |  |  |                 'url': 'http://second.test.xyz', | 
					
						
							|  |  |  |                 'engines': ['youtube', 'startpage'], | 
					
						
							|  |  |  |                 'engine': 'youtube', | 
					
						
							|  |  |  |                 'parsed_url': ParseResult(scheme='http', netloc='second.test.xyz', path='/', params='', query='', fragment=''),  # noqa | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-17 10:38:45 +02:00
										 |  |  |         timings = [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 'engine': 'startpage', | 
					
						
							|  |  |  |                 'total': 0.8, | 
					
						
							|  |  |  |                 'load': 0.7 | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 'engine': 'youtube', | 
					
						
							|  |  |  |                 'total': 0.9, | 
					
						
							|  |  |  |                 'load': 0.6 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  |         def search_mock(search_self, *args): | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |             search_self.result_container = Mock(get_ordered_results=lambda: test_results, | 
					
						
							| 
									
										
										
										
											2020-06-11 10:15:15 +02:00
										 |  |  |                                                 answers=dict(), | 
					
						
							| 
									
										
										
										
											2017-01-14 09:40:37 +01:00
										 |  |  |                                                 corrections=set(), | 
					
						
							| 
									
										
										
										
											2015-10-03 17:26:07 +02:00
										 |  |  |                                                 suggestions=set(), | 
					
						
							|  |  |  |                                                 infoboxes=[], | 
					
						
							| 
									
										
										
										
											2017-07-19 17:23:54 +02:00
										 |  |  |                                                 unresponsive_engines=set(), | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |                                                 results=test_results, | 
					
						
							| 
									
										
										
										
											2016-07-16 21:53:42 +02:00
										 |  |  |                                                 results_number=lambda: 3, | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |                                                 results_length=lambda: len(test_results), | 
					
						
							| 
									
										
										
										
											2020-07-03 15:25:04 +02:00
										 |  |  |                                                 get_timings=lambda: timings, | 
					
						
							| 
									
										
										
										
											2021-03-02 14:24:55 +01:00
										 |  |  |                                                 redirect_url=None, | 
					
						
							|  |  |  |                                                 engine_data={}) | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |         self.setattr4test(Search, 'search', search_mock) | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-08 16:38:05 +02:00
										 |  |  |         def get_current_theme_name_mock(override=None): | 
					
						
							| 
									
										
										
										
											2017-01-13 22:15:11 +01:00
										 |  |  |             if override: | 
					
						
							|  |  |  |                 return override | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |             return 'oscar' | 
					
						
							| 
									
										
										
										
											2016-04-08 16:38:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |         self.setattr4test(webapp, 'get_current_theme_name', get_current_theme_name_mock) | 
					
						
							| 
									
										
										
										
											2016-04-08 16:38:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         self.maxDiff = None  # to see full diffs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_index_empty(self): | 
					
						
							|  |  |  |         result = self.app.post('/') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |         self.assertIn(b'<div class="text-hide center-block" id="main-logo">' | 
					
						
							|  |  |  |                       + b'<img class="center-block img-responsive" src="/static/themes/oscar/img/logo_searx_a.png"' | 
					
						
							|  |  |  |                       + b' alt="searx logo" />searx</div>', result.data) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 12:11:52 +01:00
										 |  |  |     def test_index_html_post(self): | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         result = self.app.post('/', data={'q': 'test'}) | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |         self.assertEqual(result.status_code, 308) | 
					
						
							| 
									
										
										
										
											2020-11-06 12:11:52 +01:00
										 |  |  |         self.assertEqual(result.location, 'http://localhost/search') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_index_html_get(self): | 
					
						
							|  |  |  |         result = self.app.post('/?q=test') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 308) | 
					
						
							|  |  |  |         self.assertEqual(result.location, 'http://localhost/search?q=test') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_search_empty_html(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': ''}) | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2021-04-25 11:42:42 +02:00
										 |  |  |         self.assertIn(b'<span class="instance pull-left"><a href="/">searxng</a></span>', result.data) | 
					
						
							| 
									
										
										
										
											2020-11-06 12:11:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_search_empty_json(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': '', 'format': 'json'}) | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 400) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_search_empty_csv(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': '', 'format': 'csv'}) | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 400) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_search_empty_rss(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': '', 'format': 'rss'}) | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 400) | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_search_html(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': 'test'}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |             b'<h4 class="result_header" id="result-2"><img width="32" height="32" class="favicon"' | 
					
						
							|  |  |  |             + b' src="/static/themes/oscar/img/icons/youtube.png" alt="youtube" /><a href="http://second.test.xyz"' | 
					
						
							|  |  |  |             + b' rel="noreferrer" aria-labelledby="result-2">Second <span class="highlight">Test</span></a></h4>',  # noqa | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |             b'<p class="result-content">second <span class="highlight">test</span> content</p>',  # noqa | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  |     def test_index_json(self): | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         result = self.app.post('/', data={'q': 'test', 'format': 'json'}) | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |         self.assertEqual(result.status_code, 308) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |     def test_search_json(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': 'test', 'format': 'json'}) | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  |         result_dict = json.loads(result.data.decode()) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual('test', result_dict['query']) | 
					
						
							| 
									
										
										
										
											2019-08-03 13:23:36 +02:00
										 |  |  |         self.assertEqual(len(result_dict['results']), 2) | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |         self.assertEqual(result_dict['results'][0]['content'], 'first test content') | 
					
						
							|  |  |  |         self.assertEqual(result_dict['results'][0]['url'], 'http://first.test.xyz') | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  |     def test_index_csv(self): | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         result = self.app.post('/', data={'q': 'test', 'format': 'csv'}) | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |         self.assertEqual(result.status_code, 308) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_search_csv(self): | 
					
						
							|  |  |  |         result = self.app.post('/search', data={'q': 'test', 'format': 'csv'}) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual( | 
					
						
							| 
									
										
										
										
											2020-03-13 01:05:02 +01:00
										 |  |  |             b'title,url,content,host,engine,score,type\r\n' | 
					
						
							|  |  |  |             b'First Test,http://first.test.xyz,first test content,first.test.xyz,startpage,,result\r\n'  # noqa | 
					
						
							|  |  |  |             b'Second Test,http://second.test.xyz,second test content,second.test.xyz,youtube,,result\r\n',  # noqa | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-11 21:23:28 +01:00
										 |  |  |     def test_index_rss(self): | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |         result = self.app.post('/', data={'q': 'test', 'format': 'rss'}) | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |         self.assertEqual(result.status_code, 308) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-15 10:26:15 +01:00
										 |  |  |     def test_search_rss(self): | 
					
						
							| 
									
										
										
										
											2019-07-30 06:25:05 +02:00
										 |  |  |         result = self.app.post('/search', data={'q': 'test', 'format': 'rss'}) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<description>Search results for "test" - searx</description>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<opensearch:totalResults>3</opensearch:totalResults>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<title>First Test</title>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<link>http://first.test.xyz</link>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<description>first test content</description>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_about(self): | 
					
						
							|  |  |  |         result = self.app.get('/about') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2021-04-25 11:42:42 +02:00
										 |  |  |         self.assertIn(b'<h1>About <a href="/">searxng</a></h1>', result.data) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_preferences(self): | 
					
						
							|  |  |  |         result = self.app.get('/preferences') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |             b'<form method="post" action="/preferences" id="search_form">', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |             b'<label class="col-sm-3 col-md-2" for="categories">Default categories</label>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |             b'<label class="col-sm-3 col-md-2" for="locale">Interface language</label>', | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |             result.data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-03 09:02:21 +01:00
										 |  |  |     def test_browser_locale(self): | 
					
						
							|  |  |  |         result = self.app.get('/preferences', headers={'Accept-Language': 'zh-tw;q=0.8'}) | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							|  |  |  |             b'<option value="zh_TW" selected="selected">', | 
					
						
							|  |  |  |             result.data, | 
					
						
							|  |  |  |             'Interface locale ignored browser preference.' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         self.assertIn( | 
					
						
							|  |  |  |             b'<option value="zh-TW" selected="selected">', | 
					
						
							|  |  |  |             result.data, | 
					
						
							|  |  |  |             'Search language ignored browser preference.' | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  |     def test_stats(self): | 
					
						
							|  |  |  |         result = self.app.get('/stats') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2020-12-01 10:18:57 +01:00
										 |  |  |         self.assertIn(b'<h1>Engine stats</h1>', result.data) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_robots_txt(self): | 
					
						
							|  |  |  |         result = self.app.get('/robots.txt') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |         self.assertIn(b'Allow: /', result.data) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_opensearch_xml(self): | 
					
						
							|  |  |  |         result = self.app.get('/opensearch.xml') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  |         self.assertIn(b'<Description>a privacy-respecting, hackable metasearch engine</Description>', result.data) | 
					
						
							| 
									
										
										
										
											2014-01-31 07:08:24 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_favicon(self): | 
					
						
							|  |  |  |         result = self.app.get('/favicon.ico') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							| 
									
										
										
										
											2019-05-18 12:58:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_config(self): | 
					
						
							|  |  |  |         result = self.app.get('/config') | 
					
						
							|  |  |  |         self.assertEqual(result.status_code, 200) | 
					
						
							|  |  |  |         json_result = result.get_json() | 
					
						
							|  |  |  |         self.assertTrue(json_result) |