aa-killtracker 0.18.0a2__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 (37) hide show
  1. {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0a1.dist-info}/METADATA +7 -7
  2. {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0a1.dist-info}/RECORD +33 -30
  3. killtracker/__init__.py +1 -1
  4. killtracker/admin.py +1 -1
  5. killtracker/app_settings.py +14 -7
  6. killtracker/core/discord.py +162 -0
  7. killtracker/core/helpers.py +13 -0
  8. killtracker/core/{discord_messages.py → trackers.py} +16 -75
  9. killtracker/core/{worker_shutdown.py → workers.py} +3 -4
  10. killtracker/core/{killmails.py → zkb.py} +32 -40
  11. killtracker/managers.py +1 -1
  12. killtracker/models/trackers.py +4 -5
  13. killtracker/models/webhooks.py +4 -53
  14. killtracker/signals.py +4 -4
  15. killtracker/tasks.py +47 -49
  16. killtracker/tests/core/test_discord.py +184 -0
  17. killtracker/tests/core/test_helpers.py +23 -0
  18. killtracker/tests/core/{test_discord_messages_1.py → test_tracker_1.py} +12 -39
  19. killtracker/tests/core/{test_discord_messages_2.py → test_tracker_2.py} +3 -3
  20. killtracker/tests/core/test_workers.py +49 -0
  21. killtracker/tests/core/{test_killmails.py → test_zkb.py} +58 -46
  22. killtracker/tests/models/test_killmails.py +0 -2
  23. killtracker/tests/models/test_trackers_1.py +1 -1
  24. killtracker/tests/models/test_trackers_2.py +2 -2
  25. killtracker/tests/models/test_webhooks.py +63 -0
  26. killtracker/tests/test_integration.py +26 -13
  27. killtracker/tests/test_tasks.py +68 -58
  28. killtracker/tests/test_utils.py +39 -0
  29. killtracker/tests/testdata/factories.py +1 -1
  30. killtracker/tests/testdata/helpers.py +1 -1
  31. killtracker/tests/utils.py +28 -0
  32. killtracker/exceptions.py +0 -32
  33. killtracker/tests/core/test_worker_shutdown.py +0 -34
  34. killtracker/tests/models/test_webhook.py +0 -164
  35. killtracker/tests/test_exceptions.py +0 -12
  36. {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0a1.dist-info}/WHEEL +0 -0
  37. {aa_killtracker-0.18.0a2.dist-info → aa_killtracker-1.0.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -1,16 +1,17 @@
1
1
  import datetime as dt
2
2
  from unittest.mock import patch
3
3
 
4
- import celery
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.discord_messages import DiscordMessage
13
- from killtracker.exceptions import WebhookTooManyRequests
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 + ".worker_shutdown.is_shutting_down", spec=True)
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(celery.exceptions.Retry):
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
- mock_send_message.return_value = dhooks_lite.WebhookResponse(
315
- {}, status_code=200
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.delay(self.webhook_1.pk)
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 test_three_message(self, mock_send_message):
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
- mock_send_message.return_value = dhooks_lite.WebhookResponse(
329
- {}, status_code=200
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.delay(self.webhook_1.pk)
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 test_no_messages(self, mock_send_message):
342
- """when no messages in queue, then do nothing"""
341
+ def test_should_do_nothing_when_queue_is_empty(
342
+ self, mock_send_message, mock_is_shutting_down
343
+ ):
343
344
  # given
344
- mock_send_message.return_value = dhooks_lite.WebhookResponse(
345
- {}, status_code=200
346
- )
345
+ mock_is_shutting_down.return_value = False
347
346
  # when
348
- send_messages_to_webhook.delay(self.webhook_1.pk)
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 test_failed_message(self, mock_send_message):
355
- """when message sending failed, then put message in error queue"""
353
+ def test_should_put_failed_message_in_error_queue(
354
+ self, mock_send_message, mock_is_shutting_down
355
+ ):
356
356
  # given
357
- mock_send_message.return_value = dhooks_lite.WebhookResponse(
358
- {}, status_code=404
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.delay(self.webhook_1.pk)
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 test_abort_on_too_many_requests(self, mock_send_message):
369
- """
370
- when WebhookTooManyRequests exception is raised
371
- then message is re-queued and retry once
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
- mock_send_message.side_effect = WebhookTooManyRequests(10)
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
- send_messages_to_webhook.delay(self.webhook_1.pk)
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.killmails import (
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.killmails import Killmail
11
+ from killtracker.core.zkb import Killmail
12
12
  from killtracker.models import EveKillmail, Webhook
13
13
 
14
14
  from . import _current_dir
@@ -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)