summaryrefslogtreecommitdiff
path: root/tests/unit/test_standalone_searx.py
blob: 40d43e4e76ecc3395ca0f08a7040c696f7f1950a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# -*- coding: utf-8 -*-
"""Test utils/standalone_searx.py"""
import datetime
import importlib.util
import io
import sys

from mock import Mock, patch
from nose2.tools import params

from searx.search import SearchQuery, EngineRef
from searx.engines import initialize_engines
from searx.testing import SearxTestCase


def get_standalone_searx_module():
    """Get standalone_searx module."""
    module_name = 'utils.standalone_searx'
    filename = 'utils/standalone_searx.py'
    spec = importlib.util.spec_from_file_location(module_name, filename)
    sas = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(sas)
    return sas


class StandaloneSearx(SearxTestCase):
    """Unit test for standalone_searx."""

    @classmethod
    def setUpClass(cls):
        engine_list = [{'engine': 'dummy', 'name': 'engine1', 'shortcut': 'e1'},
                       {'engine': 'dummy', 'name': 'engine2', 'shortcut': 'e2'}]

        initialize_engines(engine_list)

    def test_parse_argument_no_args(self):
        """Test parse argument without args."""
        sas = get_standalone_searx_module()
        with patch.object(sys, 'argv', ['standalone_searx']), \
                self.assertRaises(SystemExit):
            sys.stderr = io.StringIO()
            sas.parse_argument()
            sys.stdout = sys.__stderr__

    def test_parse_argument_basic_args(self):
        """Test parse argument with basic args."""
        sas = get_standalone_searx_module()
        query = 'red box'
        exp_dict = {
            'query': query, 'category': 'general', 'lang': 'all', 'pageno': 1,
            'safesearch': '0', 'timerange': None}
        args = ['standalone_searx', query]
        with patch.object(sys, 'argv', args):
            res = sas.parse_argument()
            self.assertEqual(exp_dict, vars(res))
        res2 = sas.parse_argument(args[1:])
        self.assertEqual(exp_dict, vars(res2))

    def test_to_dict(self):
        """test to_dict."""
        sas = get_standalone_searx_module()
        self.assertEqual(
            sas.to_dict(
                sas.get_search_query(sas.parse_argument(['red box']))),
            {
                'search': {
                    'q': 'red box', 'pageno': 1, 'lang': 'all',
                    'safesearch': 0, 'timerange': None
                },
                'results': [], 'infoboxes': [], 'suggestions': [],
                'answers': [], 'paging': False, 'results_number': 0
            }
        )

    def test_to_dict_with_mock(self):
        """test to dict."""
        sas = get_standalone_searx_module()
        with patch.object(sas.searx.search, 'Search') as mock_s:
            m_search = mock_s().search()
            m_sq = Mock()
            self.assertEqual(
                sas.to_dict(m_sq),
                {
                    'answers': [],
                    'infoboxes': m_search.infoboxes,
                    'paging': m_search.paging,
                    'results': m_search.get_ordered_results(),
                    'results_number': m_search.results_number(),
                    'search': {
                        'lang': m_sq.lang,
                        'pageno': m_sq.pageno,
                        'q': m_sq.query,
                        'safesearch': m_sq.safesearch,
                        'timerange': m_sq.time_range,
                    },
                    'suggestions': []
                }
            )

    def test_get_search_query(self):
        """test get_search_query."""
        sas = get_standalone_searx_module()
        args = sas.parse_argument(['rain', ])
        search_q = sas.get_search_query(args)
        self.assertTrue(search_q)
        self.assertEqual(search_q, SearchQuery('rain', [EngineRef('engine1', 'general', False),
                                                        EngineRef('engine2', 'general', False)],
                         ['general'], 'all', 0, 1, None, None, None))

    def test_no_parsed_url(self):
        """test no_parsed_url func"""
        sas = get_standalone_searx_module()
        self.assertEqual(
            sas.no_parsed_url([{'parsed_url': 'http://example.com'}]),
            [{}]
        )

    @params(
        (datetime.datetime(2020, 1, 1), '2020-01-01T00:00:00'),
        ('a'.encode('utf8'), 'a'),
        (set([1]), [1])
    )
    def test_json_serial(self, arg, exp_res):
        """test json_serial func"""
        sas = get_standalone_searx_module()
        self.assertEqual(sas.json_serial(arg), exp_res)

    def test_json_serial_error(self):
        """test error on json_serial."""
        sas = get_standalone_searx_module()
        with self.assertRaises(TypeError):
            sas.json_serial('a')