Skip to content

Commit 1e59c8d

Browse files
Expose created/updated date filters for Risk Acceptance API (created_before/after, updated_before/after) (#14786)
* 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 * style: fix ruff issues in risk acceptance tests * test: align risk acceptance filter assertions --------- Co-authored-by: valentijnscholten <valentijnscholten@gmail.com>
1 parent 00e4e48 commit 1e59c8d

1 file changed

Lines changed: 59 additions & 0 deletions

File tree

unittests/test_risk_acceptance_api.py

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

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

0 commit comments

Comments
 (0)