diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000000000000000000000000000000000000..29e70ddf3e65759c8af530a13940dc6e0fa77d37 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,29 @@ +image: $CI_REGISTRY_IMAGE/env:latest + +stages: + - build + - test + +front-end: + stage: build + before_script: + - ./manage.sh npm_packages + - ./manage.sh update_dev_packages + script: + - ./manage.sh locales + - ./manage.sh styles + - ./manage.sh grunt_build + +coding-rules: + stage: build + before_script: + - ./manage.sh update_dev_packages + script: + - ./manage.sh pep8_check + +unittest: + stage: test + before_script: + - ./manage.sh update_dev_packages + script: + - ./manage.sh unit_tests diff --git a/Dockerfile.env b/Dockerfile.env new file mode 100644 index 0000000000000000000000000000000000000000..977e1d79e208cd745c53e9e1b2e10b29adcb3578 --- /dev/null +++ b/Dockerfile.env @@ -0,0 +1,8 @@ +FROM fedora + +RUN dnf install -y\ + wget\ + python2-pip\ + npm\ +&& dnf groupinstall -y "Development Tools" \ +&& pip install pytest ipdb ipython \ diff --git a/manage.sh b/manage.sh index a352ccc6e5de14ca3e4e1dbe957cd4babdba4564..3d60f13f367c0a5cc835f6c59b997724ff091e18 100755 --- a/manage.sh +++ b/manage.sh @@ -110,7 +110,7 @@ tests() { # npm_path_setup() { - which npm || (printf 'Error: npm is not found\n'; exit 1) + which npm &>/dev/null || whereis npm &>/dev/null || (printf 'Error: npm is not found\n'; exit 1) export PATH="$(npm bin)":$PATH } @@ -152,6 +152,7 @@ styles() { } grunt_build() { + npm_path_setup echo '[!] Grunt build : oscar theme' grunt --gruntfile "$SEARX_DIR/static/themes/oscar/gruntfile.js" echo '[!] Grunt build : simple theme' diff --git a/requirements-dev.txt b/requirements-dev.txt index 077a9fa2a0bfbce78320a9178238b252674ffe68..d95ed2cc0116315425a54c3b2801cfc347963d7f 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -9,3 +9,4 @@ transifex-client==0.12.2 unittest2==1.1.0 zope.testrunner==4.5.1 selenium==3.5.0 +mockredispy==2.9.3 diff --git a/searx/search_database.py b/searx/search_database.py index f2267ef84d4b9da2c7fda69871eed9f3cee44202..c588bf9f5630f0bf3a7d7d24527fa7564d53a9ae 100644 --- a/searx/search_database.py +++ b/searx/search_database.py @@ -32,7 +32,8 @@ class SearchData(object): def _get_connection(host): - return redis.StrictRedis(host if host else settings['redis']['host'], decode_responses=True) + host = host if host else settings['redis']['host'] + return redis.StrictRedis(host=host, decode_responses=True) def read(q, host): diff --git a/tests/unit/test_plugins.py b/tests/unit/test_plugins.py index e497371f8c92c7f2bccfff86eb5d71ee3f9b044c..940668fc91403e98c7a95dbe4ebe5bf59555b6e8 100644 --- a/tests/unit/test_plugins.py +++ b/tests/unit/test_plugins.py @@ -6,8 +6,7 @@ from mock import Mock def get_search_mock(query, **kwargs): - return Mock(search_query=Mock(query=query, **kwargs), - result_container=Mock(answers=set())) + return Mock(query=query, answers=set(), **kwargs) class PluginStoreTest(SearxTestCase): @@ -50,11 +49,11 @@ class SelfIPTest(SearxTestCase): request.headers.getlist.return_value = [] search = get_search_mock(query=b'ip', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('127.0.0.1' in search.result_container.answers) + self.assertTrue('127.0.0.1' in search.answers) search = get_search_mock(query=b'ip', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('127.0.0.1' in search.result_container.answers) + self.assertFalse('127.0.0.1' in search.answers) # User agent test request = Mock(user_agent='Mock') @@ -62,24 +61,24 @@ class SelfIPTest(SearxTestCase): search = get_search_mock(query=b'user-agent', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.answers) search = get_search_mock(query=b'user-agent', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('Mock' in search.answers) search = get_search_mock(query=b'user-agent', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.answers) search = get_search_mock(query=b'user-agent', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('Mock' in search.answers) search = get_search_mock(query=b'What is my User-Agent?', pageno=1) store.call(store.plugins, 'post_search', request, search) - self.assertTrue('Mock' in search.result_container.answers) + self.assertTrue('Mock' in search.answers) search = get_search_mock(query=b'What is my User-Agent?', pageno=2) store.call(store.plugins, 'post_search', request, search) - self.assertFalse('Mock' in search.result_container.answers) + self.assertFalse('Mock' in search.answers) diff --git a/tests/unit/test_webapp.py b/tests/unit/test_webapp.py index e6739bfe5961caa8e7974d997a4046ff994ced16..165426e599d022c057b52be7cd2dc93988ac1b14 100644 --- a/tests/unit/test_webapp.py +++ b/tests/unit/test_webapp.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- import json -from mock import Mock +from mock import Mock, patch +from mockredis import mock_strict_redis_client from searx import webapp from searx.testing import SearxTestCase from searx.search import Search @@ -19,12 +20,14 @@ class ViewsTestCase(SearxTestCase): { 'content': 'first test content', 'title': 'First Test', + 'category': 'general', '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', + 'category': 'general', 'title': 'Second Test', 'url': 'http://second.test.xyz', 'engines': ['youtube', 'startpage'], @@ -33,16 +36,16 @@ class ViewsTestCase(SearxTestCase): }, ] - def search_mock(search_self, *args): - search_self.result_container = Mock(get_ordered_results=lambda: self.test_results, - answers=set(), - corrections=set(), - suggestions=set(), - infoboxes=[], - unresponsive_engines=set(), - results=self.test_results, - results_number=lambda: 3, - results_length=lambda: len(self.test_results)) + def search_mock(*args): + return Mock(get_ordered_results=lambda: self.test_results, + answers=set(), + corrections=set(), + suggestions=set(), + infoboxes=[], + unresponsive_engines=set(), + results=self.test_results, + results_number=lambda: 3, + results_length=lambda: len(self.test_results)) Search.search = search_mock @@ -60,6 +63,7 @@ class ViewsTestCase(SearxTestCase): self.assertEqual(result.status_code, 200) self.assertIn(b'