aa-killtracker 0.11.0__py3-none-any.whl → 0.12.1__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.11.0.dist-info → aa_killtracker-0.12.1.dist-info}/METADATA +1 -1
- {aa_killtracker-0.11.0.dist-info → aa_killtracker-0.12.1.dist-info}/RECORD +22 -23
- killtracker/__init__.py +1 -1
- killtracker/admin.py +27 -134
- killtracker/constants.py +66 -3
- killtracker/core/killmails.py +4 -0
- killtracker/management/commands/killtracker_load_eve.py +4 -0
- killtracker/managers.py +0 -7
- killtracker/migrations/0002_tracker_require_attackers_weapon_groups_and_more.py +35 -0
- killtracker/migrations/0003_optimize_tracker_form.py +90 -0
- killtracker/models/__init__.py +3 -2
- killtracker/models/trackers.py +111 -232
- killtracker/models/webhooks.py +242 -0
- killtracker/tests/core/test_killmails.py +7 -1
- killtracker/tests/models/test_trackers_1.py +57 -12
- killtracker/tests/models/test_trackers_2.py +0 -144
- killtracker/tests/models/test_webhook.py +150 -0
- killtracker/tests/test_admin.py +23 -162
- killtracker/tests/test_integration.py +1 -1
- killtracker/tests/test_tasks.py +1 -1
- killtracker/auth_hooks.py +0 -9
- killtracker/templates/admin/killtracker/tracker/change_form.html +0 -16
- killtracker/templates/admin/killtracker/tracker/toogle_npc_button.html +0 -23
- killtracker/urls.py +0 -20
- killtracker/views.py +0 -27
- {aa_killtracker-0.11.0.dist-info → aa_killtracker-0.12.1.dist-info}/LICENSE +0 -0
- {aa_killtracker-0.11.0.dist-info → aa_killtracker-0.12.1.dist-info}/WHEEL +0 -0
@@ -19,6 +19,7 @@ from allianceauth.tests.auth_utils import AuthUtils
|
|
19
19
|
from app_utils.esi_testing import BravadoOperationStub
|
20
20
|
from app_utils.testing import NoSocketsTestCase, add_character_to_user_2
|
21
21
|
|
22
|
+
from killtracker.constants import EveGroupId
|
22
23
|
from killtracker.core.killmails import Killmail, _EntityCount
|
23
24
|
from killtracker.models import Tracker
|
24
25
|
|
@@ -30,7 +31,7 @@ from ..testdata.factories import (
|
|
30
31
|
)
|
31
32
|
from ..testdata.helpers import LoadTestDataMixin, load_killmail
|
32
33
|
|
33
|
-
|
34
|
+
MODELS_PATH = "killtracker.models"
|
34
35
|
|
35
36
|
|
36
37
|
def esi_get_route_origin_destination(origin, destination, **kwargs) -> list:
|
@@ -80,7 +81,7 @@ class TestTrackerCalculate(LoadTestDataMixin, NoSocketsTestCase):
|
|
80
81
|
expected = {10000001, 10000002, 10000003, 10000004, 10000005}
|
81
82
|
self.assertSetEqual(results, expected)
|
82
83
|
|
83
|
-
@patch(
|
84
|
+
@patch(MODELS_PATH + ".trackers.KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 60)
|
84
85
|
def test_excludes_older_killmails(self):
|
85
86
|
tracker = TrackerFactory(
|
86
87
|
name="Test",
|
@@ -143,7 +144,7 @@ class TestTrackerCalculate(LoadTestDataMixin, NoSocketsTestCase):
|
|
143
144
|
expected = {10000002, 10000003, 10000004}
|
144
145
|
self.assertSetEqual(results, expected)
|
145
146
|
|
146
|
-
@patch("eveuniverse.models.esi")
|
147
|
+
@patch("eveuniverse.models.universe_2.esi")
|
147
148
|
def test_can_filter_max_jumps(self, mock_esi):
|
148
149
|
mock_esi.client.Routes.get_route_origin_destination.side_effect = (
|
149
150
|
esi_get_route_origin_destination
|
@@ -159,7 +160,7 @@ class TestTrackerCalculate(LoadTestDataMixin, NoSocketsTestCase):
|
|
159
160
|
expected = {10000102, 10000103}
|
160
161
|
self.assertSetEqual(results, expected)
|
161
162
|
|
162
|
-
@patch("eveuniverse.models.esi")
|
163
|
+
@patch("eveuniverse.models.universe_2.esi")
|
163
164
|
def test_can_filter_max_distance(self, mock_esi):
|
164
165
|
mock_esi.client.Routes.get_route_origin_destination.side_effect = (
|
165
166
|
esi_get_route_origin_destination
|
@@ -271,8 +272,8 @@ class TestTrackerCalculate(LoadTestDataMixin, NoSocketsTestCase):
|
|
271
272
|
def test_can_require_attackers_ship_groups(self):
|
272
273
|
killmail_ids = {10000101, 10000201}
|
273
274
|
tracker = TrackerFactory(webhook=self.webhook_1)
|
274
|
-
frigate = EveGroup.objects.get(id=
|
275
|
-
td3s = EveGroup.objects.get(id=
|
275
|
+
frigate = EveGroup.objects.get(id=EveGroupId.FRIGATE)
|
276
|
+
td3s = EveGroup.objects.get(id=EveGroupId.TACTICAL_DESTROYER)
|
276
277
|
tracker.require_attackers_ship_groups.add(frigate)
|
277
278
|
tracker.require_attackers_ship_groups.add(td3s)
|
278
279
|
results = self._matching_killmails(tracker, killmail_ids)
|
@@ -284,7 +285,7 @@ class TestTrackerCalculate(LoadTestDataMixin, NoSocketsTestCase):
|
|
284
285
|
def test_can_require_victim_ship_group(self):
|
285
286
|
killmail_ids = {10000101, 10000201}
|
286
287
|
tracker = TrackerFactory(webhook=self.webhook_1)
|
287
|
-
td3s = EveGroup.objects.get(id=
|
288
|
+
td3s = EveGroup.objects.get(id=EveGroupId.TACTICAL_DESTROYER)
|
288
289
|
tracker.require_victim_ship_groups.add(td3s)
|
289
290
|
results = self._matching_killmails(tracker, killmail_ids)
|
290
291
|
self.assertEqual(len(results), 1)
|
@@ -526,8 +527,52 @@ class TestTrackerCalculate2(LoadTestDataMixin, NoSocketsTestCase):
|
|
526
527
|
# then
|
527
528
|
self.assertIsNone(result)
|
528
529
|
|
530
|
+
def test_should_accept_with_require_attacker_weapon_group(self):
|
531
|
+
attacker = KillmailAttackerFactory(weapon_type_id=2977)
|
532
|
+
killmail = KillmailFactory(attackers=[attacker])
|
533
|
+
tracker = TrackerFactory(webhook=self.webhook_1)
|
534
|
+
tracker.require_attackers_weapon_groups.add(
|
535
|
+
EveGroup.objects.get(id=EveGroupId.PROJECTILE_WEAPON)
|
536
|
+
)
|
537
|
+
# when
|
538
|
+
result = tracker.process_killmail(killmail)
|
539
|
+
# then
|
540
|
+
self.assertEqual(killmail.id, result.id)
|
541
|
+
|
542
|
+
def test_should_deny_with_require_attacker_weapon_group(self):
|
543
|
+
attacker = KillmailAttackerFactory(weapon_type_id=2488)
|
544
|
+
killmail = KillmailFactory(attackers=[attacker])
|
545
|
+
tracker = TrackerFactory(webhook=self.webhook_1)
|
546
|
+
tracker.require_attackers_weapon_groups.add(
|
547
|
+
EveGroup.objects.get(id=EveGroupId.PROJECTILE_WEAPON)
|
548
|
+
)
|
549
|
+
# when
|
550
|
+
result = tracker.process_killmail(killmail)
|
551
|
+
# then
|
552
|
+
self.assertIsNone(result)
|
553
|
+
|
554
|
+
def test_should_accept_with_require_attacker_weapon_type(self):
|
555
|
+
attacker = KillmailAttackerFactory(weapon_type_id=2977)
|
556
|
+
killmail = KillmailFactory(attackers=[attacker])
|
557
|
+
tracker = TrackerFactory(webhook=self.webhook_1)
|
558
|
+
tracker.require_attackers_weapon_types.add(EveType.objects.get(id=2977))
|
559
|
+
# when
|
560
|
+
result = tracker.process_killmail(killmail)
|
561
|
+
# then
|
562
|
+
self.assertEqual(killmail.id, result.id)
|
563
|
+
|
564
|
+
def test_should_deny_with_require_attacker_weapon_type(self):
|
565
|
+
attacker = KillmailAttackerFactory(weapon_type_id=2488)
|
566
|
+
killmail = KillmailFactory(attackers=[attacker])
|
567
|
+
tracker = TrackerFactory(webhook=self.webhook_1)
|
568
|
+
tracker.require_attackers_weapon_types.add(EveType.objects.get(id=2977))
|
569
|
+
# when
|
570
|
+
result = tracker.process_killmail(killmail)
|
571
|
+
# then
|
572
|
+
self.assertIsNone(result)
|
573
|
+
|
529
574
|
|
530
|
-
@patch(
|
575
|
+
@patch(MODELS_PATH + ".trackers.EveSolarSystem.jumps_to")
|
531
576
|
class TestTrackerCalculateTrackerInfo(LoadTestDataMixin, NoSocketsTestCase):
|
532
577
|
def setUp(self) -> None:
|
533
578
|
self.tracker = TrackerFactory(webhook=self.webhook_1)
|
@@ -622,8 +667,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
622
667
|
self.tracker = TrackerFactory(name="My Tracker", webhook=self.webhook_1)
|
623
668
|
self.webhook_1.main_queue.clear()
|
624
669
|
|
625
|
-
@patch(
|
626
|
-
@patch("eveuniverse.models.esi")
|
670
|
+
@patch(MODELS_PATH + ".webhooks.KILLTRACKER_WEBHOOK_SET_AVATAR", True)
|
671
|
+
@patch("eveuniverse.models.universe_2.esi")
|
627
672
|
def test_normal(self, mock_esi):
|
628
673
|
mock_esi.client.Routes.get_route_origin_destination.side_effect = (
|
629
674
|
esi_get_route_origin_destination
|
@@ -649,8 +694,8 @@ class TestTrackerEnqueueKillmail(LoadTestDataMixin, TestCase):
|
|
649
694
|
self.assertIn("Combat Battlecruiser", embed["description"])
|
650
695
|
self.assertIn("Tracked ship types", embed["description"])
|
651
696
|
|
652
|
-
@patch(
|
653
|
-
@patch("eveuniverse.models.esi")
|
697
|
+
@patch(MODELS_PATH + ".webhooks.KILLTRACKER_WEBHOOK_SET_AVATAR", False)
|
698
|
+
@patch("eveuniverse.models.universe_2.esi")
|
654
699
|
def test_disabled_avatar(self, mock_esi):
|
655
700
|
mock_esi.client.Routes.get_route_origin_destination.side_effect = (
|
656
701
|
esi_get_route_origin_destination
|
@@ -1,21 +1,14 @@
|
|
1
|
-
import json
|
2
1
|
from unittest.mock import patch
|
3
2
|
|
4
|
-
import dhooks_lite
|
5
|
-
import requests_mock
|
6
3
|
from bs4 import BeautifulSoup
|
7
4
|
from markdown import markdown
|
8
5
|
|
9
|
-
from django.core.cache import cache
|
10
6
|
from django.test import TestCase
|
11
7
|
from eveuniverse.models import EveConstellation, EveRegion, EveSolarSystem, EveType
|
12
8
|
|
13
|
-
from app_utils.json import JSONDateTimeDecoder
|
14
9
|
from app_utils.testing import NoSocketsTestCase
|
15
10
|
|
16
11
|
from killtracker.core.killmails import Killmail
|
17
|
-
from killtracker.exceptions import WebhookTooManyRequests
|
18
|
-
from killtracker.models import Webhook
|
19
12
|
|
20
13
|
from ..testdata.factories import TrackerFactory
|
21
14
|
from ..testdata.helpers import LoadTestDataMixin, load_killmail
|
@@ -23,47 +16,6 @@ from ..testdata.helpers import LoadTestDataMixin, load_killmail
|
|
23
16
|
MODELS_PATH = "killtracker.models.trackers"
|
24
17
|
|
25
18
|
|
26
|
-
class TestWebhookQueue(LoadTestDataMixin, TestCase):
|
27
|
-
@classmethod
|
28
|
-
def setUpClass(cls):
|
29
|
-
super().setUpClass()
|
30
|
-
|
31
|
-
def setUp(self) -> None:
|
32
|
-
self.webhook_1.main_queue.clear()
|
33
|
-
self.webhook_1.error_queue.clear()
|
34
|
-
|
35
|
-
def test_reset_failed_messages(self):
|
36
|
-
message = "Test message"
|
37
|
-
self.webhook_1.error_queue.enqueue(message)
|
38
|
-
self.webhook_1.error_queue.enqueue(message)
|
39
|
-
self.assertEqual(self.webhook_1.error_queue.size(), 2)
|
40
|
-
self.assertEqual(self.webhook_1.main_queue.size(), 0)
|
41
|
-
self.webhook_1.reset_failed_messages()
|
42
|
-
self.assertEqual(self.webhook_1.error_queue.size(), 0)
|
43
|
-
self.assertEqual(self.webhook_1.main_queue.size(), 2)
|
44
|
-
|
45
|
-
def test_discord_message_asjson_normal(self):
|
46
|
-
embed = dhooks_lite.Embed(description="my_description")
|
47
|
-
result = Webhook._discord_message_asjson(
|
48
|
-
content="my_content",
|
49
|
-
username="my_username",
|
50
|
-
avatar_url="my_avatar_url",
|
51
|
-
embeds=[embed],
|
52
|
-
)
|
53
|
-
message_python = json.loads(result, cls=JSONDateTimeDecoder)
|
54
|
-
expected = {
|
55
|
-
"content": "my_content",
|
56
|
-
"embeds": [{"description": "my_description", "type": "rich"}],
|
57
|
-
"username": "my_username",
|
58
|
-
"avatar_url": "my_avatar_url",
|
59
|
-
}
|
60
|
-
self.assertDictEqual(message_python, expected)
|
61
|
-
|
62
|
-
def test_discord_message_asjson_empty(self):
|
63
|
-
with self.assertRaises(ValueError):
|
64
|
-
Webhook._discord_message_asjson("")
|
65
|
-
|
66
|
-
|
67
19
|
class TestHasLocalizationClause(LoadTestDataMixin, NoSocketsTestCase):
|
68
20
|
def test_has_localization_filter_1(self):
|
69
21
|
tracker = TrackerFactory.build(webhook=self.webhook_1, exclude_high_sec=True)
|
@@ -137,102 +89,6 @@ class TestSaveMethod(LoadTestDataMixin, NoSocketsTestCase):
|
|
137
89
|
self.assertFalse(tracker.color)
|
138
90
|
|
139
91
|
|
140
|
-
@requests_mock.Mocker()
|
141
|
-
class TestWebhookSendMessage(LoadTestDataMixin, TestCase):
|
142
|
-
def setUp(self) -> None:
|
143
|
-
self.message = Webhook._discord_message_asjson(content="Test message")
|
144
|
-
cache.clear()
|
145
|
-
|
146
|
-
def test_when_send_ok_returns_true(self, requests_mocker):
|
147
|
-
# given
|
148
|
-
requests_mocker.register_uri(
|
149
|
-
"POST",
|
150
|
-
self.webhook_1.url,
|
151
|
-
status_code=200,
|
152
|
-
json={
|
153
|
-
"name": "test webhook",
|
154
|
-
"type": 1,
|
155
|
-
"channel_id": "199737254929760256",
|
156
|
-
"token": "3d89bb7572e0fb30d8128367b3b1b44fecd1726de135cbe28a41f8b2f777c372ba2939e72279b94526ff5d1bd4358d65cf11",
|
157
|
-
"avatar": None,
|
158
|
-
"guild_id": "199737254929760256",
|
159
|
-
"id": "223704706495545344",
|
160
|
-
"application_id": None,
|
161
|
-
"user": {
|
162
|
-
"username": "test",
|
163
|
-
"discriminator": "7479",
|
164
|
-
"id": "190320984123768832",
|
165
|
-
"avatar": "b004ec1740a63ca06ae2e14c5cee11f3",
|
166
|
-
"public_flags": 131328,
|
167
|
-
},
|
168
|
-
},
|
169
|
-
)
|
170
|
-
# when
|
171
|
-
response = self.webhook_1.send_message_to_webhook(self.message)
|
172
|
-
# then
|
173
|
-
self.assertTrue(response.status_ok)
|
174
|
-
self.assertTrue(requests_mocker.called)
|
175
|
-
|
176
|
-
def test_when_send_not_ok_returns_false(self, requests_mocker):
|
177
|
-
# given
|
178
|
-
requests_mocker.register_uri("POST", self.webhook_1.url, status_code=404)
|
179
|
-
# when
|
180
|
-
response = self.webhook_1.send_message_to_webhook(self.message)
|
181
|
-
# then
|
182
|
-
self.assertFalse(response.status_ok)
|
183
|
-
self.assertTrue(requests_mocker.called)
|
184
|
-
|
185
|
-
def test_too_many_requests_normal(self, requests_mocker):
|
186
|
-
# given
|
187
|
-
requests_mocker.register_uri(
|
188
|
-
"POST",
|
189
|
-
self.webhook_1.url,
|
190
|
-
status_code=429,
|
191
|
-
json={
|
192
|
-
"global": False,
|
193
|
-
"message": "You are being rate limited.",
|
194
|
-
"retry_after": 2000,
|
195
|
-
},
|
196
|
-
headers={
|
197
|
-
"x-ratelimit-remaining": "5",
|
198
|
-
"x-ratelimit-reset-after": "60",
|
199
|
-
"Retry-After": "2000",
|
200
|
-
},
|
201
|
-
)
|
202
|
-
# when/then
|
203
|
-
try:
|
204
|
-
self.webhook_1.send_message_to_webhook(self.message)
|
205
|
-
except Exception as ex:
|
206
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
207
|
-
self.assertEqual(ex.retry_after, 2002)
|
208
|
-
else:
|
209
|
-
self.fail("Did not raise excepted exception")
|
210
|
-
|
211
|
-
self.assertAlmostEqual(
|
212
|
-
cache.ttl(self.webhook_1._blocked_cache_key()), 2002, delta=5
|
213
|
-
)
|
214
|
-
|
215
|
-
def test_too_many_requests_no_retry_value(self, requests_mocker):
|
216
|
-
# given
|
217
|
-
requests_mocker.register_uri(
|
218
|
-
"POST",
|
219
|
-
self.webhook_1.url,
|
220
|
-
status_code=429,
|
221
|
-
headers={
|
222
|
-
"x-ratelimit-remaining": "5",
|
223
|
-
"x-ratelimit-reset-after": "60",
|
224
|
-
},
|
225
|
-
)
|
226
|
-
# when/then
|
227
|
-
try:
|
228
|
-
self.webhook_1.send_message_to_webhook(self.message)
|
229
|
-
except Exception as ex:
|
230
|
-
self.assertIsInstance(ex, WebhookTooManyRequests)
|
231
|
-
self.assertEqual(ex.retry_after, WebhookTooManyRequests.DEFAULT_RESET_AFTER)
|
232
|
-
else:
|
233
|
-
self.fail("Did not raise excepted exception")
|
234
|
-
|
235
|
-
|
236
92
|
@patch(MODELS_PATH + ".Webhook.enqueue_message")
|
237
93
|
class TestTrackerGenerateKillmailMessage(LoadTestDataMixin, TestCase):
|
238
94
|
def setUp(self) -> None:
|
@@ -0,0 +1,150 @@
|
|
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")
|
killtracker/tests/test_admin.py
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
from django.contrib.auth.models import User
|
2
|
+
from django.test import TestCase
|
2
3
|
from django.urls import reverse
|
3
4
|
from django_webtest import WebTest
|
4
|
-
from eveuniverse.models import EveType
|
5
5
|
|
6
6
|
from allianceauth.eveonline.models import EveCorporationInfo
|
7
|
-
from app_utils.
|
7
|
+
from app_utils.testdata_factories import UserFactory
|
8
8
|
|
9
9
|
from killtracker.models import Tracker, Webhook
|
10
10
|
|
11
|
-
from .testdata.factories import TrackerFactory
|
11
|
+
from .testdata.factories import TrackerFactory, WebhookFactory
|
12
12
|
from .testdata.helpers import LoadTestDataMixin
|
13
|
-
from .testdata.load_eveuniverse import load_eveuniverse
|
14
13
|
|
15
14
|
|
16
15
|
class TestTrackerChangeList(LoadTestDataMixin, WebTest):
|
@@ -97,34 +96,6 @@ class TestTrackerValidations(LoadTestDataMixin, WebTest):
|
|
97
96
|
self.assertIn("Please correct the error below", response.text)
|
98
97
|
self.assertEqual(Tracker.objects.count(), 0)
|
99
98
|
|
100
|
-
def test_can_not_have_same_options_attacker_alliances(self):
|
101
|
-
form = self._open_page()
|
102
|
-
form["exclude_attacker_alliances"] = [
|
103
|
-
self.alliance_3001.pk,
|
104
|
-
self.alliance_3011.pk,
|
105
|
-
]
|
106
|
-
form["require_attacker_alliances"] = [self.alliance_3001.pk]
|
107
|
-
response = form.submit()
|
108
|
-
|
109
|
-
# assert results
|
110
|
-
self.assertEqual(response.status_code, 200)
|
111
|
-
self.assertIn("Please correct the error below", response.text)
|
112
|
-
self.assertEqual(Tracker.objects.count(), 0)
|
113
|
-
|
114
|
-
def test_can_not_have_same_options_attacker_corporations(self):
|
115
|
-
form = self._open_page()
|
116
|
-
form["exclude_attacker_corporations"] = [
|
117
|
-
self.corporation_2001.pk,
|
118
|
-
self.corporation_2011.pk,
|
119
|
-
]
|
120
|
-
form["require_attacker_corporations"] = [self.corporation_2011.pk]
|
121
|
-
response = form.submit()
|
122
|
-
|
123
|
-
# assert results
|
124
|
-
self.assertEqual(response.status_code, 200)
|
125
|
-
self.assertIn("Please correct the error below", response.text)
|
126
|
-
self.assertEqual(Tracker.objects.count(), 0)
|
127
|
-
|
128
99
|
def test_min_attackers_must_be_less_than_max_attackers(self):
|
129
100
|
form = self._open_page()
|
130
101
|
form["require_min_attackers"] = 10
|
@@ -161,142 +132,32 @@ class TestTrackerValidations(LoadTestDataMixin, WebTest):
|
|
161
132
|
self.assertEqual(Tracker.objects.count(), 0)
|
162
133
|
|
163
134
|
|
164
|
-
class
|
135
|
+
class TestTrackerValidations2(TestCase):
|
165
136
|
@classmethod
|
166
|
-
def setUpClass(cls)
|
137
|
+
def setUpClass(cls):
|
167
138
|
super().setUpClass()
|
168
|
-
cls.user =
|
169
|
-
cls.
|
170
|
-
cls.
|
171
|
-
cls.
|
172
|
-
load_eveuniverse()
|
173
|
-
cls.npc_type = EveType.objects.get(id=23320)
|
174
|
-
|
175
|
-
def test_do_not_show_npcs_when_not_used_and_not_enabled(self):
|
176
|
-
# given
|
177
|
-
tracker = TrackerFactory()
|
178
|
-
url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
|
179
|
-
self.app.set_user(self.user)
|
180
|
-
# when
|
181
|
-
response = self.app.get(url)
|
182
|
-
# then
|
183
|
-
self.assertEqual(response.status_code, 200)
|
184
|
-
form = response.form
|
185
|
-
require_attackers_ship_types_ids = {
|
186
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
187
|
-
}
|
188
|
-
self.assertNotIn(self.npc_type.id, require_attackers_ship_types_ids)
|
189
|
-
require_attackers_ship_groups_ids = {
|
190
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
191
|
-
}
|
192
|
-
self.assertNotIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
193
|
-
|
194
|
-
def test_show_npcs_when_in_use(self):
|
195
|
-
# given
|
196
|
-
tracker = TrackerFactory()
|
197
|
-
tracker.require_attackers_ship_types.add(self.npc_type)
|
198
|
-
url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
|
199
|
-
self.app.set_user(self.user)
|
200
|
-
# when
|
201
|
-
response = self.app.get(url)
|
202
|
-
# then
|
203
|
-
self.assertEqual(response.status_code, 200)
|
204
|
-
form = response.form
|
205
|
-
require_attackers_ship_types_ids = {
|
206
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
207
|
-
}
|
208
|
-
self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
|
209
|
-
require_attackers_ship_groups_ids = {
|
210
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
211
|
-
}
|
212
|
-
self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
139
|
+
cls.user = UserFactory(is_staff=True, is_superuser=True)
|
140
|
+
cls.webhook = WebhookFactory()
|
141
|
+
cls.url_add = reverse("admin:killtracker_tracker_add")
|
142
|
+
cls.url_changelist = reverse("admin:killtracker_tracker_changelist")
|
213
143
|
|
214
|
-
def
|
144
|
+
def test_should_add_new_tracker(self):
|
215
145
|
# given
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
form = response.form
|
226
|
-
require_attackers_ship_types_ids = {
|
227
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
228
|
-
}
|
229
|
-
self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
|
230
|
-
require_attackers_ship_groups_ids = {
|
231
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
146
|
+
self.client.force_login(self.user)
|
147
|
+
data = {
|
148
|
+
"name": "Dummy",
|
149
|
+
"webhook": self.webhook.pk,
|
150
|
+
"_save": "Save",
|
151
|
+
"is_enabled": "on",
|
152
|
+
"color": "#000000",
|
153
|
+
"ping_type": "PN",
|
154
|
+
"is_posting_name": "on",
|
232
155
|
}
|
233
|
-
self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
234
156
|
|
235
|
-
def test_can_enable_npcs(self):
|
236
|
-
# given
|
237
|
-
tracker = TrackerFactory()
|
238
|
-
url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
|
239
|
-
self.app.set_user(self.user)
|
240
|
-
initial_page = self.app.get(url)
|
241
157
|
# when
|
242
|
-
response =
|
243
|
-
# then
|
244
|
-
self.assertEqual(response.status_code, 200)
|
245
|
-
form = response.form
|
246
|
-
require_attackers_ship_types_ids = {
|
247
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
248
|
-
}
|
249
|
-
self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
|
250
|
-
require_attackers_ship_groups_ids = {
|
251
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
252
|
-
}
|
253
|
-
self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
254
|
-
|
255
|
-
|
256
|
-
class TestTrackerAddForm(WebTest):
|
257
|
-
@classmethod
|
258
|
-
def setUpClass(cls) -> None:
|
259
|
-
super().setUpClass()
|
260
|
-
cls.user = create_fake_user(1001, "Bruce Wayne")
|
261
|
-
cls.user.is_staff = True
|
262
|
-
cls.user.is_superuser = True
|
263
|
-
cls.user.save()
|
264
|
-
load_eveuniverse()
|
265
|
-
cls.npc_type = EveType.objects.get(id=23320)
|
158
|
+
response = self.client.post(self.url_add, data=data)
|
266
159
|
|
267
|
-
def test_do_not_show_npcs_when_not_enabled(self):
|
268
|
-
# given
|
269
|
-
url = reverse("admin:killtracker_tracker_add")
|
270
|
-
self.app.set_user(self.user)
|
271
|
-
# when
|
272
|
-
response = self.app.get(url)
|
273
|
-
# then
|
274
|
-
self.assertEqual(response.status_code, 200)
|
275
|
-
form = response.form
|
276
|
-
require_attackers_ship_types_ids = {
|
277
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
278
|
-
}
|
279
|
-
self.assertNotIn(self.npc_type.id, require_attackers_ship_types_ids)
|
280
|
-
require_attackers_ship_groups_ids = {
|
281
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
282
|
-
}
|
283
|
-
self.assertNotIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
284
|
-
|
285
|
-
def test_can_enable_npcs(self):
|
286
|
-
# given
|
287
|
-
url = reverse("admin:killtracker_tracker_add")
|
288
|
-
self.app.set_user(self.user)
|
289
|
-
initial_page = self.app.get(url)
|
290
|
-
# when
|
291
|
-
response = initial_page.click(linkid="toogle-npc").follow()
|
292
160
|
# then
|
293
|
-
self.assertEqual(response.status_code,
|
294
|
-
|
295
|
-
|
296
|
-
int(obj[0]) for obj in form["require_attackers_ship_types"].options
|
297
|
-
}
|
298
|
-
self.assertIn(self.npc_type.id, require_attackers_ship_types_ids)
|
299
|
-
require_attackers_ship_groups_ids = {
|
300
|
-
int(obj[0]) for obj in form["require_attackers_ship_groups"].options
|
301
|
-
}
|
302
|
-
self.assertIn(self.npc_type.eve_group_id, require_attackers_ship_groups_ids)
|
161
|
+
self.assertEqual(response.status_code, 302)
|
162
|
+
self.assertEqual(response.url, self.url_changelist)
|
163
|
+
self.assertTrue(Tracker.objects.filter(name="Dummy").exists())
|
@@ -19,7 +19,7 @@ PACKAGE_PATH = "killtracker"
|
|
19
19
|
@patch("celery.app.task.Context.called_directly", False) # make retry work with eager
|
20
20
|
@override_settings(CELERY_ALWAYS_EAGER=True)
|
21
21
|
@patch(PACKAGE_PATH + ".tasks.is_esi_online", lambda: True)
|
22
|
-
@patch(PACKAGE_PATH + ".models.
|
22
|
+
@patch(PACKAGE_PATH + ".models.webhooks.dhooks_lite.Webhook.execute", spec=True)
|
23
23
|
@requests_mock.Mocker()
|
24
24
|
class TestTasksEnd2End(LoadTestDataMixin, TestCase):
|
25
25
|
@classmethod
|