Repository: searx/searx

Issue:
Infinite scroll: answer are repeated on each page
How to reproduce : search for ["user agent"](https://searx.me/?q=user+agent) with Infinite scroll activated.

Should the answer be disabled except the first page ? or should Infinite Scroll hide the answer ?

I vote for the first option : disabled answers except on the first page on the server side. 



Discussion:
:+1: for disabling answers except in the first page

BTW why is the answer shown in every page? Google, Yahoo and Bing show answers only on the first page of the results. Following their practice would make it mush easier to fix this problem.

Good point, the answer should been given only on the first page.
So I guess `ctx['search'].pageno` should be tested here https://github.com/asciimoo/searx/blob/master/searx/plugins/self_info.py#L32


Resolving patch:
diff --git a/searx/plugins/self_info.py b/searx/plugins/self_info.py
--- a/searx/plugins/self_info.py
+++ b/searx/plugins/self_info.py
@@ -29,6 +29,8 @@
 #  request: flask request object
 #  ctx: the whole local context of the pre search hook
 def post_search(request, ctx):
+    if ctx['search'].pageno > 1:
+        return True
     if ctx['search'].query == 'ip':
         x_forwarded_for = request.headers.getlist("X-Forwarded-For")
         if x_forwarded_for:


Test patch:
diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py
--- a/tests/unit/test_plugins.py
+++ b/tests/unit/test_plugins.py
@@ -52,23 +52,39 @@ def test_PluginStore_init(self):
         request = Mock(user_plugins=store.plugins,
                        remote_addr='127.0.0.1')
         request.headers.getlist.return_value = []
-        ctx = get_search_mock(query='ip')
+        ctx = get_search_mock(query='ip', pageno=1)
         store.call('post_search', request, ctx)
         self.assertTrue('127.0.0.1' in ctx['search'].result_container.answers)
 
+        ctx = get_search_mock(query='ip', pageno=2)
+        store.call('post_search', request, ctx)
+        self.assertFalse('127.0.0.1' in ctx['search'].result_container.answers)
+
         # User agent test
         request = Mock(user_plugins=store.plugins,
                        user_agent='Mock')
         request.headers.getlist.return_value = []
 
-        ctx = get_search_mock(query='user-agent')
+        ctx = get_search_mock(query='user-agent', pageno=1)
         store.call('post_search', request, ctx)
         self.assertTrue('Mock' in ctx['search'].result_container.answers)
 
-        ctx = get_search_mock(query='user-agent')
+        ctx = get_search_mock(query='user-agent', pageno=2)
+        store.call('post_search', request, ctx)
+        self.assertFalse('Mock' in ctx['search'].result_container.answers)
+
+        ctx = get_search_mock(query='user-agent', pageno=1)
         store.call('post_search', request, ctx)
         self.assertTrue('Mock' in ctx['search'].result_container.answers)
 
-        ctx = get_search_mock(query='What is my User-Agent?')
+        ctx = get_search_mock(query='user-agent', pageno=2)
+        store.call('post_search', request, ctx)
+        self.assertFalse('Mock' in ctx['search'].result_container.answers)
+
+        ctx = get_search_mock(query='What is my User-Agent?', pageno=1)
         store.call('post_search', request, ctx)
         self.assertTrue('Mock' in ctx['search'].result_container.answers)
+
+        ctx = get_search_mock(query='What is my User-Agent?', pageno=2)
+        store.call('post_search', request, ctx)
+        self.assertFalse('Mock' in ctx['search'].result_container.answers)