Completed
Push — master ( a78279...04d974 )
by
unknown
10s
created

IndexerTests.tearDown()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
c 1
b 0
f 1
dl 0
loc 2
rs 10
1
import unittest
2
try:
3
    from unittest.mock import Mock, patch, MagicMock, ANY, call
4
except:
5
    from mock import Mock, patch, MagicMock, ANY, call
6
7
from pyramid.testing import DummySession
8
9
from oe_utils.search.indexer import Indexer
10
11
mock_oauth_helper = Mock()
12
mock_oauth_helper.get_system_token = Mock(return_value='test_token')
13
14
mock_session = Mock()
15
mock_session.index_new = set()
16
mock_session.index_dirty = set()
17
mock_session.index_deleted = set()
18
19
20
# def __init__(self, settings, index_operation, index_operation_name, cls)
21
#
22
index_operation_log = Mock()
23
24
25
def mock_index_operation(index_new, index_dirty, index_deleted, settings):
26
    index_operation_log.info("starting index operation")
27
    for id in index_new:
28
        index_operation_log.info("index new object {}".format(id))
29
    for id in index_dirty:
30
        index_operation_log.info("index updated object {}".format(id))
31
    for id in index_deleted:
32
        index_operation_log.info("remove object {} from index".format(id))
33
34
35
class IndexerTests(unittest.TestCase):
36
    @patch('oe_utils.search.indexer.event', Mock())
37
    def setUp(self):
38
        self.indexer = Indexer(
39
            {'searchengine.baseurl': '', 'searchengine.index': '', 'redis.queue_name': 'dummy-queue'},
40
            mock_index_operation,
41
            'tests.test_search_indexer.mock_index_operation',
42
            'test_class'
43
        )
44
45
    def tearDown(self):
46
        pass
47
48
    @patch('oe_utils.search.indexer.event', Mock())
49
    def test_when_registering_a_session_three_empty_index_sets_are_created(self):
50
        session = Mock()
51
52
        self.indexer.register_session(session)
53
54
        self.assertEquals(len(session.index_new), 0)
55
        self.assertEquals(len(session.index_dirty), 0)
56
        self.assertEquals(len(session.index_deleted), 0)
57
58
    @patch('oe_utils.search.indexer.event', Mock())
59
    def test_remove_session(self):
60
        session = Mock()
61
        session.redis = set()
62
        session.index_new = set()
63
        session.index_dirty = set()
64
        session.index_deleted = set()
65
        self.indexer.sessions = {session}
66
67
        self.indexer.remove_session(session)
68
        self.assertEquals(len(self.indexer.sessions), 0)
69
70
    @patch('oe_utils.search.indexer.event', Mock())
71
    def test_remove_session_no_indexing_sets(self):
72
        session = object()
73
        self.indexer.sessions = {session}
74
        log = Mock(warning=Mock())
75
        with patch('oe_utils.search.indexer.log', log):
76
            self.indexer.remove_session(session)
77
            self.assertEquals(log.warning.call_count, 1)
78
79
    @patch('oe_utils.search.indexer.event', Mock())
80
    @patch('oe_utils.search.indexer.object_session', Mock(return_value=object()))
81
    def test_update_listener_no_index_sets(self):
82
        target = Mock()
83
        target.id = 1
84
        log = Mock(warning=Mock())
85
        with patch('oe_utils.search.indexer.log', log):
86
            self.indexer._update_listener(Mock(), Mock(), target)
87
            self.assertEquals(log.warning.call_count, 1)
88
89
    @patch('oe_utils.search.indexer.event', Mock())
90
    @patch('oe_utils.search.indexer.object_session', Mock(return_value=mock_session))
91
    def test_update_listener(self):
92
        target = Mock()
93
        target.id = 1
94
        self.indexer._update_listener(Mock(), Mock(), target)
95
        self.assertIn(1, mock_session.index_dirty)
96
        mock_session.index_dirty = set()
97
98
    @patch('oe_utils.search.indexer.event', Mock())
99
    @patch('oe_utils.search.indexer.object_session', Mock(return_value=mock_session))
100
    def test_new_listener(self):
101
        target = Mock()
102
        target.id = 1
103
        self.indexer._new_listener(Mock(), Mock(), target)
104
        self.assertIn(1, mock_session.index_new)
105
        mock_session.index_new = set()
106
107
    @patch('oe_utils.search.indexer.event', Mock())
108
    @patch('oe_utils.search.indexer.object_session', Mock(return_value=mock_session))
109
    def test_delete_listener(self):
110
        target = Mock()
111
        target.id = 1
112
        self.indexer._delete_listener(Mock(), Mock(), target)
113
        self.assertIn(1, mock_session.index_deleted)
114
        mock_session.index_deleted = set()
115
116
    @patch('oe_utils.search.indexer.event', Mock())
117
    def test_when_registering_a_session_the_session_is_added_to_the_sessions(self):
118
        session = Mock()
119
120
        self.indexer.register_session(session)
121
122
        self.assertEquals(len(self.indexer.sessions), 1)
123
        self.assertEquals(next(iter(self.indexer.sessions)), session)
124
125
    def test_when_registering_a_session_events_for_after_commit_and_after_rollback_are_created(self):
126
        event = Mock()
127
        with patch('oe_utils.search.indexer.event', event):
128
            session = Mock()
129
            self.indexer.register_session(session)
130
131
            self.assertEquals(event.listen.call_args_list[0][0][1], 'after_commit')
132
            self.assertEquals(event.listen.call_args_list[1][0][1], 'after_rollback')
133
134 View Code Duplication
    @patch('oe_utils.search.indexer.event', Mock())
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
135
    def test_the_listener_after_rollback_clears_the_three_index_sets(self):
136
        session = Mock()
137
        self.indexer.register_session(session)
138
        session.index_new.add(Mock())
139
        session.index_dirty.add(Mock())
140
        session.index_deleted.add(Mock())
141
142
        self.indexer.after_rollback_listener(session)
143
144
        self.assertEquals(len(session.index_new), 0)
145
        self.assertEquals(len(session.index_dirty), 0)
146
        self.assertEquals(len(session.index_deleted), 0)
147
148
    def test_the_listener_after_rollback_logs_a_warning_when_no_sets_were_created(self):
149
        log = Mock(warning=Mock())
150
        with patch('oe_utils.search.indexer.log', log):
151
            self.indexer.after_rollback_listener(DummySession())
152
153
            self.assertEquals(log.warning.call_count, 1)
154
155 View Code Duplication
    @patch('oe_utils.search.indexer.event', Mock())
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
156
    def test_the_listener_after_commit_calls_the_index_functions(self):
157
        index_operation_log.reset_mock()
158
        session = Mock()
159
        self.indexer.register_session(session)
160
        session.index_new.add(1)
161
        session.index_dirty.add(2)
162
        session.index_deleted.add(3)
163
164
        self.indexer.after_commit_listener(session)
165
166
        mock_calls = [call("starting index operation"),
167
            call("index new object 1"), call("index updated object 2"), call("remove object 3 from index")]
168
169
        self.assertEquals(index_operation_log.info.mock_calls, mock_calls)
170
171
        index_operation_log.reset_mock()
172
173
    @patch('oe_utils.search.indexer.event', Mock())
174
    def test_the_listener_after_commit_no_index_sets(self):
175
        session = object()
176
        log = Mock(warning=Mock())
177
        with patch('oe_utils.search.indexer.log', log):
178
            self.indexer.after_commit_listener(session)
179
            self.assertEquals(log.warning.call_count, 1)
180
181
    @patch('oe_utils.search.indexer.event', Mock())
182
    @patch('oe_utils.search.indexer.Queue.enqueue', Mock())
183
    def test_if_redis_is_available_then_the_index_operation_will_be_queued(self):
184
        session = Mock()
185
        redis = Mock()
186
        enqueue = Mock()
187
        with patch('oe_utils.search.indexer.Queue.enqueue', enqueue):
188
            self.indexer.register_session(session, redis)
189
190
            self.indexer.after_commit_listener(session)
191
192
            self.assertEquals(enqueue.call_count, 1)
193
194
    @patch('oe_utils.search.indexer.event', Mock())
195
    def test_if_redis_queue_name_is_not_filled_in_then_a_KeyError_will_be_raised(self):
196
        session = Mock()
197
        session.redis = Mock()
198
199
        self.assertRaises(KeyError, Indexer({}, '', '', '').after_commit_listener, session)
200
201