aa-killtracker 0.17.0__py3-none-any.whl → 1.0.0a1__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.
Files changed (39) hide show
  1. {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.dist-info}/METADATA +7 -7
  2. {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.dist-info}/RECORD +36 -29
  3. killtracker/__init__.py +1 -1
  4. killtracker/admin.py +13 -8
  5. killtracker/app_settings.py +20 -10
  6. killtracker/apps.py +2 -4
  7. killtracker/core/discord.py +162 -0
  8. killtracker/core/helpers.py +13 -0
  9. killtracker/core/{discord_messages.py → trackers.py} +74 -59
  10. killtracker/core/workers.py +46 -0
  11. killtracker/core/{killmails.py → zkb.py} +97 -72
  12. killtracker/forms.py +1 -1
  13. killtracker/managers.py +3 -3
  14. killtracker/models/trackers.py +7 -10
  15. killtracker/models/webhooks.py +60 -128
  16. killtracker/providers.py +1 -1
  17. killtracker/signals.py +31 -0
  18. killtracker/tasks.py +141 -92
  19. killtracker/tests/core/test_discord.py +184 -0
  20. killtracker/tests/core/test_helpers.py +23 -0
  21. killtracker/tests/core/{test_discord_messages_1.py → test_tracker_1.py} +28 -8
  22. killtracker/tests/core/{test_discord_messages_2.py → test_tracker_2.py} +11 -11
  23. killtracker/tests/core/test_workers.py +49 -0
  24. killtracker/tests/core/{test_killmails.py → test_zkb.py} +109 -52
  25. killtracker/tests/models/test_killmails.py +0 -2
  26. killtracker/tests/models/test_trackers_1.py +24 -24
  27. killtracker/tests/models/test_trackers_2.py +6 -5
  28. killtracker/tests/models/test_webhooks.py +63 -0
  29. killtracker/tests/test_integration.py +25 -12
  30. killtracker/tests/test_tasks.py +161 -92
  31. killtracker/tests/test_utils.py +39 -0
  32. killtracker/tests/testdata/factories.py +1 -1
  33. killtracker/tests/testdata/helpers.py +1 -1
  34. killtracker/tests/utils.py +44 -0
  35. killtracker/exceptions.py +0 -32
  36. killtracker/tests/models/test_webhook.py +0 -150
  37. killtracker/tests/test_exceptions.py +0 -12
  38. {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.dist-info}/WHEEL +0 -0
  39. {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.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.killmails import (
18
- ZKB_API_URL,
19
- ZKB_REDISQ_URL,
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.killmails"
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 + ".get_redis_client")
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, mock_redis):
39
+ def test_should_return_killmail(self, requests_mocker, mock_cache):
38
40
  # given
39
41
  requests_mocker.register_uri(
40
42
  "GET",
41
- ZKB_REDISQ_URL,
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, mock_redis
80
+ self, requests_mocker, mock_cache
79
81
  ):
80
82
  # given
81
83
  requests_mocker.register_uri(
82
- "GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
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 test_should_handle_zkb_data_has_no_solar_system(
91
- self, requests_mocker, mock_redis
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.assertIsNotNone(killmail)
103
+ self.assertIsNone(killmail)
104
104
 
105
105
  @patch(MODULE_PATH + ".KILLTRACKER_QUEUE_ID", "dummy")
106
- def test_should_return_none_when_zkb_returns_429_error(
107
- self, requests_mocker, mock_redis
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", ZKB_REDISQ_URL, status_code=429, text="429 too many requests"
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 test_should_return_none_when_zkb_returns_general_error(
120
- self, requests_mocker, mock_redis
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
- ZKB_REDISQ_URL,
126
+ _ZKB_REDISQ_URL,
126
127
  status_code=200,
127
- text="""Your IP has been banned because of excessive errors.
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 test_should_return_none_when_zkb_does_not_return_json(
138
- self, requests_mocker, mock_redis
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", ZKB_REDISQ_URL, status_code=200, text="this is not JSON"
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 test_should_return_none_if_lock_not_acquired(self, requests_mocker, mock_redis):
189
+ def test_should_return_none_when_zkb_does_not_return_json(
190
+ self, requests_mocker, mock_cache
191
+ ):
151
192
  # given
152
- mock_redis.return_value.lock.side_effect = LockError
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, mock_redis):
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", ZKB_REDISQ_URL, status_code=200, json={"package": None}
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, mock_redis):
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", ZKB_REDISQ_URL, status_code=200, json={"package": None}
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, mock_redis):
227
+ def test_should_urlize_queue_ids(self, requests_mocker, mock_cache):
185
228
  # given
186
229
  requests_mocker.register_uri(
187
- "GET", ZKB_REDISQ_URL, status_code=200, json={"package": None}
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, mock_redis):
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", ZKB_REDISQ_URL, status_code=200, json={"package": None}
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"{ZKB_API_URL}killID/{killmail_id}/",
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 setUp(self) -> None:
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.killmails import Killmail, _EntityCount
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.main_queue.clear()
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.main_queue.size(), 1)
870
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
897
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
910
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
919
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 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.main_queue.size(), 1)
939
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
951
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
962
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 1)
974
- message = json.loads(self.webhook_1.main_queue.dequeue())
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.main_queue.size(), 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.main_queue.size(), 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.main_queue.size(), 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.main_queue.size(), 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.main_queue.size(), 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.killmails import Killmail
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
- _, kwargs = mock_enqueue_message.call_args
111
- content = kwargs["content"]
112
- self.assertIn("My Tracker", content)
113
- embed = kwargs["embeds"][0]
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.killmails import ZKB_REDISQ_URL
12
+ from killtracker.core.zkb import _ZKB_REDISQ_URL
12
13
 
13
- from .testdata.factories import TrackerFactory
14
- from .testdata.helpers import LoadTestDataMixin, killmails_data
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.killmails.KILLTRACKER_QUEUE_ID", "dummy")
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 + ".models.webhooks.dhooks_lite.Webhook.execute", spec=True)
30
+ @patch(PACKAGE_PATH + ".core.discord.dhooks_lite.Webhook.execute", spec=True)
24
31
  @requests_mock.Mocker()
25
- class TestTasksEnd2End(LoadTestDataMixin, TestCase):
32
+ class TestTasksEnd2End(NoSocketsTestCase):
26
33
  @classmethod
27
34
  def setUpClass(cls) -> None:
28
35
  super().setUpClass()
29
- cache.clear()
30
- cls.tracker_1 = TrackerFactory(
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.webhook_1,
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
- ZKB_REDISQ_URL,
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
- ZKB_REDISQ_URL,
89
+ _ZKB_REDISQ_URL,
77
90
  [
78
91
  {"status_code": 200, "json": {"package": killmails_data()[10000001]}},
79
92
  {"status_code": 200, "json": {"package": None}},