# SPDX-License-Identifier: AGPL-3.0-or-later # pylint: disable=missing-module-docstring import logging import json from urllib.parse import ParseResult from mock import Mock from searx.results import Timing import searx.search.processors from searx.search import Search from searx.preferences import Preferences from tests import SearxTestCase class ViewsTestCase(SearxTestCase): # pylint: disable=missing-class-docstring, too-many-public-methods def setUp(self): # skip init function (no external HTTP request) def dummy(*args, **kwargs): # pylint: disable=unused-argument pass self.setattr4test(searx.search.processors, 'initialize_processor', dummy) log = logging.getLogger("searx") log_lev = log.level log.setLevel(logging.ERROR) from searx import webapp # pylint: disable=import-outside-toplevel log.setLevel(log_lev) webapp.app.config['TESTING'] = True # to get better error messages self.app = webapp.app.test_client() # remove sha for the static file # so the tests don't have to care about the changing URLs for k in webapp.static_files: webapp.static_files[k] = None # set some defaults test_results = [ { '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='' ), 'template': 'default.html', }, { '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='' ), 'template': 'default.html', }, ] timings = [ Timing(engine='startpage', total=0.8, load=0.7), Timing(engine='youtube', total=0.9, load=0.6), ] def search_mock(search_self, *args): # pylint: disable=unused-argument search_self.result_container = Mock( get_ordered_results=lambda: test_results, answers={}, corrections=set(), suggestions=set(), infoboxes=[], unresponsive_engines=set(), results=test_results, number_of_results=3, results_length=lambda: len(test_results), get_timings=lambda: timings, redirect_url=None, engine_data={}, ) self.setattr4test(Search, 'search', search_mock) original_preferences_get_value = Preferences.get_value def preferences_get_value(preferences_self, user_setting_name: str): if user_setting_name == 'theme': return 'simple' return original_preferences_get_value(preferences_self, user_setting_name) self.setattr4test(Preferences, 'get_value', preferences_get_value) # to see full diffs self.maxDiff = None # pylint: disable=invalid-name def test_index_empty(self): result = self.app.post('/') self.assertEqual(result.status_code, 200) self.assertIn( b'
\n second test ',
result.data,
)
def test_index_json(self):
result = self.app.post('/', data={'q': 'test', 'format': 'json'})
self.assertEqual(result.status_code, 308)
def test_search_json(self):
result = self.app.post('/search', data={'q': 'test', 'format': 'json'})
result_dict = json.loads(result.data.decode())
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')
def test_index_csv(self):
result = self.app.post('/', data={'q': 'test', 'format': 'csv'})
self.assertEqual(result.status_code, 308)
def test_search_csv(self):
result = self.app.post('/search', data={'q': 'test', 'format': 'csv'})
self.assertEqual(
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
result.data,
)
def test_index_rss(self):
result = self.app.post('/', data={'q': 'test', 'format': 'rss'})
self.assertEqual(result.status_code, 308)
def test_search_rss(self):
result = self.app.post('/search', data={'q': 'test', 'format': 'rss'})
self.assertIn(b'