Browse Source

[fix] fix of / and /search

* URL / : the index page displayed the selected or the default category.
* URL / : when the q parameter is set using the URL, the redirect includes the URL query.
* URL /search : an empty query doesn't raise an exception.
Alexandre Flament 4 years ago
parent
commit
b3a3ccf2db
2 changed files with 29 additions and 4 deletions
  1. 5 3
      searx/webapp.py
  2. 24 1
      tests/unit/test_webapp.py

+ 5 - 3
searx/webapp.py

@@ -537,10 +537,12 @@ def index():
 
     # redirect to search if there's a query in the request
     if request.form.get('q'):
-        return redirect(url_for('search'), 308)
+        query = ('?' + request.query_string.decode()) if request.query_string else ''
+        return redirect(url_for('search') + query, 308)
 
     return render(
         'index.html',
+        selected_categories=get_selected_categories(request.preferences, request.form),
     )
 
 
@@ -556,8 +558,8 @@ def search():
     if output_format not in ['html', 'csv', 'json', 'rss']:
         output_format = 'html'
 
-    # check if there is query
-    if request.form.get('q') is None:
+    # check if there is query (not None and not an empty string)
+    if not request.form.get('q'):
         if output_format == 'html':
             return render(
                 'index.html',

+ 24 - 1
tests/unit/test_webapp.py

@@ -75,9 +75,32 @@ class ViewsTestCase(SearxTestCase):
         self.assertEqual(result.status_code, 200)
         self.assertIn(b'<div class="title"><h1>searx</h1></div>', result.data)
 
-    def test_index_html(self):
+    def test_index_html_post(self):
         result = self.app.post('/', data={'q': 'test'})
         self.assertEqual(result.status_code, 308)
+        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)
+        self.assertIn(b'<div class="title"><h1>searx</h1></div>', result.data)
+
+    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)
 
     def test_search_html(self):
         result = self.app.post('/search', data={'q': 'test'})