aa-fleetfinder 2.6.0__py3-none-any.whl → 2.7.0__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.
Potentially problematic release.
This version of aa-fleetfinder might be problematic. Click here for more details.
- {aa_fleetfinder-2.6.0.dist-info → aa_fleetfinder-2.7.0.dist-info}/METADATA +1 -1
- {aa_fleetfinder-2.6.0.dist-info → aa_fleetfinder-2.7.0.dist-info}/RECORD +40 -33
- fleetfinder/__init__.py +1 -1
- fleetfinder/locale/cs_CZ/LC_MESSAGES/django.po +94 -17
- fleetfinder/locale/de/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/de/LC_MESSAGES/django.po +108 -20
- fleetfinder/locale/django.pot +96 -18
- fleetfinder/locale/es/LC_MESSAGES/django.po +108 -18
- fleetfinder/locale/fr_FR/LC_MESSAGES/django.po +98 -17
- fleetfinder/locale/it_IT/LC_MESSAGES/django.po +91 -17
- fleetfinder/locale/ja/LC_MESSAGES/django.po +95 -17
- fleetfinder/locale/ko_KR/LC_MESSAGES/django.po +108 -18
- fleetfinder/locale/nl_NL/LC_MESSAGES/django.po +91 -17
- fleetfinder/locale/pl_PL/LC_MESSAGES/django.po +93 -17
- fleetfinder/locale/ru/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/ru/LC_MESSAGES/django.po +112 -22
- fleetfinder/locale/sk/LC_MESSAGES/django.po +91 -17
- fleetfinder/locale/uk/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/uk/LC_MESSAGES/django.po +112 -22
- fleetfinder/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- fleetfinder/locale/zh_Hans/LC_MESSAGES/django.po +112 -22
- fleetfinder/static/fleetfinder/css/fleetfinder.css +21 -0
- fleetfinder/static/fleetfinder/css/fleetfinder.min.css +1 -1
- fleetfinder/static/fleetfinder/css/fleetfinder.min.css.map +1 -1
- fleetfinder/static/fleetfinder/js/fleetfinder.js +23 -0
- fleetfinder/static/fleetfinder/js/fleetfinder.min.js +2 -0
- fleetfinder/static/fleetfinder/js/fleetfinder.min.js.map +1 -0
- fleetfinder/tasks.py +137 -150
- fleetfinder/templates/fleetfinder/bundles/js/fleetfinder-js.html +3 -0
- fleetfinder/templates/fleetfinder/dashboard.html +38 -63
- fleetfinder/templates/fleetfinder/fleet-details.html +124 -33
- fleetfinder/templates/fleetfinder/join-fleet.html +11 -1
- fleetfinder/templates/fleetfinder/modals/kick-fleet-member.html +46 -0
- fleetfinder/templates/fleetfinder/partials/body/form-fleet-details.html +8 -8
- fleetfinder/tests/test_tasks.py +140 -0
- fleetfinder/tests/test_views.py +473 -0
- fleetfinder/urls.py +5 -0
- fleetfinder/views.py +316 -103
- {aa_fleetfinder-2.6.0.dist-info → aa_fleetfinder-2.7.0.dist-info}/WHEEL +0 -0
- {aa_fleetfinder-2.6.0.dist-info → aa_fleetfinder-2.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test the views for the Fleet Finder application.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
# Standard Library
|
|
6
|
+
import json
|
|
7
|
+
from http import HTTPStatus
|
|
8
|
+
from types import SimpleNamespace
|
|
9
|
+
from unittest.mock import Mock, patch
|
|
10
|
+
|
|
11
|
+
# Django
|
|
12
|
+
from django.contrib.auth.models import Group
|
|
13
|
+
from django.test import TestCase
|
|
14
|
+
from django.urls import reverse
|
|
15
|
+
from django.utils.datetime_safe import datetime
|
|
16
|
+
from django.utils.timezone import now
|
|
17
|
+
|
|
18
|
+
# Alliance Auth
|
|
19
|
+
from allianceauth.groupmanagement.models import AuthGroup
|
|
20
|
+
|
|
21
|
+
# Alliance Auth (External Libs)
|
|
22
|
+
from app_utils.testing import create_fake_user
|
|
23
|
+
|
|
24
|
+
# AA Fleet Finder
|
|
25
|
+
from fleetfinder.models import Fleet
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def dt_to_iso(dt: datetime) -> str:
|
|
29
|
+
"""
|
|
30
|
+
Helper :: Convert a datetime object to ISO 8601 format.
|
|
31
|
+
|
|
32
|
+
@see https://github.com/django/django/blob/main/django/core/serializers/json.py#L92-L98
|
|
33
|
+
|
|
34
|
+
:param dt:
|
|
35
|
+
:type dt:
|
|
36
|
+
:return:
|
|
37
|
+
:rtype:
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
r = dt.isoformat()
|
|
41
|
+
|
|
42
|
+
if dt.microsecond:
|
|
43
|
+
r = r[:23] + r[26:]
|
|
44
|
+
|
|
45
|
+
if r.endswith("+00:00"):
|
|
46
|
+
r = r.removesuffix("+00:00") + "Z"
|
|
47
|
+
|
|
48
|
+
return r
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class FleetfinderTestViews(TestCase):
|
|
52
|
+
"""
|
|
53
|
+
Base test case for Fleet Finder views.
|
|
54
|
+
This class sets up the necessary users and fleet ID for testing.
|
|
55
|
+
It includes a user with the `fleetfinder.manage_fleets` permission
|
|
56
|
+
and a user with `fleetfinder.access_fleetfinder` access permissions.
|
|
57
|
+
The fleet ID is set to a predefined value for testing purposes.
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def setUp(cls):
|
|
62
|
+
"""
|
|
63
|
+
Set up the test case.
|
|
64
|
+
|
|
65
|
+
:return:
|
|
66
|
+
:rtype:
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
cls.user_with_manage_perms = create_fake_user(
|
|
70
|
+
character_id=1000,
|
|
71
|
+
character_name="Jean Luc Picard",
|
|
72
|
+
permissions=["fleetfinder.access_fleetfinder", "fleetfinder.manage_fleets"],
|
|
73
|
+
)
|
|
74
|
+
cls.user_with_basic_acces_perms = create_fake_user(
|
|
75
|
+
character_id=1001,
|
|
76
|
+
character_name="William Riker",
|
|
77
|
+
permissions=["fleetfinder.access_fleetfinder"],
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
cls.fleet_created_at = now()
|
|
81
|
+
|
|
82
|
+
cls.fleet = Fleet(
|
|
83
|
+
fleet_id=12345,
|
|
84
|
+
name="Starfleet",
|
|
85
|
+
fleet_commander=cls.user_with_manage_perms.profile.main_character,
|
|
86
|
+
created_at=cls.fleet_created_at,
|
|
87
|
+
is_free_move=False,
|
|
88
|
+
)
|
|
89
|
+
cls.fleet.save()
|
|
90
|
+
|
|
91
|
+
cls.fleet_id = 12345
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
class TestAjaxDashboardView(FleetfinderTestViews):
|
|
95
|
+
"""
|
|
96
|
+
Test the ajax_dashboard view in the Fleet Finder application.
|
|
97
|
+
This view is responsible for rendering the dashboard with fleet data.
|
|
98
|
+
It should return a JSON response containing fleet information,
|
|
99
|
+
including fleet names, commanders, and group associations.
|
|
100
|
+
If no fleets are available, it should return an empty list.
|
|
101
|
+
It should also filter fleets based on the user's groups.
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
@patch("fleetfinder.views.get_all_characters_from_user")
|
|
105
|
+
def test_renders_dashboard_with_fleet_data_with_basic_access(
|
|
106
|
+
self, mock_get_characters
|
|
107
|
+
):
|
|
108
|
+
"""
|
|
109
|
+
Test that the ajax_dashboard view renders the dashboard with fleet data
|
|
110
|
+
when the user has basic access permissions.
|
|
111
|
+
|
|
112
|
+
:param mock_get_characters:
|
|
113
|
+
:type mock_get_characters:
|
|
114
|
+
:return:
|
|
115
|
+
:rtype:
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
mock_get_characters.return_value = [
|
|
119
|
+
self.user_with_manage_perms.profile.main_character
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
fleet = self.fleet
|
|
123
|
+
fleet.groups.set([])
|
|
124
|
+
|
|
125
|
+
self.client.force_login(self.user_with_basic_acces_perms)
|
|
126
|
+
url = reverse("fleetfinder:ajax_dashboard")
|
|
127
|
+
join_url = reverse("fleetfinder:join_fleet", args=[self.fleet_id])
|
|
128
|
+
response = self.client.get(url)
|
|
129
|
+
|
|
130
|
+
expected_response = [
|
|
131
|
+
{
|
|
132
|
+
"fleet_commander": {
|
|
133
|
+
"html": '<img class="rounded eve-character-portrait" src="https://images.evetech.net/characters/1000/portrait?size=32" alt="Jean Luc Picard" loading="lazy">Jean Luc Picard',
|
|
134
|
+
"sort": "Jean Luc Picard",
|
|
135
|
+
},
|
|
136
|
+
"fleet_name": "Starfleet",
|
|
137
|
+
"created_at": dt_to_iso(self.fleet_created_at),
|
|
138
|
+
"actions": f'<a href="{join_url}" class="btn btn-sm btn-success ms-1" data-bs-tooltip="aa-fleetfinder" title="Join fleet"><i class="fa-solid fa-right-to-bracket"></i></a>',
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
143
|
+
self.assertIn("Starfleet", response.json()[0]["fleet_name"])
|
|
144
|
+
self.assertIn("Jean Luc Picard", response.json()[0]["fleet_commander"]["html"])
|
|
145
|
+
self.assertEqual(response.json(), expected_response)
|
|
146
|
+
|
|
147
|
+
@patch("fleetfinder.views.get_all_characters_from_user")
|
|
148
|
+
def test_renders_dashboard_with_fleet_data_with_manage_access(
|
|
149
|
+
self, mock_get_characters
|
|
150
|
+
):
|
|
151
|
+
"""
|
|
152
|
+
Test that the ajax_dashboard view renders the dashboard with fleet data
|
|
153
|
+
when the user has manage access permissions.
|
|
154
|
+
|
|
155
|
+
:param mock_get_characters:
|
|
156
|
+
:type mock_get_characters:
|
|
157
|
+
:return:
|
|
158
|
+
:rtype:
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
mock_get_characters.return_value = [
|
|
162
|
+
self.user_with_manage_perms.profile.main_character
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
fleet = self.fleet
|
|
166
|
+
fleet.groups.set([])
|
|
167
|
+
|
|
168
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
169
|
+
url = reverse("fleetfinder:ajax_dashboard")
|
|
170
|
+
join_url = reverse("fleetfinder:join_fleet", args=[self.fleet_id])
|
|
171
|
+
details_url = reverse("fleetfinder:fleet_details", args=[self.fleet_id])
|
|
172
|
+
edit_url = reverse("fleetfinder:edit_fleet", args=[self.fleet_id])
|
|
173
|
+
response = self.client.get(url)
|
|
174
|
+
|
|
175
|
+
expected_response = [
|
|
176
|
+
{
|
|
177
|
+
"fleet_commander": {
|
|
178
|
+
"html": '<img class="rounded eve-character-portrait" src="https://images.evetech.net/characters/1000/portrait?size=32" alt="Jean Luc Picard" loading="lazy">Jean Luc Picard',
|
|
179
|
+
"sort": "Jean Luc Picard",
|
|
180
|
+
},
|
|
181
|
+
"fleet_name": "Starfleet",
|
|
182
|
+
"created_at": dt_to_iso(self.fleet_created_at),
|
|
183
|
+
"actions": (
|
|
184
|
+
f'<a href="{join_url}" class="btn btn-sm btn-success ms-1" data-bs-tooltip="aa-fleetfinder" title="Join fleet"><i class="fa-solid fa-right-to-bracket"></i></a>'
|
|
185
|
+
f'<a href="{details_url}" class="btn btn-sm btn-info ms-1" data-bs-tooltip="aa-fleetfinder" title="View fleet details"><i class="fa-solid fa-eye"></i></a>'
|
|
186
|
+
f'<a href="{edit_url}" class="btn btn-sm btn-warning ms-1" data-bs-tooltip="aa-fleetfinder" title="Edit fleet advert"><i class="fa-solid fa-pen-to-square"></i></a>'
|
|
187
|
+
),
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
|
|
191
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
192
|
+
self.assertIn("Starfleet", response.json()[0]["fleet_name"])
|
|
193
|
+
self.assertIn("Jean Luc Picard", response.json()[0]["fleet_commander"]["html"])
|
|
194
|
+
self.assertEqual(response.json(), expected_response)
|
|
195
|
+
|
|
196
|
+
@patch("fleetfinder.views.get_all_characters_from_user")
|
|
197
|
+
def test_returns_empty_data_when_no_fleets_available(self, mock_get_characters):
|
|
198
|
+
"""
|
|
199
|
+
Test that the ajax_dashboard view returns an empty list when no fleets are available.
|
|
200
|
+
|
|
201
|
+
:param mock_get_characters:
|
|
202
|
+
:type mock_get_characters:
|
|
203
|
+
:return:
|
|
204
|
+
:rtype:
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
mock_get_characters.return_value = [
|
|
208
|
+
self.user_with_manage_perms.profile.main_character
|
|
209
|
+
]
|
|
210
|
+
|
|
211
|
+
Fleet.objects.all().delete() # Remove all fleets
|
|
212
|
+
|
|
213
|
+
self.client.force_login(self.user_with_basic_acces_perms)
|
|
214
|
+
url = reverse("fleetfinder:ajax_dashboard")
|
|
215
|
+
response = self.client.get(url)
|
|
216
|
+
|
|
217
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
218
|
+
self.assertEqual(response.json(), [])
|
|
219
|
+
|
|
220
|
+
@patch("fleetfinder.views.get_all_characters_from_user")
|
|
221
|
+
def test_filters_fleets_by_user_groups(self, mock_get_characters):
|
|
222
|
+
"""
|
|
223
|
+
Test that the ajax_dashboard view filters fleets based on the user's groups.
|
|
224
|
+
|
|
225
|
+
:param mock_get_characters:
|
|
226
|
+
:type mock_get_characters:
|
|
227
|
+
:return:
|
|
228
|
+
:rtype:
|
|
229
|
+
"""
|
|
230
|
+
|
|
231
|
+
mock_get_characters.return_value = [
|
|
232
|
+
self.user_with_manage_perms.profile.main_character
|
|
233
|
+
]
|
|
234
|
+
|
|
235
|
+
group_obj = Group.objects.create(name="Starfleet Officers")
|
|
236
|
+
auth_group, _ = AuthGroup.objects.get_or_create(group=group_obj)
|
|
237
|
+
fleet = self.fleet
|
|
238
|
+
fleet.groups.set([auth_group])
|
|
239
|
+
|
|
240
|
+
self.client.force_login(self.user_with_basic_acces_perms)
|
|
241
|
+
self.user_with_basic_acces_perms.groups.add(group_obj)
|
|
242
|
+
url = reverse("fleetfinder:ajax_dashboard")
|
|
243
|
+
response = self.client.get(url)
|
|
244
|
+
|
|
245
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
246
|
+
self.assertIn("Starfleet", response.json()[0]["fleet_name"])
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
class TestFleetEditView(FleetfinderTestViews):
|
|
250
|
+
"""
|
|
251
|
+
Test the edit_fleet view in the Fleet Finder application.
|
|
252
|
+
This view is responsible for editing fleet details.
|
|
253
|
+
"""
|
|
254
|
+
|
|
255
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
256
|
+
@patch("fleetfinder.views.AuthGroup.objects.filter")
|
|
257
|
+
def test_renders_edit_fleet_template_with_correct_context(
|
|
258
|
+
self, mock_filter_groups, mock_get_fleet
|
|
259
|
+
):
|
|
260
|
+
"""
|
|
261
|
+
Test that the edit_fleet view renders the correct template and context.
|
|
262
|
+
|
|
263
|
+
:param mock_filter_groups:
|
|
264
|
+
:type mock_filter_groups:
|
|
265
|
+
:param mock_get_fleet:
|
|
266
|
+
:type mock_get_fleet:
|
|
267
|
+
:return:
|
|
268
|
+
:rtype:
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
mock_get_fleet.return_value = self.fleet
|
|
272
|
+
group1 = Mock(spec=AuthGroup)
|
|
273
|
+
group1.name = "Group1"
|
|
274
|
+
group2 = Mock(spec=AuthGroup)
|
|
275
|
+
group2.name = "Group2"
|
|
276
|
+
mock_filter_groups.return_value = [group1, group2]
|
|
277
|
+
|
|
278
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
279
|
+
url = reverse("fleetfinder:edit_fleet", args=[self.fleet_id])
|
|
280
|
+
response = self.client.get(url)
|
|
281
|
+
|
|
282
|
+
self.assertTemplateUsed(response, "fleetfinder/edit-fleet.html")
|
|
283
|
+
self.assertEqual(response.context["fleet"].name, "Starfleet")
|
|
284
|
+
self.assertEqual(response.context["character_id"], 1000)
|
|
285
|
+
self.assertEqual(len(response.context["auth_groups"]), 2)
|
|
286
|
+
|
|
287
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
288
|
+
def test_redirects_to_dashboard_if_fleet_does_not_exist(self, mock_get_fleet):
|
|
289
|
+
"""
|
|
290
|
+
Test that the edit_fleet view redirects to the dashboard if the fleet does not exist.
|
|
291
|
+
|
|
292
|
+
:param mock_get_fleet:
|
|
293
|
+
:type mock_get_fleet:
|
|
294
|
+
:return:
|
|
295
|
+
:rtype:
|
|
296
|
+
"""
|
|
297
|
+
|
|
298
|
+
mock_get_fleet.side_effect = Fleet.DoesNotExist
|
|
299
|
+
|
|
300
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
301
|
+
url = reverse("fleetfinder:edit_fleet", args=[99999])
|
|
302
|
+
response = self.client.get(url)
|
|
303
|
+
|
|
304
|
+
self.assertEqual(response.status_code, HTTPStatus.FOUND)
|
|
305
|
+
self.assertRedirects(response, reverse("fleetfinder:dashboard"))
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
class TestJoinFleetView(FleetfinderTestViews):
|
|
309
|
+
"""
|
|
310
|
+
Test the join_fleet view in the Fleet Finder application.
|
|
311
|
+
This view is responsible for allowing users to join a fleet.
|
|
312
|
+
It should redirect to the fleet details page after joining.
|
|
313
|
+
If the fleet does not exist, it should return a 404 status code.
|
|
314
|
+
"""
|
|
315
|
+
|
|
316
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
317
|
+
def test_join_fleet_redirects_to_dashboard(self, mock_get_fleet):
|
|
318
|
+
"""
|
|
319
|
+
Test that the join_fleet view redirects to the dashboard after joining a fleet.
|
|
320
|
+
|
|
321
|
+
:param mock_get_fleet:
|
|
322
|
+
:type mock_get_fleet:
|
|
323
|
+
:return:
|
|
324
|
+
:rtype:
|
|
325
|
+
"""
|
|
326
|
+
|
|
327
|
+
mock_get_fleet.return_value = Fleet(fleet_id=self.fleet_id)
|
|
328
|
+
|
|
329
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
330
|
+
url = reverse("fleetfinder:join_fleet", args=[self.fleet_id])
|
|
331
|
+
response = self.client.get(url)
|
|
332
|
+
|
|
333
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
334
|
+
self.assertTemplateUsed(response, "fleetfinder/join-fleet.html")
|
|
335
|
+
|
|
336
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
337
|
+
def test_join_fleet_handles_non_existent_fleet(self, mock_get_fleet):
|
|
338
|
+
"""
|
|
339
|
+
Test that the join_fleet view handles a non-existent fleet correctly.
|
|
340
|
+
|
|
341
|
+
:param mock_get_fleet:
|
|
342
|
+
:type mock_get_fleet:
|
|
343
|
+
:return:
|
|
344
|
+
:rtype:
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
mock_get_fleet.side_effect = Fleet.DoesNotExist
|
|
348
|
+
|
|
349
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
350
|
+
url = reverse("fleetfinder:join_fleet", args=[123456]) # Non-existent fleet ID
|
|
351
|
+
response = self.client.get(url)
|
|
352
|
+
|
|
353
|
+
self.assertEqual(response.status_code, HTTPStatus.FOUND)
|
|
354
|
+
self.assertRedirects(response, reverse("fleetfinder:dashboard"))
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class TestFleetDetailsView(FleetfinderTestViews):
|
|
358
|
+
"""
|
|
359
|
+
Test the fleet_details view in the Fleet Finder application.
|
|
360
|
+
This view is responsible for rendering the fleet details page.
|
|
361
|
+
It should render the correct template and require the user to have
|
|
362
|
+
the 'fleetfinder.manage_fleets' permission to access it.
|
|
363
|
+
If the fleet does not exist, it should return a 404 status code.
|
|
364
|
+
"""
|
|
365
|
+
|
|
366
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
367
|
+
def test_fleet_details_renders_correct_template(self, mock_get_fleet):
|
|
368
|
+
"""
|
|
369
|
+
Test that the fleet_details view renders the correct template.
|
|
370
|
+
|
|
371
|
+
:param mock_get_fleet:
|
|
372
|
+
:type mock_get_fleet:
|
|
373
|
+
:return:
|
|
374
|
+
:rtype:
|
|
375
|
+
"""
|
|
376
|
+
|
|
377
|
+
mock_get_fleet.return_value = Fleet(fleet_id=self.fleet_id)
|
|
378
|
+
|
|
379
|
+
self.client.force_login(self.user_with_manage_perms)
|
|
380
|
+
url = reverse("fleetfinder:fleet_details", args=[self.fleet_id])
|
|
381
|
+
response = self.client.get(url)
|
|
382
|
+
|
|
383
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
384
|
+
self.assertTemplateUsed(response, "fleetfinder/fleet-details.html")
|
|
385
|
+
|
|
386
|
+
@patch("fleetfinder.views.Fleet.objects.get")
|
|
387
|
+
def test_fleet_details_requires_manage_permission(self, mock_get_fleet):
|
|
388
|
+
"""
|
|
389
|
+
Test that the fleet_details view requires the user to have the 'fleetfinder.manage_fleets' permission.
|
|
390
|
+
|
|
391
|
+
:param mock_get_fleet:
|
|
392
|
+
:type mock_get_fleet:
|
|
393
|
+
:return:
|
|
394
|
+
:rtype:
|
|
395
|
+
"""
|
|
396
|
+
|
|
397
|
+
mock_get_fleet.return_value = Fleet(fleet_id=self.fleet_id)
|
|
398
|
+
|
|
399
|
+
self.client.force_login(self.user_with_basic_acces_perms)
|
|
400
|
+
url = reverse("fleetfinder:fleet_details", args=[self.fleet_id])
|
|
401
|
+
response = self.client.get(url)
|
|
402
|
+
|
|
403
|
+
self.assertEqual(response.status_code, HTTPStatus.FOUND)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
class TestAjaxFleetDetailsView(FleetfinderTestViews):
|
|
407
|
+
"""
|
|
408
|
+
Test the ajax_fleet_details view in the Fleet Finder application.
|
|
409
|
+
This view is responsible for returning fleet details in JSON format.
|
|
410
|
+
It should return the fleet members and their ship types, or an empty list if the fleet is empty.
|
|
411
|
+
"""
|
|
412
|
+
|
|
413
|
+
@patch("fleetfinder.views.get_fleet_composition")
|
|
414
|
+
def test_returns_correct_fleet_details(self, mock_get_fleet_composition):
|
|
415
|
+
"""
|
|
416
|
+
Test that the ajax_fleet_details view returns the correct fleet details.
|
|
417
|
+
|
|
418
|
+
:param mock_get_fleet_composition:
|
|
419
|
+
:type mock_get_fleet_composition:
|
|
420
|
+
:return:
|
|
421
|
+
:rtype:
|
|
422
|
+
"""
|
|
423
|
+
|
|
424
|
+
mock_get_fleet_composition.return_value = SimpleNamespace(
|
|
425
|
+
fleet=[{"name": "Pilot1"}, {"name": "Pilot2"}, {"name": "Pilot3"}],
|
|
426
|
+
aggregate={"Frigate": 2, "Cruiser": 1},
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
self.client.force_login(user=self.user_with_manage_perms)
|
|
430
|
+
|
|
431
|
+
url = reverse("fleetfinder:ajax_fleet_details", args=[self.fleet_id])
|
|
432
|
+
response = self.client.get(url)
|
|
433
|
+
|
|
434
|
+
expected_fleet_composition = {
|
|
435
|
+
"fleet_member": [
|
|
436
|
+
{"name": "Pilot1"},
|
|
437
|
+
{"name": "Pilot2"},
|
|
438
|
+
{"name": "Pilot3"},
|
|
439
|
+
],
|
|
440
|
+
"fleet_composition": [
|
|
441
|
+
{"ship_type_name": "Frigate", "number": 2},
|
|
442
|
+
{"ship_type_name": "Cruiser", "number": 1},
|
|
443
|
+
],
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
447
|
+
self.assertEqual(json.loads(response.content), expected_fleet_composition)
|
|
448
|
+
|
|
449
|
+
@patch("fleetfinder.views.get_fleet_composition")
|
|
450
|
+
def test_handles_empty_fleet(self, mock_get_fleet_composition):
|
|
451
|
+
"""
|
|
452
|
+
Test that the ajax_fleet_details view handles an empty fleet correctly.
|
|
453
|
+
|
|
454
|
+
:param mock_get_fleet_composition:
|
|
455
|
+
:type mock_get_fleet_composition:
|
|
456
|
+
:return:
|
|
457
|
+
:rtype:
|
|
458
|
+
"""
|
|
459
|
+
|
|
460
|
+
mock_get_fleet_composition.return_value = SimpleNamespace(
|
|
461
|
+
fleet=[],
|
|
462
|
+
aggregate={},
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
self.client.force_login(user=self.user_with_manage_perms)
|
|
466
|
+
|
|
467
|
+
url = reverse("fleetfinder:ajax_fleet_details", args=[self.fleet_id])
|
|
468
|
+
response = self.client.get(url)
|
|
469
|
+
|
|
470
|
+
expected_fleet_composition = {"fleet_member": [], "fleet_composition": []}
|
|
471
|
+
|
|
472
|
+
self.assertEqual(response.status_code, HTTPStatus.OK)
|
|
473
|
+
self.assertEqual(json.loads(response.content), expected_fleet_composition)
|
fleetfinder/urls.py
CHANGED