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.
@@ -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
- MODULE_PATH = "killtracker.models.trackers"
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(MODULE_PATH + ".KILLTRACKER_KILLMAIL_MAX_AGE_FOR_TRACKER", 60)
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=25)
275
- td3s = EveGroup.objects.get(id=1305)
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=1305)
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(MODULE_PATH + ".EveSolarSystem.jumps_to")
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(MODULE_PATH + ".KILLTRACKER_WEBHOOK_SET_AVATAR", True)
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(MODULE_PATH + ".KILLTRACKER_WEBHOOK_SET_AVATAR", False)
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")
@@ -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.testing import create_fake_user
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 TestTrackerChangeForm(WebTest):
135
+ class TestTrackerValidations2(TestCase):
165
136
  @classmethod
166
- def setUpClass(cls) -> None:
137
+ def setUpClass(cls):
167
138
  super().setUpClass()
168
- cls.user = create_fake_user(1001, "Bruce Wayne")
169
- cls.user.is_staff = True
170
- cls.user.is_superuser = True
171
- cls.user.save()
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 test_show_npcs_when_enabled(self):
144
+ def test_should_add_new_tracker(self):
215
145
  # given
216
- tracker = TrackerFactory()
217
- tracker.require_attackers_ship_types.add(self.npc_type)
218
- url = reverse("admin:killtracker_tracker_change", args=[tracker.id])
219
- self.app.set_user(self.user)
220
- self.app.session["killtracker_toogle_npc"] = True
221
- # when
222
- response = self.app.get(url)
223
- # then
224
- self.assertEqual(response.status_code, 200)
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 = initial_page.click(linkid="toogle-npc").follow()
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, 200)
294
- form = response.form
295
- require_attackers_ship_types_ids = {
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.trackers.dhooks_lite.Webhook.execute", spec=True)
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