aa-killtracker 0.12.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.12.0.dist-info → aa_killtracker-0.12.1.dist-info}/METADATA +1 -1
- {aa_killtracker-0.12.0.dist-info → aa_killtracker-0.12.1.dist-info}/RECORD +18 -20
- killtracker/__init__.py +1 -1
- killtracker/admin.py +18 -160
- killtracker/constants.py +62 -9
- killtracker/managers.py +0 -7
- killtracker/migrations/0003_optimize_tracker_form.py +90 -0
- killtracker/models/__init__.py +3 -2
- killtracker/models/trackers.py +65 -232
- killtracker/models/webhooks.py +242 -0
- killtracker/tests/models/test_trackers_1.py +9 -9
- 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.12.0.dist-info → aa_killtracker-0.12.1.dist-info}/LICENSE +0 -0
- {aa_killtracker-0.12.0.dist-info → aa_killtracker-0.12.1.dist-info}/WHEEL +0 -0
@@ -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
|
killtracker/tests/test_tasks.py
CHANGED
@@ -348,7 +348,7 @@ class TestStoreKillmail(TestTrackerBase):
|
|
348
348
|
|
349
349
|
|
350
350
|
@override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
|
351
|
-
@patch("killtracker.models.
|
351
|
+
@patch("killtracker.models.webhooks.dhooks_lite.Webhook.execute", spec=True)
|
352
352
|
@patch(MODULE_PATH + ".logger", spec=True)
|
353
353
|
class TestSendTestKillmailsToWebhook(TestTrackerBase):
|
354
354
|
def setUp(self) -> None:
|
killtracker/auth_hooks.py
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
{% extends "admin/change_form.html" %}
|
2
|
-
|
3
|
-
{% block object-tools %}
|
4
|
-
<ul class="object-tools">
|
5
|
-
{% if change %}
|
6
|
-
{% if not is_popup %}
|
7
|
-
{% block object-tools-items %}
|
8
|
-
{{ block.super }}
|
9
|
-
{% include "admin/killtracker/tracker/toogle_npc_button.html" %}
|
10
|
-
{% endblock %}
|
11
|
-
{% endif %}
|
12
|
-
{% else %}
|
13
|
-
{% include "admin/killtracker/tracker/toogle_npc_button.html" %}
|
14
|
-
{% endif %}
|
15
|
-
</ul>
|
16
|
-
{% endblock %}
|
@@ -1,23 +0,0 @@
|
|
1
|
-
{% load i18n %}
|
2
|
-
|
3
|
-
<li>
|
4
|
-
{% if not is_using_npc %}
|
5
|
-
<a
|
6
|
-
id="toogle-npc"
|
7
|
-
{% if not change %}
|
8
|
-
href="{% url 'killtracker:admin_killtracker_toogle_npc' %}"
|
9
|
-
{% else %}
|
10
|
-
href="{% url 'killtracker:admin_killtracker_toogle_npc' object_id %}"
|
11
|
-
{% endif %}
|
12
|
-
class="btn"
|
13
|
-
title="Click to toogle">
|
14
|
-
{% if request.session.killtracker_toogle_npc %}
|
15
|
-
{% translate "NPC types: enabled" %}
|
16
|
-
{% else %}
|
17
|
-
{% translate "NPC types: disabled" %}
|
18
|
-
{% endif %}
|
19
|
-
</a>
|
20
|
-
{% else %}
|
21
|
-
<p class="btn">NPC types in use</p>
|
22
|
-
{% endif %}
|
23
|
-
</li>
|
killtracker/urls.py
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
"""Routes for killtracker."""
|
2
|
-
|
3
|
-
from django.urls import path
|
4
|
-
|
5
|
-
from . import views
|
6
|
-
|
7
|
-
app_name = "killtracker"
|
8
|
-
|
9
|
-
urlpatterns = [
|
10
|
-
path(
|
11
|
-
"admin_killtracker_toogle_npc/<int:object_id>/",
|
12
|
-
views.admin_killtracker_toogle_npc,
|
13
|
-
name="admin_killtracker_toogle_npc",
|
14
|
-
),
|
15
|
-
path(
|
16
|
-
"admin_killtracker_toogle_npc/",
|
17
|
-
views.admin_killtracker_toogle_npc,
|
18
|
-
name="admin_killtracker_toogle_npc",
|
19
|
-
),
|
20
|
-
]
|
killtracker/views.py
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
"""Views for killtracker."""
|
2
|
-
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from django.contrib.admin.views.decorators import staff_member_required
|
6
|
-
from django.contrib.auth.decorators import login_required
|
7
|
-
from django.shortcuts import redirect
|
8
|
-
|
9
|
-
from allianceauth.services.hooks import get_extension_logger
|
10
|
-
from app_utils.logging import LoggerAddTag
|
11
|
-
|
12
|
-
from . import __title__
|
13
|
-
from .constants import SESSION_KEY_TOOGLE_NPC
|
14
|
-
|
15
|
-
logger = LoggerAddTag(get_extension_logger(__name__), __title__)
|
16
|
-
|
17
|
-
|
18
|
-
@login_required
|
19
|
-
@staff_member_required
|
20
|
-
def admin_killtracker_toogle_npc(request, object_id: Optional[int] = None):
|
21
|
-
"""Enable or disable the toogle to show NPC types."""
|
22
|
-
request.session[SESSION_KEY_TOOGLE_NPC] = not request.session.get(
|
23
|
-
SESSION_KEY_TOOGLE_NPC, False
|
24
|
-
)
|
25
|
-
if object_id:
|
26
|
-
return redirect("admin:killtracker_tracker_change", object_id)
|
27
|
-
return redirect("admin:killtracker_tracker_add")
|
File without changes
|
File without changes
|