|
1 | | -from datetime import datetime, timedelta |
| 1 | +from datetime import date, datetime, timedelta |
2 | 2 |
|
3 | 3 | from crum import impersonate |
4 | | - |
5 | | -from dojo.models import DojoMeta, Engagement, Finding, Test, User |
| 4 | +from django.utils.timezone import is_naive, now |
| 5 | + |
| 6 | +from dojo.finding.helper import close_finding |
| 7 | +from dojo.models import ( |
| 8 | + DojoMeta, |
| 9 | + Endpoint, |
| 10 | + Endpoint_Status, |
| 11 | + Engagement, |
| 12 | + Finding, |
| 13 | + Note_Type, |
| 14 | + Notes, |
| 15 | + Product, |
| 16 | + Product_Type, |
| 17 | + Test, |
| 18 | + Test_Type, |
| 19 | + User, |
| 20 | +) |
6 | 21 |
|
7 | 22 | from .dojo_test_case import DojoTestCase |
8 | 23 |
|
9 | 24 |
|
10 | 25 | class TestFindingModel(DojoTestCase): |
11 | 26 | fixtures = ["dojo_testdata.json"] |
12 | 27 |
|
| 28 | + def setUp(self): |
| 29 | + self.user = User.objects.first() # Use a user from fixtures |
| 30 | + self.product_type = Product_Type.objects.create(name="Test Product Type") |
| 31 | + self.product = Product.objects.create(name="Test Product", prod_type=self.product_type) |
| 32 | + self.engagement = Engagement.objects.create( |
| 33 | + name="Test Engagement", |
| 34 | + product=self.product, |
| 35 | + target_start=now(), |
| 36 | + target_end=now(), |
| 37 | + ) |
| 38 | + self.test_type = Test_Type.objects.create(name="Unit Test Type") |
| 39 | + self.test = Test.objects.create( |
| 40 | + engagement=self.engagement, |
| 41 | + test_type=self.test_type, |
| 42 | + title="Test for Finding", |
| 43 | + target_start=now(), |
| 44 | + target_end=now(), |
| 45 | + ) |
| 46 | + self.finding = Finding.objects.create(title="Close Finding Test", active=True, test=self.test) |
| 47 | + self.endpoint = Endpoint.objects.create(host="test.local") |
| 48 | + self.endpoint_status = Endpoint_Status.objects.create(finding=self.finding, endpoint=self.endpoint) |
| 49 | + self.finding.status_finding.add(self.endpoint_status) |
| 50 | + |
| 51 | + def test_close_finding_with_naive_date(self): |
| 52 | + note_type_obj = Note_Type.objects.create(name="General") |
| 53 | + naive_date = date.today() # No timezone |
| 54 | + close_finding( |
| 55 | + finding=self.finding, |
| 56 | + user=self.user, |
| 57 | + is_mitigated=True, |
| 58 | + mitigated=naive_date, |
| 59 | + mitigated_by=None, |
| 60 | + false_p=False, |
| 61 | + out_of_scope=False, |
| 62 | + duplicate=False, |
| 63 | + note_entry="Mitigation note", |
| 64 | + note_type=note_type_obj, |
| 65 | + ) |
| 66 | + self.assertFalse(is_naive(self.finding.mitigated)) |
| 67 | + note = Notes.objects.filter(finding=self.finding).first() |
| 68 | + self.assertIsNotNone(note) |
| 69 | + self.assertFalse(is_naive(note.date)) |
| 70 | + status = Endpoint_Status.objects.filter(finding=self.finding).first() |
| 71 | + self.assertTrue(status.mitigated) |
| 72 | + self.assertFalse(is_naive(status.mitigated_time)) |
| 73 | + |
| 74 | + def test_close_finding_with_naive_datetime(self): |
| 75 | + naive_datetime = datetime(2025, 11, 12, 0, 0, 0) |
| 76 | + close_finding( |
| 77 | + finding=self.finding, |
| 78 | + user=self.user, |
| 79 | + is_mitigated=True, |
| 80 | + mitigated=naive_datetime, |
| 81 | + mitigated_by=None, |
| 82 | + false_p=False, |
| 83 | + out_of_scope=False, |
| 84 | + duplicate=False, |
| 85 | + ) |
| 86 | + self.assertFalse(is_naive(self.finding.mitigated)) |
| 87 | + |
| 88 | + def test_close_finding_with_none_mitigated(self): |
| 89 | + close_finding( |
| 90 | + finding=self.finding, |
| 91 | + user=self.user, |
| 92 | + is_mitigated=True, |
| 93 | + mitigated=None, |
| 94 | + mitigated_by=None, |
| 95 | + false_p=False, |
| 96 | + out_of_scope=False, |
| 97 | + duplicate=False, |
| 98 | + ) |
| 99 | + self.assertFalse(is_naive(self.finding.mitigated)) |
| 100 | + |
13 | 101 | def test_get_sast_source_file_path_with_link_no_file_path(self): |
14 | 102 | finding = Finding() |
15 | 103 | self.assertEqual(None, finding.get_sast_source_file_path_with_link()) |
|
0 commit comments