aa-killtracker 0.17.0__py3-none-any.whl → 0.18.0a2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-0.18.0a2.dist-info}/METADATA +1 -1
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-0.18.0a2.dist-info}/RECORD +28 -24
- killtracker/__init__.py +1 -1
- killtracker/admin.py +13 -8
- killtracker/app_settings.py +7 -4
- killtracker/apps.py +2 -4
- killtracker/core/discord_messages.py +129 -55
- killtracker/core/killmails.py +92 -59
- killtracker/core/worker_shutdown.py +47 -0
- killtracker/forms.py +1 -1
- killtracker/managers.py +3 -3
- killtracker/models/trackers.py +5 -7
- killtracker/models/webhooks.py +71 -90
- killtracker/providers.py +1 -1
- killtracker/signals.py +31 -0
- killtracker/tasks.py +141 -90
- killtracker/tests/core/test_discord_messages_1.py +54 -7
- killtracker/tests/core/test_discord_messages_2.py +8 -8
- killtracker/tests/core/test_killmails.py +74 -29
- killtracker/tests/core/test_worker_shutdown.py +34 -0
- killtracker/tests/models/test_trackers_1.py +23 -23
- killtracker/tests/models/test_trackers_2.py +5 -4
- killtracker/tests/models/test_webhook.py +54 -40
- killtracker/tests/test_integration.py +2 -2
- killtracker/tests/test_tasks.py +107 -48
- killtracker/tests/utils.py +16 -0
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-0.18.0a2.dist-info}/WHEEL +0 -0
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-0.18.0a2.dist-info}/licenses/LICENSE +0 -0
@@ -1,9 +1,8 @@
|
|
1
|
+
import datetime as dt
|
1
2
|
import unittest
|
2
|
-
from datetime import timedelta
|
3
3
|
from unittest.mock import patch
|
4
4
|
|
5
5
|
import requests_mock
|
6
|
-
from redis.exceptions import LockError
|
7
6
|
|
8
7
|
from django.core.cache import cache
|
9
8
|
from django.core.exceptions import ImproperlyConfigured
|
@@ -18,6 +17,7 @@ from killtracker.core.killmails import (
|
|
18
17
|
ZKB_API_URL,
|
19
18
|
ZKB_REDISQ_URL,
|
20
19
|
Killmail,
|
20
|
+
ZKBTooManyRequestsError,
|
21
21
|
_EntityCount,
|
22
22
|
)
|
23
23
|
from killtracker.exceptions import KillmailDoesNotExist
|
@@ -31,11 +31,12 @@ requests_mock.mock.case_sensitive = True
|
|
31
31
|
|
32
32
|
|
33
33
|
@requests_mock.Mocker()
|
34
|
-
@patch(MODULE_PATH + ".
|
34
|
+
@patch(MODULE_PATH + ".cache")
|
35
35
|
class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
36
36
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
37
|
-
def test_should_return_killmail(self, requests_mocker,
|
37
|
+
def test_should_return_killmail(self, requests_mocker, mock_cache):
|
38
38
|
# given
|
39
|
+
mock_cache.get.return_value = None
|
39
40
|
requests_mocker.register_uri(
|
40
41
|
"GET",
|
41
42
|
ZKB_REDISQ_URL,
|
@@ -48,7 +49,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
48
49
|
self.assertIsNotNone(killmail)
|
49
50
|
self.assertEqual(killmail.id, 10000001)
|
50
51
|
self.assertEqual(killmail.solar_system_id, 30004984)
|
51
|
-
self.assertAlmostEqual(killmail.time, now(), delta=timedelta(seconds=120))
|
52
|
+
self.assertAlmostEqual(killmail.time, now(), delta=dt.timedelta(seconds=120))
|
52
53
|
self.assertEqual(killmail.victim.alliance_id, 3011)
|
53
54
|
self.assertEqual(killmail.victim.character_id, 1011)
|
54
55
|
self.assertEqual(killmail.victim.corporation_id, 2011)
|
@@ -75,9 +76,10 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
75
76
|
|
76
77
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
77
78
|
def test_should_return_none_when_zkb_returns_empty_package(
|
78
|
-
self, requests_mocker,
|
79
|
+
self, requests_mocker, mock_cache
|
79
80
|
):
|
80
81
|
# given
|
82
|
+
mock_cache.get.return_value = None
|
81
83
|
requests_mocker.register_uri(
|
82
84
|
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
83
85
|
)
|
@@ -88,9 +90,10 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
88
90
|
|
89
91
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
90
92
|
def test_should_handle_zkb_data_has_no_solar_system(
|
91
|
-
self, requests_mocker,
|
93
|
+
self, requests_mocker, mock_cache
|
92
94
|
):
|
93
95
|
# given
|
96
|
+
mock_cache.get.return_value = None
|
94
97
|
requests_mocker.register_uri(
|
95
98
|
"GET",
|
96
99
|
ZKB_REDISQ_URL,
|
@@ -103,23 +106,48 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
103
106
|
self.assertIsNotNone(killmail)
|
104
107
|
|
105
108
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
106
|
-
def
|
107
|
-
self, requests_mocker, mock_redis
|
108
|
-
):
|
109
|
+
def test_should_return_none_when_http_error(self, requests_mocker, mock_cache):
|
109
110
|
# given
|
110
|
-
|
111
|
-
|
112
|
-
)
|
111
|
+
mock_cache.get.return_value = None
|
112
|
+
requests_mocker.register_uri("GET", ZKB_REDISQ_URL, status_code=500)
|
113
113
|
# when
|
114
114
|
killmail = Killmail.create_from_zkb_redisq()
|
115
115
|
# then
|
116
116
|
self.assertIsNone(killmail)
|
117
117
|
|
118
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
119
|
+
def test_should_return_raise_too_many_requests_error(
|
120
|
+
self, requests_mocker, mock_cache
|
121
|
+
):
|
122
|
+
# given
|
123
|
+
mock_cache.get.return_value = None
|
124
|
+
requests_mocker.register_uri(
|
125
|
+
"GET", ZKB_REDISQ_URL, status_code=429, text="429 too many requests"
|
126
|
+
)
|
127
|
+
# when/then
|
128
|
+
with self.assertRaises(ZKBTooManyRequestsError):
|
129
|
+
Killmail.create_from_zkb_redisq()
|
130
|
+
|
131
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
132
|
+
def test_should_reraise_too_many_requests_error_when_ongoing(
|
133
|
+
self, requests_mocker, mock_cache
|
134
|
+
):
|
135
|
+
# given
|
136
|
+
retry_at = now() + dt.timedelta(hours=3)
|
137
|
+
mock_cache.get.return_value = retry_at.isoformat()
|
138
|
+
requests_mocker.register_uri("GET", ZKB_REDISQ_URL, status_code=500)
|
139
|
+
# when/then
|
140
|
+
self.assertEqual(requests_mocker.call_count, 0)
|
141
|
+
with self.assertRaises(ZKBTooManyRequestsError) as ex:
|
142
|
+
Killmail.create_from_zkb_redisq()
|
143
|
+
self.assertEqual(retry_at, ex.exception.retry_at)
|
144
|
+
|
118
145
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
119
146
|
def test_should_return_none_when_zkb_returns_general_error(
|
120
|
-
self, requests_mocker,
|
147
|
+
self, requests_mocker, mock_cache
|
121
148
|
):
|
122
149
|
# given
|
150
|
+
mock_cache.get.return_value = None
|
123
151
|
requests_mocker.register_uri(
|
124
152
|
"GET",
|
125
153
|
ZKB_REDISQ_URL,
|
@@ -135,9 +163,10 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
135
163
|
|
136
164
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
137
165
|
def test_should_return_none_when_zkb_does_not_return_json(
|
138
|
-
self, requests_mocker,
|
166
|
+
self, requests_mocker, mock_cache
|
139
167
|
):
|
140
168
|
# given
|
169
|
+
mock_cache.get.return_value = None
|
141
170
|
requests_mocker.register_uri(
|
142
171
|
"GET", ZKB_REDISQ_URL, status_code=200, text="this is not JSON"
|
143
172
|
)
|
@@ -146,18 +175,10 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
146
175
|
# then
|
147
176
|
self.assertIsNone(killmail)
|
148
177
|
|
149
|
-
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
150
|
-
def test_should_return_none_if_lock_not_acquired(self, requests_mocker, mock_redis):
|
151
|
-
# given
|
152
|
-
mock_redis.return_value.lock.side_effect = LockError
|
153
|
-
# when
|
154
|
-
killmail = Killmail.create_from_zkb_redisq()
|
155
|
-
# then
|
156
|
-
self.assertIsNone(killmail)
|
157
|
-
|
158
178
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Voltron9000")
|
159
|
-
def test_should_have_queue_id_in_request(self, requests_mocker,
|
179
|
+
def test_should_have_queue_id_in_request(self, requests_mocker, mock_cache):
|
160
180
|
# given
|
181
|
+
mock_cache.get.return_value = None
|
161
182
|
requests_mocker.register_uri(
|
162
183
|
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
163
184
|
)
|
@@ -171,8 +192,9 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
171
192
|
self.assertEqual(queue_id[0], "Voltron9000")
|
172
193
|
|
173
194
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "")
|
174
|
-
def test_should_abort_when_no_queue_id_defined(self, requests_mocker,
|
195
|
+
def test_should_abort_when_no_queue_id_defined(self, requests_mocker, mock_cache):
|
175
196
|
# given
|
197
|
+
mock_cache.get.return_value = None
|
176
198
|
requests_mocker.register_uri(
|
177
199
|
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
178
200
|
)
|
@@ -181,8 +203,9 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
181
203
|
Killmail.create_from_zkb_redisq()
|
182
204
|
|
183
205
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Möchtegern")
|
184
|
-
def test_should_urlize_queue_ids(self, requests_mocker,
|
206
|
+
def test_should_urlize_queue_ids(self, requests_mocker, mock_cache):
|
185
207
|
# given
|
208
|
+
mock_cache.get.return_value = None
|
186
209
|
requests_mocker.register_uri(
|
187
210
|
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
188
211
|
)
|
@@ -196,8 +219,9 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
196
219
|
self.assertEqual(queue_id[0], "M%C3%B6chtegern")
|
197
220
|
|
198
221
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "alpha,bravo")
|
199
|
-
def test_should_not_accept_list_for_queue_id(self, requests_mocker,
|
222
|
+
def test_should_not_accept_list_for_queue_id(self, requests_mocker, mock_cache):
|
200
223
|
# given
|
224
|
+
mock_cache.get.return_value = None
|
201
225
|
requests_mocker.register_uri(
|
202
226
|
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
203
227
|
)
|
@@ -205,6 +229,27 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
205
229
|
with self.assertRaises(ImproperlyConfigured):
|
206
230
|
Killmail.create_from_zkb_redisq()
|
207
231
|
|
232
|
+
@patch(MODULE_PATH + ".sleep")
|
233
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
234
|
+
def test_should_wait_until_next_slot_if_needed(
|
235
|
+
self, requests_mocker, mock_sleep, mock_cache
|
236
|
+
):
|
237
|
+
def cache_get(v):
|
238
|
+
if v != "killtracker-last-request":
|
239
|
+
return None
|
240
|
+
return now().isoformat()
|
241
|
+
|
242
|
+
# given
|
243
|
+
mock_cache.get = cache_get
|
244
|
+
requests_mocker.register_uri(
|
245
|
+
"GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
246
|
+
)
|
247
|
+
# when
|
248
|
+
killmail = Killmail.create_from_zkb_redisq()
|
249
|
+
# then
|
250
|
+
self.assertIsNone(killmail)
|
251
|
+
self.assertTrue(mock_sleep.called)
|
252
|
+
|
208
253
|
|
209
254
|
class TestKillmailSerialization(NoSocketsTestCase):
|
210
255
|
def test_dict_serialization(self):
|
@@ -337,7 +382,7 @@ class TestCreateFromZkbApi(NoSocketsTestCase):
|
|
337
382
|
killmail = Killmail.create_from_zkb_api(killmail_id)
|
338
383
|
self.assertIsNotNone(killmail)
|
339
384
|
self.assertEqual(killmail.id, killmail_id)
|
340
|
-
self.assertAlmostEqual(killmail.time, now(), delta=timedelta(seconds=120))
|
385
|
+
self.assertAlmostEqual(killmail.time, now(), delta=dt.timedelta(seconds=120))
|
341
386
|
|
342
387
|
self.assertEqual(killmail.victim.alliance_id, 3011)
|
343
388
|
self.assertEqual(killmail.victim.character_id, 1011)
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from unittest.mock import patch
|
2
|
+
|
3
|
+
from django.test import TestCase
|
4
|
+
|
5
|
+
from killtracker.core.worker_shutdown import is_shutting_down
|
6
|
+
|
7
|
+
MODULE_PATH = "killtracker.core.worker_shutdown"
|
8
|
+
|
9
|
+
|
10
|
+
class FakeTask:
|
11
|
+
class FakeRequest:
|
12
|
+
def __init__(self, hostname: str):
|
13
|
+
self.hostname = hostname
|
14
|
+
|
15
|
+
def __init__(self, hostname: str):
|
16
|
+
self.request = self.FakeRequest(hostname)
|
17
|
+
|
18
|
+
|
19
|
+
@patch(MODULE_PATH + ".cache")
|
20
|
+
class TestWorkerShutdown(TestCase):
|
21
|
+
def test_should_report_false_when_not_set(self, mock_cache):
|
22
|
+
mock_cache.get.return_value = None
|
23
|
+
got = is_shutting_down("dummy")
|
24
|
+
self.assertFalse(got)
|
25
|
+
|
26
|
+
def test_should_report_true_when_set(self, mock_cache):
|
27
|
+
mock_cache.get.return_value = "value"
|
28
|
+
got = is_shutting_down(FakeTask("dummy"))
|
29
|
+
self.assertTrue(got)
|
30
|
+
|
31
|
+
def test_should_report_false_when_task_not_valid(self, mock_cache):
|
32
|
+
mock_cache.get.return_value = "value"
|
33
|
+
got = is_shutting_down("invalid")
|
34
|
+
self.assertFalse(got)
|
@@ -848,7 +848,7 @@ class TestTrackerCalculateTrackerInfo(LoadTestDataMixin, NoSocketsTestCase):
|
|
848
848
|
class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
849
849
|
def setUp(self) -> None:
|
850
850
|
self.tracker = TrackerFactory(name="My Tracker", webhook=self.webhook_1)
|
851
|
-
self.webhook_1.
|
851
|
+
self.webhook_1._main_queue.clear()
|
852
852
|
|
853
853
|
@patch(MODELS_PATH + ".webhooks.KILLTRACKER_WEBHOOK_SET_AVATAR", True)
|
854
854
|
@patch("eveuniverse.models.universe_2.esi")
|
@@ -866,8 +866,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
866
866
|
|
867
867
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
868
868
|
|
869
|
-
self.assertEqual(self.webhook_1.
|
870
|
-
message = json.loads(self.webhook_1.
|
869
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
870
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
871
871
|
|
872
872
|
self.assertEqual(message["username"], "Killtracker")
|
873
873
|
self.assertIsNotNone(message["avatar_url"])
|
@@ -893,8 +893,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
893
893
|
|
894
894
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
895
895
|
|
896
|
-
self.assertEqual(self.webhook_1.
|
897
|
-
message = json.loads(self.webhook_1.
|
896
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
897
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
898
898
|
self.assertNotIn("username", message)
|
899
899
|
self.assertNotIn("avatar_url", message)
|
900
900
|
self.assertIn("My Tracker", message["content"])
|
@@ -906,8 +906,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
906
906
|
|
907
907
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
908
908
|
|
909
|
-
self.assertEqual(self.webhook_1.
|
910
|
-
message = json.loads(self.webhook_1.
|
909
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
910
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
911
911
|
self.assertIn("| Fleetkill", message["embeds"][0]["title"])
|
912
912
|
|
913
913
|
def test_can_add_intro_text(self):
|
@@ -915,8 +915,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
915
915
|
|
916
916
|
self.tracker.generate_killmail_message(killmail, intro_text="Intro Text")
|
917
917
|
|
918
|
-
self.assertEqual(self.webhook_1.
|
919
|
-
message = json.loads(self.webhook_1.
|
918
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
919
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
920
920
|
self.assertIn("Intro Text", message["content"])
|
921
921
|
|
922
922
|
def test_without_tracker_info(self):
|
@@ -924,7 +924,7 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
924
924
|
|
925
925
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
926
926
|
|
927
|
-
self.assertEqual(self.webhook_1.
|
927
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
928
928
|
|
929
929
|
def test_can_ping_everybody(self):
|
930
930
|
tracker = TrackerFactory(
|
@@ -935,8 +935,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
935
935
|
|
936
936
|
tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
937
937
|
|
938
|
-
self.assertEqual(self.webhook_1.
|
939
|
-
message = json.loads(self.webhook_1.
|
938
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
939
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
940
940
|
self.assertIn("@everybody", message["content"])
|
941
941
|
|
942
942
|
def test_can_ping_here(self):
|
@@ -947,8 +947,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
947
947
|
|
948
948
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
949
949
|
|
950
|
-
self.assertEqual(self.webhook_1.
|
951
|
-
message = json.loads(self.webhook_1.
|
950
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
951
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
952
952
|
self.assertIn("@here", message["content"])
|
953
953
|
|
954
954
|
def test_can_ping_nobody(self):
|
@@ -958,8 +958,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
958
958
|
|
959
959
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
960
960
|
|
961
|
-
self.assertEqual(self.webhook_1.
|
962
|
-
message = json.loads(self.webhook_1.
|
961
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
962
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
963
963
|
self.assertNotIn("@everybody", message["content"])
|
964
964
|
self.assertNotIn("@here", message["content"])
|
965
965
|
|
@@ -970,8 +970,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
970
970
|
|
971
971
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
972
972
|
|
973
|
-
self.assertEqual(self.webhook_1.
|
974
|
-
message = json.loads(self.webhook_1.
|
973
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
974
|
+
message = json.loads(self.webhook_1._main_queue.dequeue())
|
975
975
|
self.assertNotIn("Ping Nobody", message["content"])
|
976
976
|
|
977
977
|
def test_can_send_npc_killmail(self):
|
@@ -979,28 +979,28 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
979
979
|
|
980
980
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
981
981
|
|
982
|
-
self.assertEqual(self.webhook_1.
|
982
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
983
983
|
|
984
984
|
def test_can_handle_victim_without_character(self):
|
985
985
|
killmail = self.tracker.process_killmail(load_killmail(10000501))
|
986
986
|
|
987
987
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
988
988
|
|
989
|
-
self.assertEqual(self.webhook_1.
|
989
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
990
990
|
|
991
991
|
def test_can_handle_victim_without_corporation(self):
|
992
992
|
killmail = self.tracker.process_killmail(load_killmail(10000502))
|
993
993
|
|
994
994
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
995
995
|
|
996
|
-
self.assertEqual(self.webhook_1.
|
996
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
997
997
|
|
998
998
|
def test_can_handle_final_attacker_with_no_character(self):
|
999
999
|
killmail = self.tracker.process_killmail(load_killmail(10000503))
|
1000
1000
|
|
1001
1001
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
1002
1002
|
|
1003
|
-
self.assertEqual(self.webhook_1.
|
1003
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
1004
1004
|
|
1005
1005
|
def test_can_handle_matching_type_ids(self):
|
1006
1006
|
svipul = EveType.objects.get(id=34562)
|
@@ -1009,4 +1009,4 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
1009
1009
|
|
1010
1010
|
self.tracker.generate_killmail_message(Killmail.from_json(killmail.asjson()))
|
1011
1011
|
|
1012
|
-
self.assertEqual(self.webhook_1.
|
1012
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
@@ -8,6 +8,7 @@ from eveuniverse.models import EveConstellation, EveRegion, EveSolarSystem, EveT
|
|
8
8
|
|
9
9
|
from app_utils.testing import NoSocketsTestCase
|
10
10
|
|
11
|
+
from killtracker.core.discord_messages import DiscordMessage
|
11
12
|
from killtracker.core.killmails import Killmail
|
12
13
|
from killtracker.tests.testdata.factories import TrackerFactory
|
13
14
|
from killtracker.tests.testdata.helpers import LoadTestDataMixin, load_killmail
|
@@ -107,10 +108,10 @@ class TestTrackerGenerateKillmailMessage(LoadTestDataMixin, TestCase):
|
|
107
108
|
# when
|
108
109
|
self.tracker.generate_killmail_message(killmail_json)
|
109
110
|
# then
|
110
|
-
|
111
|
-
|
112
|
-
self.assertIn("My Tracker", content)
|
113
|
-
embed =
|
111
|
+
arg, _ = mock_enqueue_message.call_args
|
112
|
+
message: DiscordMessage = arg[0]
|
113
|
+
self.assertIn("My Tracker", message.content)
|
114
|
+
embed = message.embeds[0]
|
114
115
|
self.assertEqual(embed.title, "Haras | Svipul | Killmail")
|
115
116
|
self.assertEqual(embed.thumbnail.url, svipul.icon_url(size=128))
|
116
117
|
html = markdown(embed.description)
|
@@ -1,63 +1,77 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
import dhooks_lite
|
4
1
|
import requests_mock
|
5
2
|
|
6
3
|
from django.core.cache import cache
|
7
4
|
from django.test import TestCase
|
8
5
|
|
9
|
-
from
|
10
|
-
|
6
|
+
from killtracker.core.discord_messages import DiscordMessage
|
11
7
|
from killtracker.exceptions import WebhookTooManyRequests
|
12
8
|
from killtracker.models import Webhook
|
13
9
|
from killtracker.tests.testdata.helpers import LoadTestDataMixin
|
14
10
|
|
15
11
|
|
16
|
-
class TestWebhookQueue(
|
12
|
+
class TestWebhookQueue(TestCase):
|
17
13
|
@classmethod
|
18
14
|
def setUpClass(cls):
|
19
15
|
super().setUpClass()
|
16
|
+
cls.webhook_1 = Webhook.objects.create(
|
17
|
+
name="Webhook 1", url="http://www.example.com/webhook_1", is_enabled=True
|
18
|
+
)
|
20
19
|
|
21
20
|
def setUp(self) -> None:
|
22
|
-
self.webhook_1.
|
23
|
-
self.webhook_1.
|
21
|
+
self.webhook_1._main_queue.clear()
|
22
|
+
self.webhook_1._error_queue.clear()
|
24
23
|
|
25
24
|
def test_reset_failed_messages(self):
|
26
25
|
message = "Test message"
|
27
|
-
self.webhook_1.
|
28
|
-
self.webhook_1.
|
29
|
-
self.assertEqual(self.webhook_1.
|
30
|
-
self.assertEqual(self.webhook_1.
|
26
|
+
self.webhook_1._error_queue.enqueue(message)
|
27
|
+
self.webhook_1._error_queue.enqueue(message)
|
28
|
+
self.assertEqual(self.webhook_1._error_queue.size(), 2)
|
29
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
31
30
|
self.webhook_1.reset_failed_messages()
|
32
|
-
self.assertEqual(self.webhook_1.
|
33
|
-
self.assertEqual(self.webhook_1.
|
34
|
-
|
35
|
-
def
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
self.
|
51
|
-
|
52
|
-
def
|
53
|
-
|
54
|
-
|
31
|
+
self.assertEqual(self.webhook_1._error_queue.size(), 0)
|
32
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 2)
|
33
|
+
|
34
|
+
def test_should_enqueue_and_dequeue_message_from_main_queue(self):
|
35
|
+
m1 = DiscordMessage(content="content")
|
36
|
+
self.webhook_1.enqueue_message(m1)
|
37
|
+
m2 = self.webhook_1.dequeue_message()
|
38
|
+
self.assertEqual(m1, m2)
|
39
|
+
|
40
|
+
def test_should_enqueue_and_dequeue_message_from_error_queue(self):
|
41
|
+
m1 = DiscordMessage(content="content")
|
42
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
43
|
+
m2 = self.webhook_1.dequeue_message(is_error=True)
|
44
|
+
self.assertEqual(m1, m2)
|
45
|
+
|
46
|
+
def test_should_return_size_of_main_queue(self):
|
47
|
+
m1 = DiscordMessage(content="content")
|
48
|
+
self.webhook_1.enqueue_message(m1)
|
49
|
+
self.assertEqual(self.webhook_1.messages_queued(), 1)
|
50
|
+
|
51
|
+
def test_should_return_size_of_error_queue(self):
|
52
|
+
m1 = DiscordMessage(content="content")
|
53
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
54
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 1)
|
55
|
+
|
56
|
+
def test_should_clear_main_queue(self):
|
57
|
+
m1 = DiscordMessage(content="content")
|
58
|
+
self.webhook_1.enqueue_message(m1)
|
59
|
+
self.assertEqual(self.webhook_1.messages_queued(), 1)
|
60
|
+
self.webhook_1.delete_queued_messages()
|
61
|
+
self.assertEqual(self.webhook_1.messages_queued(), 0)
|
62
|
+
|
63
|
+
def test_should_clear_error_queue(self):
|
64
|
+
m1 = DiscordMessage(content="content")
|
65
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
66
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 1)
|
67
|
+
self.webhook_1.delete_queued_messages(is_error=True)
|
68
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 0)
|
55
69
|
|
56
70
|
|
57
71
|
@requests_mock.Mocker()
|
58
72
|
class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
59
73
|
def setUp(self) -> None:
|
60
|
-
self.message =
|
74
|
+
self.message = DiscordMessage(content="Test message")
|
61
75
|
cache.clear()
|
62
76
|
|
63
77
|
def test_when_send_ok_returns_true(self, requests_mocker):
|
@@ -85,7 +99,7 @@ class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
|
85
99
|
},
|
86
100
|
)
|
87
101
|
# when
|
88
|
-
response = self.webhook_1.
|
102
|
+
response = self.webhook_1.send_message(self.message)
|
89
103
|
# then
|
90
104
|
self.assertTrue(response.status_ok)
|
91
105
|
self.assertTrue(requests_mocker.called)
|
@@ -94,7 +108,7 @@ class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
|
94
108
|
# given
|
95
109
|
requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
|
96
110
|
# when
|
97
|
-
response = self.webhook_1.
|
111
|
+
response = self.webhook_1.send_message(self.message)
|
98
112
|
# then
|
99
113
|
self.assertFalse(response.status_ok)
|
100
114
|
self.assertTrue(requests_mocker.called)
|
@@ -118,7 +132,7 @@ class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
|
118
132
|
)
|
119
133
|
# when/then
|
120
134
|
try:
|
121
|
-
self.webhook_1.
|
135
|
+
self.webhook_1.send_message(self.message)
|
122
136
|
except Exception as ex:
|
123
137
|
self.assertIsInstance(ex, WebhookTooManyRequests)
|
124
138
|
self.assertEqual(ex.retry_after, 2002)
|
@@ -142,7 +156,7 @@ class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
|
142
156
|
)
|
143
157
|
# when/then
|
144
158
|
try:
|
145
|
-
self.webhook_1.
|
159
|
+
self.webhook_1.send_message(self.message)
|
146
160
|
except Exception as ex:
|
147
161
|
self.assertIsInstance(ex, WebhookTooManyRequests)
|
148
162
|
self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
|
@@ -3,7 +3,6 @@ from unittest.mock import patch
|
|
3
3
|
import dhooks_lite
|
4
4
|
import requests_mock
|
5
5
|
|
6
|
-
from django.core.cache import cache
|
7
6
|
from django.test import TestCase
|
8
7
|
from django.test.utils import override_settings
|
9
8
|
|
@@ -12,6 +11,7 @@ from killtracker.core.killmails import ZKB_REDISQ_URL
|
|
12
11
|
|
13
12
|
from .testdata.factories import TrackerFactory
|
14
13
|
from .testdata.helpers import LoadTestDataMixin, killmails_data
|
14
|
+
from .utils import reset_celery_once_locks
|
15
15
|
|
16
16
|
PACKAGE_PATH = "killtracker"
|
17
17
|
|
@@ -26,7 +26,7 @@ class TestTasksEnd2End(LoadTestDataMixin, TestCase):
|
|
26
26
|
@classmethod
|
27
27
|
def setUpClass(cls) -> None:
|
28
28
|
super().setUpClass()
|
29
|
-
|
29
|
+
reset_celery_once_locks()
|
30
30
|
cls.tracker_1 = TrackerFactory(
|
31
31
|
name="My Tracker",
|
32
32
|
exclude_null_sec=True,
|