Skip to content

Commit d449e9b

Browse files
stktyaginemesifier
andauthored
[fix] Fixed ordering of credential list in REST API #1040
Fixes #1040 Co-authored-by: Federico Capoano <[email protected]>
1 parent 85eee35 commit d449e9b

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-3
lines changed

openwisp_controller/config/tests/test_api.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from datetime import timedelta
2+
13
from django.contrib.auth.models import Permission
24
from django.test import TestCase
35
from django.test.client import BOUNDARY, MULTIPART_CONTENT, encode_multipart
46
from django.test.testcases import TransactionTestCase
57
from django.urls import reverse
8+
from django.utils import timezone
69
from swapper import load_model
710

811
from openwisp_controller.config.api.serializers import BaseConfigSerializer
@@ -244,11 +247,31 @@ def test_device_create_with_devicegroup(self):
244247
self.assertEqual(response.data["group"], device_group.pk)
245248

246249
def test_device_list_api(self):
247-
self._create_device()
250+
device = self._create_device()
248251
path = reverse("config_api:device_list")
249252
with self.assertNumQueries(4):
250253
r = self.client.get(path)
251254
self.assertEqual(r.status_code, 200)
255+
with self.subTest("device list should show most recent first"):
256+
org = self._get_org()
257+
recent = self._create_device(
258+
name="recent-device-2",
259+
mac_address="00:00:00:00:00:02",
260+
organization=org,
261+
)
262+
oldest = self._create_device(
263+
name="oldest-device",
264+
mac_address="00:00:00:00:00:03",
265+
organization=org,
266+
)
267+
oldest.created = timezone.now() - timedelta(days=2)
268+
oldest.save(update_fields=["created"])
269+
path = reverse("config_api:device_list")
270+
response = self.client.get(path)
271+
self.assertEqual(response.status_code, 200)
272+
names = [d["name"] for d in response.data["results"]]
273+
expected = [recent.name, device.name, oldest.name]
274+
self.assertEqual(names, expected)
252275

253276
def test_device_list_api_filter(self):
254277
org1 = self._create_org()
@@ -1028,7 +1051,7 @@ def test_devicegroup_create_api(self):
10281051
self.assertEqual(response.data["templates"], [template.pk])
10291052

10301053
def test_devicegroup_list_api(self):
1031-
self._create_device_group()
1054+
dg = self._create_device_group()
10321055
path = reverse("config_api:devicegroup_list")
10331056
with self.subTest("assert number of queries"):
10341057
with self.assertNumQueries(5):
@@ -1044,6 +1067,16 @@ def test_devicegroup_list_api(self):
10441067
self.assertNotContains(
10451068
r, f'<option value="{t2.id}">{t2.name}</option>', html=True
10461069
)
1070+
with self.subTest("device group list should show most recent first"):
1071+
dg_recent = self._create_device_group(name="Recent")
1072+
dg_old = self._create_device_group(name="Oldest")
1073+
old_date = timezone.now() - timedelta(days=2)
1074+
DeviceGroup.objects.filter(pk=dg_old.pk).update(created=old_date)
1075+
response = self.client.get(path)
1076+
self.assertEqual(response.status_code, 200)
1077+
returned_ids = [group["id"] for group in response.data["results"]]
1078+
expected_order = [str(dg_recent.pk), str(dg.pk), str(dg_old.pk)]
1079+
self.assertEqual(returned_ids, expected_order)
10471080

10481081
def test_devicegroup_list_api_filter(self):
10491082
org1 = self._create_org()

openwisp_controller/connection/api/views.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ def get_parent_queryset(self):
5353
)
5454

5555
def get_queryset(self):
56-
return super().get_queryset().filter(device_id=self.kwargs["device_id"])
56+
return (
57+
super()
58+
.get_queryset()
59+
.filter(device_id=self.kwargs["device_id"])
60+
.order_by("-created")
61+
)
5762

5863
def get_serializer_context(self):
5964
context = super().get_serializer_context()

openwisp_controller/connection/tests/test_api.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.contrib.auth.models import Permission
66
from django.test import TestCase
77
from django.urls import reverse
8+
from django.utils.timezone import now, timedelta
89
from packaging.version import parse as parse_version
910
from rest_framework import VERSION as REST_FRAMEWORK_VERSION
1011
from rest_framework.exceptions import ErrorDetail
@@ -125,6 +126,13 @@ def test_command_list_api(self):
125126
self.assertIn("device", command_obj)
126127
self.assertIn("connection", command_obj)
127128

129+
with self.subTest("Test results ordering, recent first"):
130+
response = self.client.get(url)
131+
self.assertEqual(response.status_code, 200)
132+
created_list = [cmd["created"] for cmd in response.data["results"]]
133+
sorted_created_list = sorted(created_list, reverse=True)
134+
self.assertEqual(created_list, sorted_created_list)
135+
128136
def test_command_create_api(self):
129137
def test_command_attributes(self, payload):
130138
self.assertEqual(command_qs.count(), 1)
@@ -392,6 +400,16 @@ def test_get_credentials_list(self):
392400
with self.assertNumQueries(4):
393401
response = self.client.get(path)
394402
self.assertEqual(response.status_code, 200)
403+
with self.subTest("Check ordering of credentials"):
404+
cred_old = self._create_credentials(name="Old Credential")
405+
cred_old.created = now() - timedelta(days=1)
406+
cred_old.save()
407+
self._create_credentials(name="Newest Credential")
408+
response = self.client.get(path)
409+
self.assertEqual(response.status_code, 200)
410+
created_list = [cred["created"] for cred in response.data["results"]]
411+
sorted_created = sorted(created_list, reverse=True)
412+
self.assertEqual(created_list, sorted_created)
395413

396414
def test_filter_credentials_list(self):
397415
cred_1 = self._create_credentials(name="Credential One")
@@ -483,6 +501,19 @@ def test_get_deviceconnection_list(self):
483501
response = self.client.get(path)
484502
self.assertEqual(response.status_code, 200)
485503
self.assertEqual(response.data["count"], 0)
504+
with self.subTest("Check ordering of device connections"):
505+
self._create_config(device=d1)
506+
creds = [self._create_credentials(name=f"Cred {i}") for i in range(3)]
507+
creds[0].created = now() - timedelta(days=1)
508+
creds[0].save()
509+
for cred in creds:
510+
DeviceConnection.objects.create(device=d1, credentials=cred)
511+
response = self.client.get(path)
512+
print(response.data)
513+
self.assertEqual(response.status_code, 200)
514+
created_list = [conn["created"] for conn in response.data["results"]]
515+
sorted_created = sorted(created_list, reverse=True)
516+
self.assertEqual(created_list, sorted_created)
486517

487518
def test_post_deviceconnection_list(self):
488519
d1 = self._create_device()

0 commit comments

Comments
 (0)