logo

searx

Unnamed repository; edit this file 'description' to name the repository.
commit: 147d019bbadd4eb43ba2ad588fe3a20c9ab158c5
parent: 3a2b9a86829e1a7f9bae1d3f3f69fc3bbb38cd93
Author: Adam Tauber <asciimoo@gmail.com>
Date:   Fri, 31 Jan 2014 03:20:28 -0800

Merge pull request #33 from matejc/moretests

more tests

Diffstat:

.gitignore | 2+-
searx/tests/test_unit.py | 10----------
searx/tests/test_webapp.py | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
searx/webapp.py | 13+++++++++++++
setup.py | 1+
5 files changed, 182 insertions(+), 11 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -12,7 +12,7 @@ setup.cfg bin/ build/ -covearge/ +coverage/ develop-eggs/ dist/ eggs/ diff --git a/searx/tests/test_unit.py b/searx/tests/test_unit.py @@ -1,10 +0,0 @@ -# -*- coding: utf-8 -*- - -from searx.testing import SearxTestCase - - -class UnitTestCase(SearxTestCase): - - def test_flask(self): - import flask - self.assertIn('Flask', dir(flask)) diff --git a/searx/tests/test_webapp.py b/searx/tests/test_webapp.py @@ -0,0 +1,167 @@ +# -*- coding: utf-8 -*- + +from mock import patch +from searx import webapp +from searx.testing import SearxTestCase +from urlparse import ParseResult + + +import json + + +class ViewsTestCase(SearxTestCase): + + def setUp(self): + webapp.app.config['TESTING'] = True # to get better error messages + self.app = webapp.app.test_client() + + # set some defaults + self.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=''), # 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 + }, + ] + + self.maxDiff = None # to see full diffs + + def test_index_empty(self): + result = self.app.post('/') + self.assertEqual(result.status_code, 200) + self.assertIn('<div class="title"><h1>searx</h1></div>', result.data) + + @patch('searx.webapp.search') + def test_index_html(self, search): + search.return_value = ( + self.test_results, + set() + ) + result = self.app.post('/', data={'q': 'test'}) + self.assertIn( + '<h3 class="result_title"><a href="http://first.test.xyz">First <b>Test</b></a></h3>', # noqa + result.data + ) + self.assertIn( + '<p class="content">first <b>test</b> content<br /></p>', + result.data + ) + + @patch('searx.webapp.search') + def test_index_json(self, search): + search.return_value = ( + self.test_results, + set() + ) + result = self.app.post('/', data={'q': 'test', 'format': 'json'}) + + result_dict = json.loads(result.data) + + self.assertEqual('test', result_dict['query']) + self.assertEqual( + result_dict['results'][0]['content'], 'first test content') + self.assertEqual( + result_dict['results'][0]['url'], 'http://first.test.xyz') + + @patch('searx.webapp.search') + def test_index_csv(self, search): + search.return_value = ( + self.test_results, + set() + ) + result = self.app.post('/', data={'q': 'test', 'format': 'csv'}) + + self.assertEqual( + 'title,url,content,host,engine,score\r\n' + 'First Test,http://first.test.xyz,first test content,first.test.xyz,startpage,\r\n' + 'Second Test,http://second.test.xyz,second test content,second.test.xyz,youtube,\r\n', + result.data + ) + + @patch('searx.webapp.search') + def test_index_rss(self, search): + search.return_value = ( + self.test_results, + set() + ) + result = self.app.post('/', data={'q': 'test', 'format': 'rss'}) + + self.assertIn( + '<description>Search results for "test" - searx</description>', + result.data + ) + + self.assertIn( + '<opensearch:totalResults>2</opensearch:totalResults>', + result.data + ) + + self.assertIn( + '<title>First Test</title>', + result.data + ) + + self.assertIn( + '<link>http://first.test.xyz</link>', + result.data + ) + + self.assertIn( + '<description>first test content</description>', + result.data + ) + + def test_about(self): + result = self.app.get('/about') + self.assertEqual(result.status_code, 200) + self.assertIn('<h1>About <a href="/">searx</a></h1>', result.data) + + def test_engines(self): + result = self.app.get('/engines') + self.assertEqual(result.status_code, 200) + self.assertIn('<h2>Currently used search engines</h2>', result.data) + + def test_preferences(self): + result = self.app.get('/preferences') + self.assertEqual(result.status_code, 200) + self.assertIn( + '<form method="post" action="/preferences" id="search_form">', + result.data + ) + self.assertIn( + '<legend>Default categories</legend>', + result.data + ) + self.assertIn( + '<legend>Interface language</legend>', + result.data + ) + + def test_stats(self): + result = self.app.get('/stats') + self.assertEqual(result.status_code, 200) + self.assertIn('<h2>Engine stats</h2>', result.data) + + def test_robots_txt(self): + result = self.app.get('/robots.txt') + self.assertEqual(result.status_code, 200) + self.assertIn('Allow: /', result.data) + + def test_opensearch_xml(self): + result = self.app.get('/opensearch.xml') + self.assertEqual(result.status_code, 200) + self.assertIn('<Description>Search searx</Description>', result.data) + + def test_favicon(self): + result = self.app.get('/favicon.ico') + self.assertEqual(result.status_code, 200) diff --git a/searx/webapp.py b/searx/webapp.py @@ -117,6 +117,10 @@ def parse_query(query): @app.route('/', methods=['GET', 'POST']) def index(): + """Render index page. + + Supported outputs: html, json, csv, rss. + """ paging = False lang = 'all' @@ -231,17 +235,25 @@ def index(): @app.route('/about', methods=['GET']) def about(): + """Render about page""" return render('about.html') @app.route('/engines', methods=['GET']) def list_engines(): + """Render engines page. + + List of all supported engines. + """ global categories return render('engines.html', categs=categories.items()) @app.route('/preferences', methods=['GET', 'POST']) def preferences(): + """Render preferences page. + + Settings that are going to be saved as cookies.""" lang = None if request.cookies.get('language')\ @@ -296,6 +308,7 @@ def preferences(): @app.route('/stats', methods=['GET']) def stats(): + """Render engine statistics page.""" global categories stats = get_engines_stats() return render('stats.html', stats=stats) diff --git a/setup.py b/setup.py @@ -40,6 +40,7 @@ setup( 'test': [ 'coverage', 'flake8', + 'mock', 'plone.testing', 'robotframework', 'robotframework-debuglibrary',