Skip to content

Commit 7a0ed0a

Browse files
committed
align ApiRiskAcceptanceFilter date params with API conventions
• use DateRangeFilter for created and updated • add explicit DateTimeFilter comparisons • updated risk acceptance API tests to assert new query params and deterministic result inclusion
1 parent 8882c61 commit 7a0ed0a

2 files changed

Lines changed: 64 additions & 0 deletions

File tree

dojo/filters.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3130,6 +3130,10 @@ class Meta:
31303130
class ApiRiskAcceptanceFilter(DojoFilter):
31313131
created = DateRangeFilter()
31323132
updated = DateRangeFilter()
3133+
created_before = DateTimeFilter(field_name="created", lookup_expr="lt")
3134+
created_after = DateTimeFilter(field_name="created", lookup_expr="gt")
3135+
updated_before = DateTimeFilter(field_name="updated", lookup_expr="lt")
3136+
updated_after = DateTimeFilter(field_name="updated", lookup_expr="gt")
31333137

31343138
o = OrderingFilter(
31353139
# tuple-mapping retains order

unittests/test_risk_acceptance_api.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,19 @@ def setUp(self):
176176
self.client.credentials(HTTP_AUTHORIZATION="Token " + self.token.key)
177177
self.url = reverse("risk_acceptance-list")
178178

179+
# Helper method to create a risk acceptance for testing filters
180+
def create_risk_acceptance(self):
181+
risk_acceptance = Risk_Acceptance.objects.create(
182+
name="Filter Test RA",
183+
recommendation="A",
184+
decision="A",
185+
accepted_by="Test User",
186+
owner=self.user,
187+
)
188+
risk_acceptance.accepted_findings.add(self.finding_a1)
189+
self.engagement_a.risk_acceptance.add(risk_acceptance)
190+
return risk_acceptance
191+
179192
def test_create_risk_acceptance_links_to_engagement(self):
180193
"""Test that risk acceptance created via API appears in engagement.risk_acceptance"""
181194
payload = {
@@ -358,3 +371,50 @@ def test_update_risk_acceptance_add_cross_engagement_fails(self):
358371
response = self.client.put(f"{self.url}{ra.id}/", payload, format="json")
359372
self.assertEqual(403, response.status_code, response.content)
360373
self.assertIn("multiple engagements", str(response.data))
374+
375+
def test_risk_acceptance_created_filter(self):
376+
# 1. Create a baseline Risk Acceptance using the existing test setup
377+
risk_acceptance = self.create_risk_acceptance()
378+
379+
# 2. Manually backdate the created date to test ranges
380+
past_date = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=10)
381+
risk_acceptance.created = past_date
382+
risk_acceptance.save()
383+
384+
# 3. Test `created_before` (Less than / Before)
385+
# Should return the risk acceptance because it was created 10 days ago
386+
future_date = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
387+
response = self.client.get(reverse('risk_acceptance-list') + f'?created_before={future_date}')
388+
self.assertEqual(response.status_code, 200)
389+
result_ids = {item["id"] for item in response.json()["results"]}
390+
self.assertIn(risk_acceptance.id, result_ids)
391+
392+
# 4. Test `created_after` (Greater than / After)
393+
# Should NOT return the risk acceptance because it is not newer than today
394+
response = self.client.get(reverse('risk_acceptance-list') + f'?created_after={future_date}')
395+
self.assertEqual(response.status_code, 200)
396+
result_ids = {item["id"] for item in response.json()["results"]}
397+
self.assertNotIn(risk_acceptance.id, result_ids)
398+
399+
400+
def test_risk_acceptance_updated_filter(self):
401+
risk_acceptance = self.create_risk_acceptance()
402+
403+
# Manually backdate the updated date
404+
past_date = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(days=10)
405+
# We use .update() to bypass the auto_now=True behavior on the updated field
406+
type(risk_acceptance).objects.filter(pk=risk_acceptance.id).update(updated=past_date)
407+
408+
future_date = datetime.datetime.now(datetime.timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
409+
410+
# Test updated_before
411+
response = self.client.get(reverse('risk_acceptance-list') + f'?updated_before={future_date}')
412+
self.assertEqual(response.status_code, 200)
413+
result_ids = {item["id"] for item in response.json()["results"]}
414+
self.assertIn(risk_acceptance.id, result_ids)
415+
416+
# Test updated_after
417+
response = self.client.get(reverse('risk_acceptance-list') + f'?updated_after={future_date}')
418+
self.assertEqual(response.status_code, 200)
419+
result_ids = {item["id"] for item in response.json()["results"]}
420+
self.assertNotIn(risk_acceptance.id, result_ids)

0 commit comments

Comments
 (0)