aa-killtracker 0.18.0a2__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.18.0a2.dist-info → aa_killtracker-1.0.0.dist-info}/METADATA +7 -8
- {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0.dist-info}/RECORD +33 -30
- killtracker/__init__.py +1 -1
- killtracker/admin.py +1 -1
- killtracker/app_settings.py +14 -7
- killtracker/core/discord.py +162 -0
- killtracker/core/helpers.py +13 -0
- killtracker/core/{discord_messages.py → trackers.py} +16 -75
- killtracker/core/{worker_shutdown.py → workers.py} +3 -4
- killtracker/core/{killmails.py → zkb.py} +32 -40
- killtracker/managers.py +1 -1
- killtracker/models/trackers.py +4 -5
- killtracker/models/webhooks.py +4 -53
- killtracker/signals.py +4 -4
- killtracker/tasks.py +47 -49
- 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} +12 -39
- killtracker/tests/core/{test_discord_messages_2.py → test_tracker_2.py} +3 -3
- killtracker/tests/core/test_workers.py +49 -0
- killtracker/tests/core/{test_killmails.py → test_zkb.py} +58 -46
- killtracker/tests/models/test_killmails.py +0 -2
- killtracker/tests/models/test_trackers_1.py +1 -1
- killtracker/tests/models/test_trackers_2.py +2 -2
- killtracker/tests/models/test_webhooks.py +63 -0
- killtracker/tests/test_integration.py +26 -13
- killtracker/tests/test_tasks.py +68 -58
- 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 +28 -0
- killtracker/exceptions.py +0 -32
- killtracker/tests/core/test_worker_shutdown.py +0 -34
- killtracker/tests/models/test_webhook.py +0 -164
- killtracker/tests/test_exceptions.py +0 -12
- {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0.dist-info}/WHEEL +0 -0
- {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0.dist-info}/licenses/LICENSE +0 -0
killtracker/tests/test_tasks.py
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
import datetime as dt
|
2
2
|
from unittest.mock import patch
|
3
3
|
|
4
|
-
import
|
5
|
-
import dhooks_lite
|
4
|
+
from celery.exceptions import Retry
|
6
5
|
|
7
6
|
from django.core.cache import cache
|
8
7
|
from django.test import TestCase
|
9
|
-
from django.test.utils import override_settings
|
10
8
|
from django.utils.timezone import now
|
11
9
|
|
12
|
-
from killtracker.core.
|
13
|
-
|
10
|
+
from killtracker.core.discord import (
|
11
|
+
DiscordMessage,
|
12
|
+
HTTPError,
|
13
|
+
WebhookRateLimitExhausted,
|
14
|
+
)
|
14
15
|
from killtracker.models import EveKillmail
|
15
16
|
from killtracker.tasks import (
|
16
17
|
ZKBTooManyRequestsError,
|
@@ -19,7 +20,6 @@ from killtracker.tasks import (
|
|
19
20
|
run_killtracker,
|
20
21
|
run_tracker,
|
21
22
|
send_messages_to_webhook,
|
22
|
-
send_test_message_to_webhook,
|
23
23
|
store_killmail,
|
24
24
|
)
|
25
25
|
|
@@ -53,7 +53,7 @@ class TestTrackerBase(LoadTestDataMixin, TestCase):
|
|
53
53
|
)
|
54
54
|
|
55
55
|
|
56
|
-
@patch(MODULE_PATH + ".
|
56
|
+
@patch(MODULE_PATH + ".workers.is_shutting_down", spec=True)
|
57
57
|
@patch(MODULE_PATH + ".is_esi_online", spec=True)
|
58
58
|
@patch(MODULE_PATH + ".delete_stale_killmails", spec=True)
|
59
59
|
@patch(MODULE_PATH + ".store_killmail", spec=True)
|
@@ -177,7 +177,7 @@ class TestRunKilltracker(TestTrackerBase):
|
|
177
177
|
)
|
178
178
|
mock_is_esi_online.return_value = True
|
179
179
|
# when/then
|
180
|
-
with self.assertRaises(
|
180
|
+
with self.assertRaises(Retry):
|
181
181
|
run_killtracker()
|
182
182
|
# then
|
183
183
|
self.assertEqual(mock_run_tracker.delay.call_count, 0)
|
@@ -302,79 +302,107 @@ class TestGenerateKillmailMessage(TestTrackerBase):
|
|
302
302
|
self.assertEqual(mock_retry.call_count, 4)
|
303
303
|
|
304
304
|
|
305
|
-
@patch("celery.app.task.Context.called_directly", False) # make retry work with eager
|
306
|
-
@override_settings(CELERY_ALWAYS_EAGER=True)
|
305
|
+
# @patch("celery.app.task.Context.called_directly", False) # make retry work with eager
|
306
|
+
# @override_settings(CELERY_ALWAYS_EAGER=True)
|
307
|
+
|
308
|
+
|
309
|
+
@patch(MODULE_PATH + ".workers.is_shutting_down", spec=True)
|
307
310
|
@patch(MODULE_PATH + ".Webhook.send_message", spec=True)
|
308
311
|
class TestSendMessagesToWebhook(TestTrackerBase):
|
309
312
|
def setUp(self) -> None:
|
310
313
|
cache.clear()
|
311
314
|
|
312
|
-
def test_should_send_one_message(self, mock_send_message):
|
315
|
+
def test_should_send_one_message(self, mock_send_message, mock_is_shutting_down):
|
313
316
|
# given
|
314
|
-
|
315
|
-
|
316
|
-
)
|
317
|
+
mock_is_shutting_down.return_value = False
|
318
|
+
mock_send_message.return_value = 42
|
317
319
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
318
320
|
# when
|
319
|
-
send_messages_to_webhook
|
321
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
320
322
|
# then
|
321
323
|
self.assertEqual(mock_send_message.call_count, 1)
|
322
324
|
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
323
325
|
self.assertEqual(self.webhook_1._error_queue.size(), 0)
|
324
326
|
|
325
|
-
def
|
326
|
-
"""when three messages in queue, then sends them and returns 3"""
|
327
|
+
def test_should_send_three_messages(self, mock_send_message, mock_is_shutting_down):
|
327
328
|
# given
|
328
|
-
|
329
|
-
|
330
|
-
)
|
329
|
+
mock_is_shutting_down.return_value = False
|
330
|
+
mock_send_message.return_value = [1, 2, 3]
|
331
331
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
332
332
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
333
333
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
334
334
|
# when
|
335
|
-
send_messages_to_webhook
|
335
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
336
336
|
# then
|
337
337
|
self.assertEqual(mock_send_message.call_count, 3)
|
338
338
|
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
339
339
|
self.assertEqual(self.webhook_1._error_queue.size(), 0)
|
340
340
|
|
341
|
-
def
|
342
|
-
|
341
|
+
def test_should_do_nothing_when_queue_is_empty(
|
342
|
+
self, mock_send_message, mock_is_shutting_down
|
343
|
+
):
|
343
344
|
# given
|
344
|
-
|
345
|
-
{}, status_code=200
|
346
|
-
)
|
345
|
+
mock_is_shutting_down.return_value = False
|
347
346
|
# when
|
348
|
-
send_messages_to_webhook
|
347
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
349
348
|
# then
|
350
349
|
self.assertEqual(mock_send_message.call_count, 0)
|
351
350
|
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
352
351
|
self.assertEqual(self.webhook_1._error_queue.size(), 0)
|
353
352
|
|
354
|
-
def
|
355
|
-
|
353
|
+
def test_should_put_failed_message_in_error_queue(
|
354
|
+
self, mock_send_message, mock_is_shutting_down
|
355
|
+
):
|
356
356
|
# given
|
357
|
-
|
358
|
-
|
359
|
-
)
|
357
|
+
mock_is_shutting_down.return_value = False
|
358
|
+
mock_send_message.side_effect = HTTPError(404)
|
360
359
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
361
360
|
# when
|
362
|
-
send_messages_to_webhook
|
361
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
363
362
|
# then
|
364
363
|
self.assertEqual(mock_send_message.call_count, 1)
|
365
364
|
self.assertEqual(self.webhook_1._main_queue.size(), 0)
|
366
365
|
self.assertEqual(self.webhook_1._error_queue.size(), 1)
|
367
366
|
|
368
|
-
def
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
367
|
+
def test_should_retry_on_too_many_requests_error(
|
368
|
+
self, mock_send_message, mock_is_shutting_down
|
369
|
+
):
|
370
|
+
# given
|
371
|
+
mock_is_shutting_down.return_value = False
|
372
|
+
mock_send_message.side_effect = WebhookRateLimitExhausted(10)
|
373
|
+
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
374
|
+
# when
|
375
|
+
with self.assertRaises(Retry):
|
376
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
377
|
+
# then
|
378
|
+
self.assertEqual(mock_send_message.call_count, 1)
|
379
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
380
|
+
|
381
|
+
def test_should_abort_when_worker_is_shutting_down(
|
382
|
+
self, mock_send_message, mock_is_shutting_down
|
383
|
+
):
|
384
|
+
# given
|
385
|
+
mock_is_shutting_down.return_value = True
|
386
|
+
mock_send_message.return_value = 42
|
387
|
+
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
388
|
+
# when
|
389
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
390
|
+
# then
|
391
|
+
self.assertEqual(mock_send_message.call_count, 0)
|
392
|
+
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
393
|
+
|
394
|
+
@patch(MODULE_PATH + ".KILLTRACKER_MAX_MESSAGES_SENT_PER_RUN", 1)
|
395
|
+
def test_retry_when_limit_is_reached(
|
396
|
+
self, mock_send_message, mock_is_shutting_down
|
397
|
+
):
|
373
398
|
# given
|
374
|
-
|
399
|
+
mock_is_shutting_down.return_value = False
|
400
|
+
mock_send_message.return_value = [1, 2]
|
401
|
+
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
375
402
|
self.webhook_1.enqueue_message(DiscordMessage(content="Test message"))
|
376
403
|
# when
|
377
|
-
|
404
|
+
with self.assertRaises(Retry):
|
405
|
+
send_messages_to_webhook(self.webhook_1.pk)
|
378
406
|
# then
|
379
407
|
self.assertEqual(mock_send_message.call_count, 1)
|
380
408
|
self.assertEqual(self.webhook_1._main_queue.size(), 1)
|
@@ -406,24 +434,6 @@ class TestStoreKillmail(TestTrackerBase):
|
|
406
434
|
self.assertTrue(mock_logger.warning.called)
|
407
435
|
|
408
436
|
|
409
|
-
@override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
|
410
|
-
@patch("killtracker.models.webhooks.dhooks_lite.Webhook.execute", spec=True)
|
411
|
-
@patch(MODULE_PATH + ".logger", spec=True)
|
412
|
-
class TestSendTestKillmailsToWebhook(TestTrackerBase):
|
413
|
-
def setUp(self) -> None:
|
414
|
-
self.webhook_1._main_queue.clear()
|
415
|
-
|
416
|
-
def test_run_normal(self, mock_logger, mock_execute):
|
417
|
-
# given
|
418
|
-
mock_execute.return_value = dhooks_lite.WebhookResponse({}, status_code=200)
|
419
|
-
# when
|
420
|
-
with self.assertRaises(celery.exceptions.Retry):
|
421
|
-
send_test_message_to_webhook.delay(self.webhook_1.pk)
|
422
|
-
# then
|
423
|
-
self.assertTrue(mock_execute.called)
|
424
|
-
self.assertFalse(mock_logger.error.called)
|
425
|
-
|
426
|
-
|
427
437
|
@patch(MODULE_PATH + ".EveKillmail.objects.delete_stale")
|
428
438
|
class TestDeleteStaleKillmails(TestTrackerBase):
|
429
439
|
def test_normal(self, mock_delete_stale):
|
@@ -0,0 +1,39 @@
|
|
1
|
+
from unittest import TestCase
|
2
|
+
|
3
|
+
from .utils import CacheFake
|
4
|
+
|
5
|
+
|
6
|
+
class TestCacheFake(TestCase):
|
7
|
+
def test_get_should_return_value_when_found(self):
|
8
|
+
cache = CacheFake()
|
9
|
+
cache.set("alpha", 5)
|
10
|
+
got = cache.get("alpha")
|
11
|
+
self.assertEqual(got, 5)
|
12
|
+
|
13
|
+
def test_get_should_return_default_when_not_found(self):
|
14
|
+
cache = CacheFake()
|
15
|
+
cache.set("alpha", 5)
|
16
|
+
got = cache.get("bravo", 99)
|
17
|
+
self.assertEqual(got, 99)
|
18
|
+
|
19
|
+
def test_delete_should_remove_key(self):
|
20
|
+
cache = CacheFake()
|
21
|
+
cache.set("alpha", 5)
|
22
|
+
cache.delete("alpha")
|
23
|
+
self.assertIsNone(cache.get("alpha"))
|
24
|
+
|
25
|
+
def test_delete_should_ignore_when_key_does_not_exist(self):
|
26
|
+
cache = CacheFake()
|
27
|
+
cache.delete("alpha")
|
28
|
+
|
29
|
+
def test_clear_should_remove_all_keys(self):
|
30
|
+
cache = CacheFake()
|
31
|
+
cache.set("alpha", 5)
|
32
|
+
cache.clear()
|
33
|
+
self.assertIsNone(cache.get("alpha"))
|
34
|
+
|
35
|
+
def test_set_with_timeout(self):
|
36
|
+
cache = CacheFake()
|
37
|
+
cache.set("alpha", "django", timeout=5)
|
38
|
+
got = cache.get("alpha")
|
39
|
+
self.assertEqual(got, "django")
|
@@ -14,7 +14,7 @@ from allianceauth.eveonline.models import EveFactionInfo
|
|
14
14
|
|
15
15
|
from killtracker.app_settings import KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER
|
16
16
|
from killtracker.constants import EveCategoryId
|
17
|
-
from killtracker.core.
|
17
|
+
from killtracker.core.zkb import (
|
18
18
|
Killmail,
|
19
19
|
KillmailAttacker,
|
20
20
|
KillmailPosition,
|
@@ -8,7 +8,7 @@ from eveuniverse.models import EveEntity, EveType, EveUniverseEntityModel
|
|
8
8
|
from allianceauth.eveonline.models import EveAllianceInfo, EveCorporationInfo
|
9
9
|
from allianceauth.tests.auth_utils import AuthUtils
|
10
10
|
|
11
|
-
from killtracker.core.
|
11
|
+
from killtracker.core.zkb import Killmail
|
12
12
|
from killtracker.models import EveKillmail, Webhook
|
13
13
|
|
14
14
|
from . import _current_dir
|
killtracker/tests/utils.py
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
import logging
|
2
|
+
from typing import Any, Dict
|
2
3
|
|
3
4
|
from app_utils.allianceauth import get_redis_client
|
4
5
|
|
@@ -14,3 +15,30 @@ def reset_celery_once_locks():
|
|
14
15
|
logger.info("Removed %d stuck celery once keys", deleted_count)
|
15
16
|
else:
|
16
17
|
deleted_count = 0
|
18
|
+
|
19
|
+
|
20
|
+
class CacheFake:
|
21
|
+
"""A fake for replacing Django's cache in tests."""
|
22
|
+
|
23
|
+
def __init__(self):
|
24
|
+
self._cache: Dict[str, Any] = {}
|
25
|
+
|
26
|
+
def clear(self) -> None:
|
27
|
+
self._cache.clear()
|
28
|
+
|
29
|
+
def delete(self, key: str, version: int = None) -> None:
|
30
|
+
try:
|
31
|
+
del self._cache[key]
|
32
|
+
except KeyError:
|
33
|
+
pass
|
34
|
+
|
35
|
+
def get(self, key: str, default: Any = None, version: int = None) -> Any:
|
36
|
+
try:
|
37
|
+
return self._cache[key]
|
38
|
+
except KeyError:
|
39
|
+
return default
|
40
|
+
|
41
|
+
def set(
|
42
|
+
self, key: str, value: Any, timeout: int = None, version: int = None
|
43
|
+
) -> None:
|
44
|
+
self._cache[key] = value
|
killtracker/exceptions.py
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
"""Custom exceptions for killtracker."""
|
2
|
-
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
|
6
|
-
class KilltrackerException(Exception):
|
7
|
-
"""Exception from Killtracker"""
|
8
|
-
|
9
|
-
|
10
|
-
class WebhookTooManyRequests(KilltrackerException):
|
11
|
-
"""Webhook is temporarily blocked."""
|
12
|
-
|
13
|
-
DEFAULT_RESET_AFTER = 600
|
14
|
-
|
15
|
-
def __init__(self, retry_after: Optional[int] = None) -> None:
|
16
|
-
"""
|
17
|
-
Parameters:
|
18
|
-
- retry_after: time in seconds until this blockage will be reset
|
19
|
-
"""
|
20
|
-
super().__init__()
|
21
|
-
if retry_after is None:
|
22
|
-
retry_after = self.DEFAULT_RESET_AFTER
|
23
|
-
self._reset_after = int(retry_after)
|
24
|
-
|
25
|
-
@property
|
26
|
-
def retry_after(self) -> int:
|
27
|
-
"""Return in how many seconds to retry."""
|
28
|
-
return self._reset_after
|
29
|
-
|
30
|
-
|
31
|
-
class KillmailDoesNotExist(KilltrackerException):
|
32
|
-
"""Killmail does not exist in storage."""
|
@@ -1,34 +0,0 @@
|
|
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)
|
@@ -1,164 +0,0 @@
|
|
1
|
-
import requests_mock
|
2
|
-
|
3
|
-
from django.core.cache import cache
|
4
|
-
from django.test import TestCase
|
5
|
-
|
6
|
-
from killtracker.core.discord_messages import DiscordMessage
|
7
|
-
from killtracker.exceptions import WebhookTooManyRequests
|
8
|
-
from killtracker.models import Webhook
|
9
|
-
from killtracker.tests.testdata.helpers import LoadTestDataMixin
|
10
|
-
|
11
|
-
|
12
|
-
class TestWebhookQueue(TestCase):
|
13
|
-
@classmethod
|
14
|
-
def setUpClass(cls):
|
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
|
-
)
|
19
|
-
|
20
|
-
def setUp(self) -> None:
|
21
|
-
self.webhook_1._main_queue.clear()
|
22
|
-
self.webhook_1._error_queue.clear()
|
23
|
-
|
24
|
-
def test_reset_failed_messages(self):
|
25
|
-
message = "Test message"
|
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)
|
30
|
-
self.webhook_1.reset_failed_messages()
|
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)
|
69
|
-
|
70
|
-
|
71
|
-
@requests_mock.Mocker()
|
72
|
-
class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
73
|
-
def setUp(self) -> None:
|
74
|
-
self.message = DiscordMessage(content="Test message")
|
75
|
-
cache.clear()
|
76
|
-
|
77
|
-
def test_when_send_ok_returns_true(self, requests_mocker):
|
78
|
-
# given
|
79
|
-
requests_mocker.register_uri(
|
80
|
-
"POST",
|
81
|
-
self.webhook_1.url,
|
82
|
-
status_code=200,
|
83
|
-
json={
|
84
|
-
"name": "test webhook",
|
85
|
-
"type": 1,
|
86
|
-
"channel_id": "199737254929760256",
|
87
|
-
"token": "3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11",
|
88
|
-
"avatar": None,
|
89
|
-
"guild_id": "199737254929760256",
|
90
|
-
"id": "223704706495545344",
|
91
|
-
"application_id": None,
|
92
|
-
"user": {
|
93
|
-
"username": "test",
|
94
|
-
"discriminator": "7479",
|
95
|
-
"id": "190320984123768832",
|
96
|
-
"avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
|
97
|
-
"public_flags": 131328,
|
98
|
-
},
|
99
|
-
},
|
100
|
-
)
|
101
|
-
# when
|
102
|
-
response = self.webhook_1.send_message(self.message)
|
103
|
-
# then
|
104
|
-
self.assertTrue(response.status_ok)
|
105
|
-
self.assertTrue(requests_mocker.called)
|
106
|
-
|
107
|
-
def test_when_send_not_ok_returns_false(self, requests_mocker):
|
108
|
-
# given
|
109
|
-
requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
|
110
|
-
# when
|
111
|
-
response = self.webhook_1.send_message(self.message)
|
112
|
-
# then
|
113
|
-
self.assertFalse(response.status_ok)
|
114
|
-
self.assertTrue(requests_mocker.called)
|
115
|
-
|
116
|
-
def test_too_many_requests_normal(self, requests_mocker):
|
117
|
-
# given
|
118
|
-
requests_mocker.register_uri(
|
119
|
-
"POST",
|
120
|
-
self.webhook_1.url,
|
121
|
-
status_code=429,
|
122
|
-
json={
|
123
|
-
"global": False,
|
124
|
-
"message": "You are being rate limited.",
|
125
|
-
"retry_after": 2000,
|
126
|
-
},
|
127
|
-
headers={
|
128
|
-
"x-ratelimit-remaining": "5",
|
129
|
-
"x-ratelimit-reset-after": "60",
|
130
|
-
"Retry-After": "2000",
|
131
|
-
},
|
132
|
-
)
|
133
|
-
# when/then
|
134
|
-
try:
|
135
|
-
self.webhook_1.send_message(self.message)
|
136
|
-
except Exception as ex:
|
137
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
138
|
-
self.assertEqual(ex.retry_after, 2002)
|
139
|
-
else:
|
140
|
-
self.fail("Did not raise excepted exception")
|
141
|
-
|
142
|
-
self.assertAlmostEqual(
|
143
|
-
cache.ttl(self.webhook_1._blocked_cache_key()), 2002, delta=5
|
144
|
-
)
|
145
|
-
|
146
|
-
def test_too_many_requests_no_retry_value(self, requests_mocker):
|
147
|
-
# given
|
148
|
-
requests_mocker.register_uri(
|
149
|
-
"POST",
|
150
|
-
self.webhook_1.url,
|
151
|
-
status_code=429,
|
152
|
-
headers={
|
153
|
-
"x-ratelimit-remaining": "5",
|
154
|
-
"x-ratelimit-reset-after": "60",
|
155
|
-
},
|
156
|
-
)
|
157
|
-
# when/then
|
158
|
-
try:
|
159
|
-
self.webhook_1.send_message(self.message)
|
160
|
-
except Exception as ex:
|
161
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
162
|
-
self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
|
163
|
-
else:
|
164
|
-
self.fail("Did not raise excepted exception")
|
@@ -1,12 +0,0 @@
|
|
1
|
-
from django.test import TestCase
|
2
|
-
|
3
|
-
from killtracker.exceptions import WebhookTooManyRequests
|
4
|
-
|
5
|
-
|
6
|
-
class TestExceptions(TestCase):
|
7
|
-
def test_exception(self):
|
8
|
-
ex = WebhookTooManyRequests(10)
|
9
|
-
self.assertEqual(ex.retry_after, 10)
|
10
|
-
|
11
|
-
ex = WebhookTooManyRequests()
|
12
|
-
self.assertEqual(ex.retry_after, 600)
|
File without changes
|
File without changes
|