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.
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.dist-info}/METADATA +7 -7
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.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.0a1.dist-info}/WHEEL +0 -0
- {aa_killtracker-0.17.0.dist-info → aa_killtracker-1.0.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -1,150 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
import dhooks_lite
|
4
|
-
import requests_mock
|
5
|
-
|
6
|
-
from django.core.cache import cache
|
7
|
-
from django.test import TestCase
|
8
|
-
|
9
|
-
from app_utils.json import JSONDateTimeDecoder
|
10
|
-
|
11
|
-
from killtracker.exceptions import WebhookTooManyRequests
|
12
|
-
from killtracker.models import Webhook
|
13
|
-
from killtracker.tests.testdata.helpers import LoadTestDataMixin
|
14
|
-
|
15
|
-
|
16
|
-
class TestWebhookQueue(LoadTestDataMixin, TestCase):
|
17
|
-
@classmethod
|
18
|
-
def setUpClass(cls):
|
19
|
-
super().setUpClass()
|
20
|
-
|
21
|
-
def setUp(self) -> None:
|
22
|
-
self.webhook_1.main_queue.clear()
|
23
|
-
self.webhook_1.error_queue.clear()
|
24
|
-
|
25
|
-
def test_reset_failed_messages(self):
|
26
|
-
message = "Test message"
|
27
|
-
self.webhook_1.error_queue.enqueue(message)
|
28
|
-
self.webhook_1.error_queue.enqueue(message)
|
29
|
-
self.assertEqual(self.webhook_1.error_queue.size(), 2)
|
30
|
-
self.assertEqual(self.webhook_1.main_queue.size(), 0)
|
31
|
-
self.webhook_1.reset_failed_messages()
|
32
|
-
self.assertEqual(self.webhook_1.error_queue.size(), 0)
|
33
|
-
self.assertEqual(self.webhook_1.main_queue.size(), 2)
|
34
|
-
|
35
|
-
def test_discord_message_asjson_normal(self):
|
36
|
-
embed = dhooks_lite.Embed(description="my_description")
|
37
|
-
result = Webhook._discord_message_asjson(
|
38
|
-
content="my_content",
|
39
|
-
username="my_username",
|
40
|
-
avatar_url="my_avatar_url",
|
41
|
-
embeds=[embed],
|
42
|
-
)
|
43
|
-
message_python = json.loads(result, cls=JSONDateTimeDecoder)
|
44
|
-
expected = {
|
45
|
-
"content": "my_content",
|
46
|
-
"embeds": [{"description": "my_description", "type": "rich"}],
|
47
|
-
"username": "my_username",
|
48
|
-
"avatar_url": "my_avatar_url",
|
49
|
-
}
|
50
|
-
self.assertDictEqual(message_python, expected)
|
51
|
-
|
52
|
-
def test_discord_message_asjson_empty(self):
|
53
|
-
with self.assertRaises(ValueError):
|
54
|
-
Webhook._discord_message_asjson("")
|
55
|
-
|
56
|
-
|
57
|
-
@requests_mock.Mocker()
|
58
|
-
class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
59
|
-
def setUp(self) -> None:
|
60
|
-
self.message = Webhook._discord_message_asjson(content="Test message")
|
61
|
-
cache.clear()
|
62
|
-
|
63
|
-
def test_when_send_ok_returns_true(self, requests_mocker):
|
64
|
-
# given
|
65
|
-
requests_mocker.register_uri(
|
66
|
-
"POST",
|
67
|
-
self.webhook_1.url,
|
68
|
-
status_code=200,
|
69
|
-
json={
|
70
|
-
"name": "test webhook",
|
71
|
-
"type": 1,
|
72
|
-
"channel_id": "199737254929760256",
|
73
|
-
"token": "3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11",
|
74
|
-
"avatar": None,
|
75
|
-
"guild_id": "199737254929760256",
|
76
|
-
"id": "223704706495545344",
|
77
|
-
"application_id": None,
|
78
|
-
"user": {
|
79
|
-
"username": "test",
|
80
|
-
"discriminator": "7479",
|
81
|
-
"id": "190320984123768832",
|
82
|
-
"avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
|
83
|
-
"public_flags": 131328,
|
84
|
-
},
|
85
|
-
},
|
86
|
-
)
|
87
|
-
# when
|
88
|
-
response = self.webhook_1.send_message_to_webhook(self.message)
|
89
|
-
# then
|
90
|
-
self.assertTrue(response.status_ok)
|
91
|
-
self.assertTrue(requests_mocker.called)
|
92
|
-
|
93
|
-
def test_when_send_not_ok_returns_false(self, requests_mocker):
|
94
|
-
# given
|
95
|
-
requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
|
96
|
-
# when
|
97
|
-
response = self.webhook_1.send_message_to_webhook(self.message)
|
98
|
-
# then
|
99
|
-
self.assertFalse(response.status_ok)
|
100
|
-
self.assertTrue(requests_mocker.called)
|
101
|
-
|
102
|
-
def test_too_many_requests_normal(self, requests_mocker):
|
103
|
-
# given
|
104
|
-
requests_mocker.register_uri(
|
105
|
-
"POST",
|
106
|
-
self.webhook_1.url,
|
107
|
-
status_code=429,
|
108
|
-
json={
|
109
|
-
"global": False,
|
110
|
-
"message": "You are being rate limited.",
|
111
|
-
"retry_after": 2000,
|
112
|
-
},
|
113
|
-
headers={
|
114
|
-
"x-ratelimit-remaining": "5",
|
115
|
-
"x-ratelimit-reset-after": "60",
|
116
|
-
"Retry-After": "2000",
|
117
|
-
},
|
118
|
-
)
|
119
|
-
# when/then
|
120
|
-
try:
|
121
|
-
self.webhook_1.send_message_to_webhook(self.message)
|
122
|
-
except Exception as ex:
|
123
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
124
|
-
self.assertEqual(ex.retry_after, 2002)
|
125
|
-
else:
|
126
|
-
self.fail("Did not raise excepted exception")
|
127
|
-
|
128
|
-
self.assertAlmostEqual(
|
129
|
-
cache.ttl(self.webhook_1._blocked_cache_key()), 2002, delta=5
|
130
|
-
)
|
131
|
-
|
132
|
-
def test_too_many_requests_no_retry_value(self, requests_mocker):
|
133
|
-
# given
|
134
|
-
requests_mocker.register_uri(
|
135
|
-
"POST",
|
136
|
-
self.webhook_1.url,
|
137
|
-
status_code=429,
|
138
|
-
headers={
|
139
|
-
"x-ratelimit-remaining": "5",
|
140
|
-
"x-ratelimit-reset-after": "60",
|
141
|
-
},
|
142
|
-
)
|
143
|
-
# when/then
|
144
|
-
try:
|
145
|
-
self.webhook_1.send_message_to_webhook(self.message)
|
146
|
-
except Exception as ex:
|
147
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
148
|
-
self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
|
149
|
-
else:
|
150
|
-
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
|