aa-killtracker 0.17.0__py3-none-any.whl → 1.0.0__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-1.0.0.dist-info}/METADATA +7 -8
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0.dist-info}/RECORD +36 -29
- killtracker/__init__.py +1 -1
- killtracker/admin.py +13 -8
- killtracker/app_settings.py +20 -10
- killtracker/apps.py +2 -4
- killtracker/core/discord.py +162 -0
- killtracker/core/helpers.py +13 -0
- killtracker/core/{discord_messages.py → trackers.py} +74 -59
- killtracker/core/workers.py +46 -0
- killtracker/core/{killmails.py → zkb.py} +97 -72
- killtracker/forms.py +1 -1
- killtracker/managers.py +3 -3
- killtracker/models/trackers.py +7 -10
- killtracker/models/webhooks.py +60 -128
- killtracker/providers.py +1 -1
- killtracker/signals.py +31 -0
- killtracker/tasks.py +141 -92
- killtracker/tests/core/test_discord.py +184 -0
- killtracker/tests/core/test_helpers.py +23 -0
- killtracker/tests/core/{test_discord_messages_1.py → test_tracker_1.py} +28 -8
- killtracker/tests/core/{test_discord_messages_2.py → test_tracker_2.py} +11 -11
- killtracker/tests/core/test_workers.py +49 -0
- killtracker/tests/core/{test_killmails.py → test_zkb.py} +109 -52
- killtracker/tests/models/test_killmails.py +0 -2
- killtracker/tests/models/test_trackers_1.py +24 -24
- killtracker/tests/models/test_trackers_2.py +6 -5
- killtracker/tests/models/test_webhooks.py +63 -0
- killtracker/tests/test_integration.py +25 -12
- killtracker/tests/test_tasks.py +161 -92
- killtracker/tests/test_utils.py +39 -0
- killtracker/tests/testdata/factories.py +1 -1
- killtracker/tests/testdata/helpers.py +1 -1
- killtracker/tests/utils.py +44 -0
- killtracker/exceptions.py +0 -32
- killtracker/tests/models/test_webhook.py +0 -150
- killtracker/tests/test_exceptions.py +0 -12
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0.dist-info}/WHEEL +0 -0
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,11 +1,9 @@
|
|
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
|
-
from django.core.cache import cache
|
9
7
|
from django.core.exceptions import ImproperlyConfigured
|
10
8
|
from django.test import TestCase
|
11
9
|
from django.utils.dateparse import parse_datetime
|
@@ -14,31 +12,35 @@ from django.utils.timezone import now
|
|
14
12
|
from app_utils.esi_testing import BravadoOperationStub
|
15
13
|
from app_utils.testing import NoSocketsTestCase
|
16
14
|
|
17
|
-
from killtracker.core.
|
18
|
-
|
19
|
-
|
15
|
+
from killtracker.core.zkb import (
|
16
|
+
_KEY_LAST_REQUEST,
|
17
|
+
_KEY_RETRY_AT,
|
18
|
+
_ZKB_API_URL,
|
19
|
+
_ZKB_REDISQ_URL,
|
20
20
|
Killmail,
|
21
|
+
KillmailDoesNotExist,
|
22
|
+
ZKBTooManyRequestsError,
|
21
23
|
_EntityCount,
|
22
24
|
)
|
23
|
-
from killtracker.exceptions import KillmailDoesNotExist
|
24
25
|
from killtracker.tests import CacheStub
|
25
26
|
from killtracker.tests.testdata.factories import KillmailFactory
|
26
27
|
from killtracker.tests.testdata.helpers import killmails_data, load_killmail
|
28
|
+
from killtracker.tests.utils import CacheFake
|
27
29
|
|
28
|
-
MODULE_PATH = "killtracker.core.
|
30
|
+
MODULE_PATH = "killtracker.core.zkb"
|
29
31
|
unittest.util._MAX_LENGTH = 1000
|
30
32
|
requests_mock.mock.case_sensitive = True
|
31
33
|
|
32
34
|
|
33
35
|
@requests_mock.Mocker()
|
34
|
-
@patch(MODULE_PATH + ".
|
36
|
+
@patch(MODULE_PATH + ".cache", new_callable=CacheFake)
|
35
37
|
class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
36
38
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
37
|
-
def test_should_return_killmail(self, requests_mocker,
|
39
|
+
def test_should_return_killmail(self, requests_mocker, mock_cache):
|
38
40
|
# given
|
39
41
|
requests_mocker.register_uri(
|
40
42
|
"GET",
|
41
|
-
|
43
|
+
_ZKB_REDISQ_URL,
|
42
44
|
status_code=200,
|
43
45
|
json={"package": killmails_data()[10000001]},
|
44
46
|
)
|
@@ -48,7 +50,7 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
48
50
|
self.assertIsNotNone(killmail)
|
49
51
|
self.assertEqual(killmail.id, 10000001)
|
50
52
|
self.assertEqual(killmail.solar_system_id, 30004984)
|
51
|
-
self.assertAlmostEqual(killmail.time, now(), delta=timedelta(seconds=120))
|
53
|
+
self.assertAlmostEqual(killmail.time, now(), delta=dt.timedelta(seconds=120))
|
52
54
|
self.assertEqual(killmail.victim.alliance_id, 3011)
|
53
55
|
self.assertEqual(killmail.victim.character_id, 1011)
|
54
56
|
self.assertEqual(killmail.victim.corporation_id, 2011)
|
@@ -75,11 +77,11 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
75
77
|
|
76
78
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
77
79
|
def test_should_return_none_when_zkb_returns_empty_package(
|
78
|
-
self, requests_mocker,
|
80
|
+
self, requests_mocker, mock_cache
|
79
81
|
):
|
80
82
|
# given
|
81
83
|
requests_mocker.register_uri(
|
82
|
-
"GET",
|
84
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
83
85
|
)
|
84
86
|
# when
|
85
87
|
killmail = Killmail.create_from_zkb_redisq()
|
@@ -87,28 +89,27 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
87
89
|
self.assertIsNone(killmail)
|
88
90
|
|
89
91
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
90
|
-
def
|
91
|
-
self, requests_mocker,
|
92
|
+
def test_should_ignore_invalid_value_for_retry_at_key(
|
93
|
+
self, requests_mocker, mock_cache
|
92
94
|
):
|
93
95
|
# given
|
96
|
+
mock_cache.set(_KEY_RETRY_AT, "abc")
|
94
97
|
requests_mocker.register_uri(
|
95
|
-
"GET",
|
96
|
-
ZKB_REDISQ_URL,
|
97
|
-
status_code=200,
|
98
|
-
json={"package": killmails_data()[10000402]},
|
98
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
99
99
|
)
|
100
100
|
# when
|
101
101
|
killmail = Killmail.create_from_zkb_redisq()
|
102
102
|
# then
|
103
|
-
self.
|
103
|
+
self.assertIsNone(killmail)
|
104
104
|
|
105
105
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
106
|
-
def
|
107
|
-
self, requests_mocker,
|
106
|
+
def test_should_ignore_invalid_value_for_last_request_key(
|
107
|
+
self, requests_mocker, mock_cache
|
108
108
|
):
|
109
109
|
# given
|
110
|
+
mock_cache.set(_KEY_LAST_REQUEST, "abc")
|
110
111
|
requests_mocker.register_uri(
|
111
|
-
"GET",
|
112
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
112
113
|
)
|
113
114
|
# when
|
114
115
|
killmail = Killmail.create_from_zkb_redisq()
|
@@ -116,30 +117,68 @@ class TestCreateFromZkbRedisq(NoSocketsTestCase):
|
|
116
117
|
self.assertIsNone(killmail)
|
117
118
|
|
118
119
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
119
|
-
def
|
120
|
-
self, requests_mocker,
|
120
|
+
def test_should_handle_zkb_data_has_no_solar_system(
|
121
|
+
self, requests_mocker, mock_cache
|
121
122
|
):
|
122
123
|
# given
|
123
124
|
requests_mocker.register_uri(
|
124
125
|
"GET",
|
125
|
-
|
126
|
+
_ZKB_REDISQ_URL,
|
126
127
|
status_code=200,
|
127
|
-
|
128
|
-
|
129
|
-
You can only have one request to listen.php in flight at any time, otherwise you will generate a too many requests error (429). If you have too many of these errors you will be banned automatically.""",
|
128
|
+
json={"package": killmails_data()[10000402]},
|
130
129
|
)
|
131
130
|
# when
|
132
131
|
killmail = Killmail.create_from_zkb_redisq()
|
133
132
|
# then
|
133
|
+
self.assertIsNotNone(killmail)
|
134
|
+
|
135
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
136
|
+
def test_should_return_none_when_http_error(self, requests_mocker, mock_cache):
|
137
|
+
# given
|
138
|
+
requests_mocker.register_uri("GET", _ZKB_REDISQ_URL, status_code=500)
|
139
|
+
# when
|
140
|
+
killmail = Killmail.create_from_zkb_redisq()
|
141
|
+
# then
|
134
142
|
self.assertIsNone(killmail)
|
135
143
|
|
136
144
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
137
|
-
def
|
138
|
-
self, requests_mocker,
|
145
|
+
def test_should_return_raise_too_many_requests_error(
|
146
|
+
self, requests_mocker, mock_cache
|
139
147
|
):
|
140
148
|
# given
|
141
149
|
requests_mocker.register_uri(
|
142
|
-
"GET",
|
150
|
+
"GET", _ZKB_REDISQ_URL, status_code=429, text="429 too many requests"
|
151
|
+
)
|
152
|
+
# when/then
|
153
|
+
with self.assertRaises(ZKBTooManyRequestsError):
|
154
|
+
Killmail.create_from_zkb_redisq()
|
155
|
+
|
156
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
157
|
+
def test_should_reraise_too_many_requests_error_when_ongoing(
|
158
|
+
self, requests_mocker, mock_cache
|
159
|
+
):
|
160
|
+
# given
|
161
|
+
retry_at = now() + dt.timedelta(hours=3)
|
162
|
+
mock_cache.set(_KEY_RETRY_AT, retry_at)
|
163
|
+
requests_mocker.register_uri("GET", _ZKB_REDISQ_URL, status_code=500)
|
164
|
+
# when/then
|
165
|
+
self.assertEqual(requests_mocker.call_count, 0)
|
166
|
+
with self.assertRaises(ZKBTooManyRequestsError) as ex:
|
167
|
+
Killmail.create_from_zkb_redisq()
|
168
|
+
self.assertEqual(retry_at, ex.exception.retry_at)
|
169
|
+
|
170
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
171
|
+
def test_should_return_none_when_zkb_returns_general_error(
|
172
|
+
self, requests_mocker, mock_cache
|
173
|
+
):
|
174
|
+
# given
|
175
|
+
requests_mocker.register_uri(
|
176
|
+
"GET",
|
177
|
+
_ZKB_REDISQ_URL,
|
178
|
+
status_code=200,
|
179
|
+
text="""Your IP has been banned because of excessive errors.
|
180
|
+
|
181
|
+
You can only have one request to listen.php in flight at any time, otherwise you will generate a too many requests error (429). If you have too many of these errors you will be banned automatically.""",
|
143
182
|
)
|
144
183
|
# when
|
145
184
|
killmail = Killmail.create_from_zkb_redisq()
|
@@ -147,19 +186,23 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
147
186
|
self.assertIsNone(killmail)
|
148
187
|
|
149
188
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
150
|
-
def
|
189
|
+
def test_should_return_none_when_zkb_does_not_return_json(
|
190
|
+
self, requests_mocker, mock_cache
|
191
|
+
):
|
151
192
|
# given
|
152
|
-
|
193
|
+
requests_mocker.register_uri(
|
194
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, text="this is not JSON"
|
195
|
+
)
|
153
196
|
# when
|
154
197
|
killmail = Killmail.create_from_zkb_redisq()
|
155
198
|
# then
|
156
199
|
self.assertIsNone(killmail)
|
157
200
|
|
158
201
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Voltron9000")
|
159
|
-
def test_should_have_queue_id_in_request(self, requests_mocker,
|
202
|
+
def test_should_have_queue_id_in_request(self, requests_mocker, mock_cache):
|
160
203
|
# given
|
161
204
|
requests_mocker.register_uri(
|
162
|
-
"GET",
|
205
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
163
206
|
)
|
164
207
|
# when
|
165
208
|
Killmail.create_from_zkb_redisq()
|
@@ -171,20 +214,20 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
171
214
|
self.assertEqual(queue_id[0], "Voltron9000")
|
172
215
|
|
173
216
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "")
|
174
|
-
def test_should_abort_when_no_queue_id_defined(self, requests_mocker,
|
217
|
+
def test_should_abort_when_no_queue_id_defined(self, requests_mocker, mock_cache):
|
175
218
|
# given
|
176
219
|
requests_mocker.register_uri(
|
177
|
-
"GET",
|
220
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
178
221
|
)
|
179
222
|
# when/then
|
180
223
|
with self.assertRaises(ImproperlyConfigured):
|
181
224
|
Killmail.create_from_zkb_redisq()
|
182
225
|
|
183
226
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "Möchtegern")
|
184
|
-
def test_should_urlize_queue_ids(self, requests_mocker,
|
227
|
+
def test_should_urlize_queue_ids(self, requests_mocker, mock_cache):
|
185
228
|
# given
|
186
229
|
requests_mocker.register_uri(
|
187
|
-
"GET",
|
230
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
188
231
|
)
|
189
232
|
# when
|
190
233
|
Killmail.create_from_zkb_redisq()
|
@@ -196,15 +239,31 @@ You can only have one request to listen.php in flight at any time, otherwise you
|
|
196
239
|
self.assertEqual(queue_id[0], "M%C3%B6chtegern")
|
197
240
|
|
198
241
|
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "alpha,bravo")
|
199
|
-
def test_should_not_accept_list_for_queue_id(self, requests_mocker,
|
242
|
+
def test_should_not_accept_list_for_queue_id(self, requests_mocker, mock_cache):
|
200
243
|
# given
|
201
244
|
requests_mocker.register_uri(
|
202
|
-
"GET",
|
245
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
203
246
|
)
|
204
247
|
# when/then
|
205
248
|
with self.assertRaises(ImproperlyConfigured):
|
206
249
|
Killmail.create_from_zkb_redisq()
|
207
250
|
|
251
|
+
@patch(MODULE_PATH + ".sleep")
|
252
|
+
@patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
|
253
|
+
def test_should_wait_until_next_slot_if_needed(
|
254
|
+
self, requests_mocker, mock_sleep, mock_cache
|
255
|
+
):
|
256
|
+
# given
|
257
|
+
mock_cache.set(_KEY_LAST_REQUEST, now())
|
258
|
+
requests_mocker.register_uri(
|
259
|
+
"GET", _ZKB_REDISQ_URL, status_code=200, json={"package": None}
|
260
|
+
)
|
261
|
+
# when
|
262
|
+
killmail = Killmail.create_from_zkb_redisq()
|
263
|
+
# then
|
264
|
+
self.assertIsNone(killmail)
|
265
|
+
self.assertTrue(mock_sleep.called)
|
266
|
+
|
208
267
|
|
209
268
|
class TestKillmailSerialization(NoSocketsTestCase):
|
210
269
|
def test_dict_serialization(self):
|
@@ -323,7 +382,7 @@ class TestCreateFromZkbApi(NoSocketsTestCase):
|
|
323
382
|
]
|
324
383
|
requests_mocker.register_uri(
|
325
384
|
"GET",
|
326
|
-
f"{
|
385
|
+
f"{_ZKB_API_URL}killID/{killmail_id}/",
|
327
386
|
status_code=200,
|
328
387
|
json=zkb_api_data,
|
329
388
|
)
|
@@ -337,7 +396,7 @@ class TestCreateFromZkbApi(NoSocketsTestCase):
|
|
337
396
|
killmail = Killmail.create_from_zkb_api(killmail_id)
|
338
397
|
self.assertIsNotNone(killmail)
|
339
398
|
self.assertEqual(killmail.id, killmail_id)
|
340
|
-
self.assertAlmostEqual(killmail.time, now(), delta=timedelta(seconds=120))
|
399
|
+
self.assertAlmostEqual(killmail.time, now(), delta=dt.timedelta(seconds=120))
|
341
400
|
|
342
401
|
self.assertEqual(killmail.victim.alliance_id, 3011)
|
343
402
|
self.assertEqual(killmail.victim.character_id, 1011)
|
@@ -365,11 +424,9 @@ class TestCreateFromZkbApi(NoSocketsTestCase):
|
|
365
424
|
self.assertFalse(killmail.zkb.is_awox)
|
366
425
|
|
367
426
|
|
427
|
+
@patch(MODULE_PATH + ".cache", new_callable=CacheFake)
|
368
428
|
class TestKillmailStorage(TestCase):
|
369
|
-
def
|
370
|
-
cache.clear()
|
371
|
-
|
372
|
-
def test_should_store_and_retrieve_killmail(self):
|
429
|
+
def test_should_store_and_retrieve_killmail(self, mock_cache):
|
373
430
|
# given
|
374
431
|
killmail_1 = KillmailFactory()
|
375
432
|
# when
|
@@ -378,12 +435,12 @@ class TestKillmailStorage(TestCase):
|
|
378
435
|
# then
|
379
436
|
self.assertEqual(killmail_1, killmail_2)
|
380
437
|
|
381
|
-
def test_should_raise_error_when_killmail_does_not_exist(self):
|
438
|
+
def test_should_raise_error_when_killmail_does_not_exist(self, mock_cache):
|
382
439
|
# when/then
|
383
440
|
with self.assertRaises(KillmailDoesNotExist):
|
384
441
|
Killmail.get(id=99)
|
385
442
|
|
386
|
-
def test_should_delete_killmail(self):
|
443
|
+
def test_should_delete_killmail(self, mock_cache):
|
387
444
|
# given
|
388
445
|
killmail = KillmailFactory()
|
389
446
|
killmail.save()
|
@@ -393,7 +450,7 @@ class TestKillmailStorage(TestCase):
|
|
393
450
|
with self.assertRaises(KillmailDoesNotExist):
|
394
451
|
Killmail.get(id=killmail.id)
|
395
452
|
|
396
|
-
def test_should_override_existing_killmail(self):
|
453
|
+
def test_should_override_existing_killmail(self, mock_cache):
|
397
454
|
# given
|
398
455
|
killmail_1 = KillmailFactory(zkb__points=1)
|
399
456
|
killmail_1.save()
|
@@ -19,8 +19,6 @@ from killtracker.tests.testdata.helpers import (
|
|
19
19
|
)
|
20
20
|
from killtracker.tests.testdata.load_eveuniverse import load_eveuniverse
|
21
21
|
|
22
|
-
MODELS_PATH = "killtracker.models.killmails"
|
23
|
-
|
24
22
|
|
25
23
|
class TestEveKillmailManager(LoadTestDataMixin, NoSocketsTestCase):
|
26
24
|
def test_create_from_killmail(self):
|
@@ -24,7 +24,7 @@ from app_utils.testdata_factories import (
|
|
24
24
|
from app_utils.testing import NoSocketsTestCase, add_character_to_user_2
|
25
25
|
|
26
26
|
from killtracker.constants import EveGroupId
|
27
|
-
from killtracker.core.
|
27
|
+
from killtracker.core.zkb import Killmail, _EntityCount
|
28
28
|
from killtracker.models import Tracker
|
29
29
|
from killtracker.tests.testdata.factories import (
|
30
30
|
EveFactionInfoFactory,
|
@@ -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,7 +8,8 @@ from eveuniverse.models import EveConstellation, EveRegion, EveSolarSystem, EveT
|
|
8
8
|
|
9
9
|
from app_utils.testing import NoSocketsTestCase
|
10
10
|
|
11
|
-
from killtracker.core.
|
11
|
+
from killtracker.core.discord import DiscordMessage
|
12
|
+
from killtracker.core.zkb import Killmail
|
12
13
|
from killtracker.tests.testdata.factories import TrackerFactory
|
13
14
|
from killtracker.tests.testdata.helpers import LoadTestDataMixin, load_killmail
|
14
15
|
|
@@ -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)
|
@@ -0,0 +1,63 @@
|
|
1
|
+
from django.test import TestCase
|
2
|
+
|
3
|
+
from killtracker.core.discord import DiscordMessage
|
4
|
+
from killtracker.models import Webhook
|
5
|
+
|
6
|
+
|
7
|
+
class TestWebhookQueue(TestCase):
|
8
|
+
@classmethod
|
9
|
+
def setUpClass(cls):
|
10
|
+
super().setUpClass()
|
11
|
+
cls.webhook_1 = Webhook.objects.create(
|
12
|
+
name="Webhook 1", url="http://www.example.com/webhook_1", is_enabled=True
|
13
|
+
)
|
14
|
+
|
15
|
+
def setUp(self) -> None:
|
16
|
+
self.webhook_1._main_queue.clear()
|
17
|
+
self.webhook_1._error_queue.clear()
|
18
|
+
|
19
|
+
def test_reset_failed_messages(self):
|
20
|
+
message = "Test message"
|
21
|
+
self.webhook_1._error_queue.enqueue(message)
|
22
|
+
self.webhook_1._error_queue.enqueue(message)
|
23
|
+
self.assertEqual(self.webhook_1._error_queue.size(), 2)
|
24
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
25
|
+
self.webhook_1.reset_failed_messages()
|
26
|
+
self.assertEqual(self.webhook_1._error_queue.size(), 0)
|
27
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 2)
|
28
|
+
|
29
|
+
def test_should_enqueue_and_dequeue_message_from_main_queue(self):
|
30
|
+
m1 = DiscordMessage(content="content")
|
31
|
+
self.webhook_1.enqueue_message(m1)
|
32
|
+
m2 = self.webhook_1.dequeue_message()
|
33
|
+
self.assertEqual(m1, m2)
|
34
|
+
|
35
|
+
def test_should_enqueue_and_dequeue_message_from_error_queue(self):
|
36
|
+
m1 = DiscordMessage(content="content")
|
37
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
38
|
+
m2 = self.webhook_1.dequeue_message(is_error=True)
|
39
|
+
self.assertEqual(m1, m2)
|
40
|
+
|
41
|
+
def test_should_return_size_of_main_queue(self):
|
42
|
+
m1 = DiscordMessage(content="content")
|
43
|
+
self.webhook_1.enqueue_message(m1)
|
44
|
+
self.assertEqual(self.webhook_1.messages_queued(), 1)
|
45
|
+
|
46
|
+
def test_should_return_size_of_error_queue(self):
|
47
|
+
m1 = DiscordMessage(content="content")
|
48
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
49
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 1)
|
50
|
+
|
51
|
+
def test_should_clear_main_queue(self):
|
52
|
+
m1 = DiscordMessage(content="content")
|
53
|
+
self.webhook_1.enqueue_message(m1)
|
54
|
+
self.assertEqual(self.webhook_1.messages_queued(), 1)
|
55
|
+
self.webhook_1.delete_queued_messages()
|
56
|
+
self.assertEqual(self.webhook_1.messages_queued(), 0)
|
57
|
+
|
58
|
+
def test_should_clear_error_queue(self):
|
59
|
+
m1 = DiscordMessage(content="content")
|
60
|
+
self.webhook_1.enqueue_message(m1, is_error=True)
|
61
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 1)
|
62
|
+
self.webhook_1.delete_queued_messages(is_error=True)
|
63
|
+
self.assertEqual(self.webhook_1.messages_queued(is_error=True), 0)
|
@@ -4,43 +4,56 @@ import dhooks_lite
|
|
4
4
|
import requests_mock
|
5
5
|
|
6
6
|
from django.core.cache import cache
|
7
|
-
from django.test import TestCase
|
8
7
|
from django.test.utils import override_settings
|
9
8
|
|
9
|
+
from app_utils.testing import NoSocketsTestCase
|
10
|
+
|
10
11
|
from killtracker import tasks
|
11
|
-
from killtracker.core.
|
12
|
+
from killtracker.core.zkb import _ZKB_REDISQ_URL
|
12
13
|
|
13
|
-
from .testdata.factories import TrackerFactory
|
14
|
-
from .testdata.helpers import
|
14
|
+
from .testdata.factories import TrackerFactory, WebhookFactory
|
15
|
+
from .testdata.helpers import (
|
16
|
+
killmails_data,
|
17
|
+
load_eve_corporations,
|
18
|
+
load_eve_entities,
|
19
|
+
load_eveuniverse,
|
20
|
+
)
|
15
21
|
|
16
22
|
PACKAGE_PATH = "killtracker"
|
17
23
|
|
18
24
|
|
19
25
|
@patch("celery.app.task.Context.called_directly", False) # make retry work with eager
|
20
26
|
@override_settings(CELERY_ALWAYS_EAGER=True)
|
21
|
-
@patch(PACKAGE_PATH + ".core.
|
27
|
+
@patch(PACKAGE_PATH + ".core.zkb.KILLTRACKER_QUEUE_ID", "dummy")
|
28
|
+
@patch(PACKAGE_PATH + ".tasks.workers.is_shutting_down", lambda x: False)
|
22
29
|
@patch(PACKAGE_PATH + ".tasks.is_esi_online", lambda: True)
|
23
|
-
@patch(PACKAGE_PATH + ".
|
30
|
+
@patch(PACKAGE_PATH + ".core.discord.dhooks_lite.Webhook.execute", spec=True)
|
24
31
|
@requests_mock.Mocker()
|
25
|
-
class TestTasksEnd2End(
|
32
|
+
class TestTasksEnd2End(NoSocketsTestCase):
|
26
33
|
@classmethod
|
27
34
|
def setUpClass(cls) -> None:
|
28
35
|
super().setUpClass()
|
29
|
-
|
30
|
-
|
36
|
+
load_eveuniverse()
|
37
|
+
load_eve_corporations()
|
38
|
+
load_eve_entities()
|
39
|
+
cls.webhook = WebhookFactory()
|
40
|
+
cls.tracker = TrackerFactory(
|
31
41
|
name="My Tracker",
|
32
42
|
exclude_null_sec=True,
|
33
43
|
exclude_w_space=True,
|
34
|
-
webhook=cls.
|
44
|
+
webhook=cls.webhook,
|
35
45
|
)
|
36
46
|
|
47
|
+
def setUp(self):
|
48
|
+
cache.clear()
|
49
|
+
|
37
50
|
@patch(PACKAGE_PATH + ".tasks.retry_task_if_esi_is_down", lambda x: None)
|
38
51
|
def test_normal_case(self, requests_mocker, mock_execute):
|
39
52
|
# given
|
40
53
|
mock_execute.return_value = dhooks_lite.WebhookResponse({}, status_code=200)
|
41
54
|
requests_mocker.register_uri(
|
42
55
|
"GET",
|
43
|
-
|
56
|
+
_ZKB_REDISQ_URL,
|
44
57
|
[
|
45
58
|
{"status_code": 200, "json": {"package": killmails_data()[10000001]}},
|
46
59
|
{"status_code": 200, "json": {"package": killmails_data()[10000002]}},
|
@@ -73,7 +86,7 @@ class TestTasksEnd2End(LoadTestDataMixin, TestCase):
|
|
73
86
|
mock_retry_task_if_esi_is_down.side_effect = my_retry_task_if_esi_is_down
|
74
87
|
requests_mocker.register_uri(
|
75
88
|
"GET",
|
76
|
-
|
89
|
+
_ZKB_REDISQ_URL,
|
77
90
|
[
|
78
91
|
{"status_code": 200, "json": {"package": killmails_data()[10000001]}},
|
79
92
|
{"status_code": 200, "json": {"package": None}},
|