1 | # -*- coding: utf-8 -*- |
||
2 | import json |
||
3 | import os |
||
4 | import unittest |
||
5 | import time |
||
6 | |||
7 | from requests import HTTPError |
||
8 | from sqlalchemy import engine_from_config |
||
9 | from sqlalchemy.orm import sessionmaker |
||
10 | |||
11 | from webob.multidict import MultiDict |
||
12 | from zope.sqlalchemy import ZopeTransactionExtension |
||
13 | |||
14 | from oe_utils.data.data_transfer_objects import ResultDTO |
||
15 | from oe_utils.range_parser import Range |
||
16 | from oe_utils.search.searchengine import SearchEngine |
||
17 | from tests import testdata, assert_no_exception_raised, dummy_index, dummy_mapping, incorrect_testdata, DummyDossier |
||
18 | |||
19 | try: |
||
20 | import configparser |
||
21 | except ImportError: |
||
22 | import ConfigParser as configparser |
||
23 | |||
24 | |||
25 | def index_db(session, search_engine, system_token, object_type): |
||
26 | for dd in session.query(DummyDossier): |
||
27 | search_engine.add_to_index(system_token, object_type, dd.id, json.dumps(dd.dossierdata)) |
||
28 | time.sleep(2) |
||
29 | |||
30 | |||
31 | class SearchTests(unittest.TestCase): |
||
32 | View Code Duplication | @classmethod |
|
0 ignored issues
–
show
Duplication
introduced
by
![]() |
|||
33 | def setUpClass(cls): |
||
34 | config = configparser.ConfigParser() |
||
35 | config.read(os.path.join(os.path.dirname(__file__), 'test.ini')) |
||
36 | settings = config.items('app:oe_utils') |
||
37 | cls.settings = dict((s[0], s[1]) for s in settings) |
||
38 | cls.object_type = 'dossier' |
||
39 | cls.user_acls = ["test_user", "test_role"] |
||
40 | cls.engine = engine_from_config(cls.settings, prefix='sqlalchemy.') |
||
41 | cls.session_maker = sessionmaker( |
||
42 | bind=cls.engine, |
||
43 | extension=ZopeTransactionExtension() |
||
44 | ) |
||
45 | |||
46 | def setUp(self): |
||
47 | self.search_engine = SearchEngine(self.settings['searchengine.baseurl'], |
||
48 | self.settings['searchengine.index']) |
||
49 | self.system_token = 'test_token' |
||
50 | self.search_engine.remove_index('test_token') |
||
51 | self.search_engine.create_index('test_token', data=dummy_index) |
||
52 | self.search_engine.add_type_mapping('actor', dummy_mapping, 'test_token') |
||
53 | self.session = self.session_maker() |
||
54 | |||
55 | def tearDown(self): |
||
56 | self.session.close() |
||
57 | del self.search_engine |
||
58 | |||
59 | def test_add_to_index(self): |
||
60 | object_id = 'test1' |
||
61 | assert_no_exception_raised(self.search_engine.add_to_index, self.system_token, self.object_type, object_id, |
||
62 | json.dumps(testdata)) |
||
63 | |||
64 | def test_add_to_index_KO(self): |
||
65 | object_id = 'test2' |
||
66 | self.assertRaises(HTTPError, self.search_engine.add_to_index, self.system_token, self.object_type, object_id, |
||
67 | incorrect_testdata) |
||
68 | |||
69 | def test_remove_from_index_KO(self): |
||
70 | object_id = 'test2' |
||
71 | self.assertRaises(HTTPError, self.search_engine.remove_from_index, self.system_token, self.object_type, |
||
72 | object_id) |
||
73 | |||
74 | def test_remove_from_index(self): |
||
75 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
76 | object_id = '1' |
||
77 | assert_no_exception_raised(self.search_engine.remove_from_index, self.system_token, self.object_type, object_id) |
||
78 | |||
79 | def test_remove_from_index_no_system_token(self): |
||
80 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
81 | object_id = '1' |
||
82 | assert_no_exception_raised(self.search_engine.remove_from_index, None, self.object_type, object_id) |
||
83 | |||
84 | def test_remove_from_index_by_query(self): |
||
85 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
86 | object_id = '1' |
||
87 | assert_no_exception_raised(self.search_engine.remove_from_index_by_query, self.system_token, 'id', object_id) |
||
88 | |||
89 | def test_remove_index(self): |
||
90 | assert_no_exception_raised(self.search_engine.remove_index, 'test_token') |
||
91 | |||
92 | def test_remove_index_KO(self): |
||
93 | searchengine = SearchEngine(self.settings['searchengine.baseurl'], 'testing') |
||
94 | assert_no_exception_raised(searchengine.remove_index, 'test_token') |
||
95 | |||
96 | def test_create_index(self): |
||
97 | searchengine = SearchEngine(self.settings['searchengine.baseurl'], 'test') |
||
98 | assert_no_exception_raised(searchengine.remove_index, 'test_token') |
||
99 | assert_no_exception_raised(searchengine.create_index, 'test_token', data=dummy_index) |
||
100 | |||
101 | def test_create_index_KO(self): |
||
102 | self.assertRaises(HTTPError, self.search_engine.create_index, 'test_token', data=dummy_index) |
||
103 | |||
104 | def test_add_type_mapping(self): |
||
105 | assert_no_exception_raised(self.search_engine.add_type_mapping, self.object_type, dummy_mapping, 'test_token') |
||
106 | |||
107 | def test_add_type_mapping_KO(self): |
||
108 | object_type = 'test' |
||
109 | self.assertRaises(HTTPError, self.search_engine.add_type_mapping, object_type, {}, 'test_token') |
||
110 | |||
111 | def test_query(self): |
||
112 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
113 | query = MultiDict({ |
||
114 | 'query': 'test' |
||
115 | }) |
||
116 | result_dto = self.search_engine.query(self.system_token, |
||
117 | query_params=query, |
||
118 | user_acls=self.user_acls) |
||
119 | self.assertTrue(isinstance(result_dto, ResultDTO)) |
||
120 | self.assertEqual(2, result_dto.total) |
||
121 | self.assertIsNotNone(result_dto.data) |
||
122 | |||
123 | def test_query_ranged(self): |
||
124 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
125 | object_type = 'dossier' |
||
126 | query = MultiDict({ |
||
127 | 'query': 'test' |
||
128 | }) |
||
129 | result_range = Range(start=0, end=4) |
||
130 | result_dto = self.search_engine.query(self.system_token, object_type=object_type, |
||
131 | query_params=query, |
||
132 | user_acls=self.user_acls, |
||
133 | result_range=result_range) |
||
134 | self.assertTrue(isinstance(result_dto, ResultDTO)) |
||
135 | self.assertEqual(2, result_dto.total) |
||
136 | self.assertIsNotNone(result_dto.data) |
||
137 | |||
138 | def test_query_min_score(self): |
||
139 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
140 | object_type = 'dossier' |
||
141 | query = MultiDict({ |
||
142 | 'query': 'test' |
||
143 | }) |
||
144 | result_dto = self.search_engine.query(self.system_token, object_type=object_type, |
||
145 | query_params=query, |
||
146 | user_acls=self.user_acls, |
||
147 | min_score=1) |
||
148 | self.assertTrue(isinstance(result_dto, ResultDTO)) |
||
149 | self.assertEqual(2, result_dto.total) |
||
150 | self.assertIsNotNone(result_dto.data) |
||
151 | |||
152 | def test_query_no_hits(self): |
||
153 | index_db(self.session, self.search_engine, self.system_token, self.object_type) |
||
154 | object_type = 'testing' |
||
155 | query = MultiDict({ |
||
156 | 'query': 'test' |
||
157 | }) |
||
158 | result_dto = self.search_engine.query(self.system_token, object_type=object_type, |
||
159 | query_params=query, |
||
160 | user_acls=self.user_acls) |
||
161 | self.assertTrue(isinstance(result_dto, ResultDTO)) |
||
162 | self.assertEqual(0, result_dto.total) |
||
163 | self.assertIsNotNone(result_dto.data) |
||
164 |