add view tests

This commit is contained in:
Matej Cotman 2014-01-31 07:08:24 +01:00
parent 3a2b9a8682
commit 2bcc949abe
4 changed files with 181 additions and 10 deletions

View File

@ -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))

167
searx/tests/test_webapp.py Normal file
View File

@ -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)

View File

@ -117,6 +117,10 @@ def parse_query(query):
@app.route('/', methods=['GET', 'POST']) @app.route('/', methods=['GET', 'POST'])
def index(): def index():
"""Render index page.
Supported outputs: html, json, csv, rss.
"""
paging = False paging = False
lang = 'all' lang = 'all'
@ -231,17 +235,25 @@ def index():
@app.route('/about', methods=['GET']) @app.route('/about', methods=['GET'])
def about(): def about():
"""Render about page"""
return render('about.html') return render('about.html')
@app.route('/engines', methods=['GET']) @app.route('/engines', methods=['GET'])
def list_engines(): def list_engines():
"""Render engines page.
List of all supported engines.
"""
global categories global categories
return render('engines.html', categs=categories.items()) return render('engines.html', categs=categories.items())
@app.route('/preferences', methods=['GET', 'POST']) @app.route('/preferences', methods=['GET', 'POST'])
def preferences(): def preferences():
"""Render preferences page.
Settings that are going to be saved as cookies."""
lang = None lang = None
if request.cookies.get('language')\ if request.cookies.get('language')\
@ -296,6 +308,7 @@ def preferences():
@app.route('/stats', methods=['GET']) @app.route('/stats', methods=['GET'])
def stats(): def stats():
"""Render engine statistics page."""
global categories global categories
stats = get_engines_stats() stats = get_engines_stats()
return render('stats.html', stats=stats) return render('stats.html', stats=stats)

View File

@ -40,6 +40,7 @@ setup(
'test': [ 'test': [
'coverage', 'coverage',
'flake8', 'flake8',
'mock',
'plone.testing', 'plone.testing',
'robotframework', 'robotframework',
'robotframework-debuglibrary', 'robotframework-debuglibrary',