1
1
from datetime import UTC , datetime , timedelta
2
- from unittest . mock import MagicMock
2
+ from unittest import mock
3
3
4
4
import pytest
5
5
6
+ from jbi .errors import IgnoreInvalidRequestError
6
7
from jbi .retry import RETRY_TIMEOUT_DAYS , retry_failed
7
8
from jbi .runner import execute_action
8
9
9
10
10
- def iter_error ():
11
- mock = MagicMock ()
12
- mock .__aiter__ .return_value = None
13
- mock .__aiter__ .side_effect = Exception ("Throwing an exception" )
14
- return mock
11
+ def mock_aiter_error ():
12
+ _mock = mock . MagicMock ()
13
+ _mock .__aiter__ .return_value = None
14
+ _mock .__aiter__ .side_effect = Exception ("Throwing an exception" )
15
+ return _mock
15
16
16
17
17
18
async def aiter_sync (iterable ):
@@ -20,8 +21,8 @@ async def aiter_sync(iterable):
20
21
21
22
22
23
@pytest .fixture
23
- def mock_executor ():
24
- return MagicMock (spec = execute_action )
24
+ def mock_executor (mocker ):
25
+ return mocker . MagicMock (spec = execute_action )
25
26
26
27
27
28
@pytest .mark .asyncio
@@ -116,7 +117,6 @@ async def test_retry_remove_expired(
116
117
len (mock_queue .done .call_args_list ) == 2
117
118
), "both items should have been marked as done"
118
119
assert caplog .text .count ("failed to reprocess event" ) == 0
119
- assert caplog .text .count ("skipping events" ) == 0
120
120
assert caplog .text .count ("removing expired event" ) == 1
121
121
mock_executor .assert_called_once () # only one item should have been attempted to be processed
122
122
assert metrics == {
@@ -128,18 +128,42 @@ async def test_retry_remove_expired(
128
128
}
129
129
130
130
131
+ @pytest .mark .asyncio
132
+ async def test_retry_remove_invalid (
133
+ caplog , mock_queue , mock_executor , queue_item_factory
134
+ ):
135
+ mock_queue .retrieve .return_value = {
136
+ 1 : aiter_sync (queue_item_factory .create_batch (2 ))
137
+ }
138
+ mock_executor .side_effect = [
139
+ IgnoreInvalidRequestError ("How did this get in here" ),
140
+ mock .DEFAULT ,
141
+ ]
142
+ metrics = await retry_failed (item_executor = mock_executor , queue = mock_queue )
143
+ assert (
144
+ len (mock_queue .done .call_args_list ) == 2
145
+ ), "both items should have been marked as done"
146
+ assert caplog .text .count ("removing invalid event" ) == 1
147
+ assert metrics == {
148
+ "bug_count" : 1 ,
149
+ "events_processed" : 2 ,
150
+ "events_skipped" : 0 ,
151
+ "events_failed" : 0 ,
152
+ "bugs_failed" : 0 ,
153
+ }
154
+
155
+
131
156
@pytest .mark .asyncio
132
157
async def test_retry_bug_failed (caplog , mock_queue , mock_executor , queue_item_factory ):
133
158
mock_queue .retrieve .return_value = {
134
159
1 : aiter_sync ([queue_item_factory (payload__bug__id = 1 )]),
135
- 2 : iter_error (),
160
+ 2 : mock_aiter_error (),
136
161
}
137
162
138
163
metrics = await retry_failed (item_executor = mock_executor , queue = mock_queue )
139
164
mock_queue .retrieve .assert_called_once ()
140
165
mock_queue .done .assert_called_once () # one item should have been marked as done
141
166
assert caplog .text .count ("failed to reprocess event" ) == 0
142
- assert caplog .text .count ("skipping events" ) == 0
143
167
assert caplog .text .count ("removing expired event" ) == 0
144
168
assert caplog .text .count ("failed to parse events for bug" ) == 1
145
169
mock_executor .assert_called_once () # only one item should have been attempted to be processed
0 commit comments