Skip to content

Commit 3a420c0

Browse files
committed
♻️(backend) document list order by updated_at desc
Document list is now ordered by updated_at in descending order. Test cases were improved as well.
1 parent b5a67df commit 3a420c0

File tree

3 files changed

+77
-130
lines changed

3 files changed

+77
-130
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ and this project adheres to
88

99
## [Unreleased]
1010

11+
## Changed
12+
13+
- ♻️ Change ordering docs datagrid #195
14+
15+
1116
## [1.2.0] - 2024-08-06
1217

1318
## Added

src/backend/core/api/viewsets.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ class DocumentViewSet(
310310
access_model_class = models.DocumentAccess
311311
resource_field_name = "document"
312312
queryset = models.Document.objects.all()
313+
ordering = ["-updated_at"]
313314

314315
def perform_create(self, serializer):
315316
"""

src/backend/core/tests/documents/test_api_documents_list.py

Lines changed: 71 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -169,87 +169,26 @@ def test_api_documents_list_authenticated_distinct():
169169
assert content["results"][0]["id"] == str(document.id)
170170

171171

172-
def test_api_documents_order_created_at_desc():
172+
def test_api_documents_order_updated_at_desc_default():
173173
"""
174-
Test that the endpoint GET documents is sorted in 'created_at' descending order by default.
175-
"""
176-
user = factories.UserFactory()
177-
client = APIClient()
178-
client.force_login(user)
179-
180-
documents_created = [
181-
document.created_at.isoformat().replace("+00:00", "Z")
182-
for document in factories.DocumentFactory.create_batch(5, is_public=True)
183-
]
184-
185-
documents_created.sort(reverse=True)
186-
187-
response = client.get(
188-
"/api/v1.0/documents/",
189-
)
190-
191-
assert response.status_code == 200
192-
193-
response_data = response.json()
194-
response_document_created = [
195-
document["created_at"] for document in response_data["results"]
196-
]
197-
198-
assert (
199-
response_document_created == documents_created
200-
), "created_at values are not sorted from newest to oldest"
201-
202-
203-
def test_api_documents_order_created_at_asc():
204-
"""
205-
Test that the 'created_at' field is sorted in ascending order
206-
when the 'ordering' query parameter is set.
207-
"""
208-
user = factories.UserFactory()
209-
client = APIClient()
210-
client.force_login(user)
211-
212-
documents_created = [
213-
document.created_at.isoformat().replace("+00:00", "Z")
214-
for document in factories.DocumentFactory.create_batch(5, is_public=True)
215-
]
216-
217-
documents_created.sort()
218-
219-
response = client.get(
220-
"/api/v1.0/documents/?ordering=created_at",
221-
)
222-
223-
assert response.status_code == 200
224-
225-
response_data = response.json()
226-
response_document_created = [
227-
document["created_at"] for document in response_data["results"]
228-
]
229-
230-
assert (
231-
response_document_created == documents_created
232-
), "created_at values are not sorted from oldest to newest"
233-
234-
235-
def test_api_documents_order_updated_at_desc():
236-
"""
237-
Test that the 'updated_at' field is sorted in descending order
238-
when the 'ordering' query parameter is set.
174+
Test that the endpoint GET documents is sorted in 'updated_at' descending order by default.
239175
"""
240176
user = factories.UserFactory()
241177
client = APIClient()
242178
client.force_login(user)
243179

180+
# Updated at next year to ensure the order is correct
244181
documents_updated = [
245182
document.updated_at.isoformat().replace("+00:00", "Z")
246-
for document in factories.DocumentFactory.create_batch(5, is_public=True)
183+
for document in factories.DocumentFactory.create_batch(
184+
5, is_public=True, updated_at=fake.date_time_this_year(before_now=False)
185+
)
247186
]
248187

249188
documents_updated.sort(reverse=True)
250189

251190
response = APIClient().get(
252-
"/api/v1.0/documents/?ordering=-updated_at",
191+
"/api/v1.0/documents/",
253192
)
254193
assert response.status_code == 200
255194

@@ -264,97 +203,99 @@ def test_api_documents_order_updated_at_desc():
264203
), "updated_at values are not sorted from newest to oldest"
265204

266205

267-
def test_api_documents_order_updated_at_asc():
268-
"""
269-
Test that the 'updated_at' field is sorted in ascending order
270-
when the 'ordering' query parameter is set.
271-
"""
272-
user = factories.UserFactory()
273-
client = APIClient()
274-
client.force_login(user)
275-
276-
documents_updated = [
277-
document.updated_at.isoformat().replace("+00:00", "Z")
278-
for document in factories.DocumentFactory.create_batch(5, is_public=True)
279-
]
280-
281-
documents_updated.sort()
282-
283-
response = APIClient().get(
284-
"/api/v1.0/documents/?ordering=updated_at",
285-
)
286-
assert response.status_code == 200
287-
288-
response_data = response.json()
289-
290-
response_document_updated = [
291-
document["updated_at"] for document in response_data["results"]
292-
]
293-
294-
assert (
295-
response_document_updated == documents_updated
296-
), "updated_at values are not sorted from oldest to newest"
297-
298-
299-
def test_api_documents_order_title_desc():
206+
@pytest.mark.parametrize(
207+
"ordering_field, factory_field",
208+
[
209+
("-created_at", "created_at"),
210+
("-updated_at", "updated_at"),
211+
("-title", "title"),
212+
],
213+
)
214+
def test_api_documents_ordering_desc(ordering_field, factory_field):
300215
"""
301-
Test that the 'title' field is sorted in descending order
216+
Test that the specified field is sorted in descending order
302217
when the 'ordering' query parameter is set.
303218
"""
304219
user = factories.UserFactory()
305220
client = APIClient()
306221
client.force_login(user)
307222

308-
documents_title = [
309-
factories.DocumentFactory(is_public=True, title=fake.sentence(nb_words=4)).title
310-
for _ in range(5)
311-
]
312-
313-
documents_title.sort(reverse=True)
223+
if factory_field == "title":
224+
documents_field_values = [
225+
factories.DocumentFactory(
226+
is_public=True, title=fake.sentence(nb_words=4)
227+
).title
228+
for _ in range(5)
229+
]
230+
else:
231+
documents_field_values = [
232+
getattr(document, factory_field).isoformat().replace("+00:00", "Z")
233+
for document in factories.DocumentFactory.create_batch(5, is_public=True)
234+
]
235+
236+
documents_field_values.sort(reverse=True)
314237

315-
response = APIClient().get(
316-
"/api/v1.0/documents/?ordering=-title",
238+
response = client.get(
239+
f"/api/v1.0/documents/?ordering={ordering_field}"
240+
if ordering_field != "-created_at"
241+
else "/api/v1.0/documents/",
317242
)
318243
assert response.status_code == 200
319244

320245
response_data = response.json()
321246

322-
response_documents_title = [
323-
document["title"] for document in response_data["results"]
247+
response_documents_field_values = [
248+
document[factory_field] for document in response_data["results"]
324249
]
325250

326251
assert (
327-
response_documents_title == documents_title
328-
), "title values are not sorted descending"
329-
330-
331-
def test_api_documents_order_title_asc():
252+
response_documents_field_values == documents_field_values
253+
), f"{factory_field} values are not sorted as expected"
254+
255+
256+
@pytest.mark.parametrize(
257+
"field",
258+
[
259+
("updated_at"),
260+
("title"),
261+
("created_at"),
262+
],
263+
)
264+
def test_api_documents_ordering_asc(field):
332265
"""
333-
Test that the 'title' field is sorted in ascending order
266+
Test that the specified field is sorted in ascending order
334267
when the 'ordering' query parameter is set.
335268
"""
336269
user = factories.UserFactory()
337270
client = APIClient()
338271
client.force_login(user)
339272

340-
documents_title = [
341-
factories.DocumentFactory(is_public=True, title=fake.sentence(nb_words=4)).title
342-
for _ in range(5)
343-
]
344-
345-
documents_title.sort()
273+
if field == "title":
274+
documents_field_values = [
275+
factories.DocumentFactory(
276+
is_public=True, title=fake.sentence(nb_words=4)
277+
).title
278+
for _ in range(5)
279+
]
280+
else:
281+
documents_field_values = [
282+
getattr(document, field).isoformat().replace("+00:00", "Z")
283+
for document in factories.DocumentFactory.create_batch(5, is_public=True)
284+
]
285+
286+
documents_field_values.sort()
346287

347-
response = APIClient().get(
348-
"/api/v1.0/documents/?ordering=title",
288+
response = client.get(
289+
f"/api/v1.0/documents/?ordering={field}",
349290
)
350291
assert response.status_code == 200
351292

352293
response_data = response.json()
353294

354-
response_documents_title = [
355-
document["title"] for document in response_data["results"]
295+
response_documents_field_values = [
296+
document[field] for document in response_data["results"]
356297
]
357298

358299
assert (
359-
response_documents_title == documents_title
360-
), "title values are not sorted ascending"
300+
response_documents_field_values == documents_field_values
301+
), f"{field} values are not sorted as expected"

0 commit comments

Comments
 (0)