Skip to content

Commit c7331cc

Browse files
SLA Calculations 1/2: Add unit tests to capture current behaviour (#11923)
* sla calc: add unit tests * sla calc: add unit tests * sla calc: add unit tests * linting * sla config: restore display tag * sla config: restore display tag * sla config: cleanup
1 parent 88b1479 commit c7331cc

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

unittests/test_sla_calculations.py

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
import logging
2+
from unittest.mock import patch
3+
4+
from dateutil.relativedelta import relativedelta
5+
from django.utils import timezone
6+
7+
from dojo.models import (
8+
Finding,
9+
SLA_Configuration,
10+
Test,
11+
)
12+
from dojo.templatetags.display_tags import finding_sla
13+
14+
from .dojo_test_case import DojoTestCase
15+
16+
logger = logging.getLogger(__name__)
17+
18+
19+
class TestSLACalculations(DojoTestCase):
20+
fixtures = ["dojo_testdata.json"]
21+
22+
@classmethod
23+
def setUpClass(cls):
24+
super().setUpClass()
25+
cls.now = timezone.now()
26+
27+
cls.sla_config = SLA_Configuration.objects.all().first()
28+
cls.sla_config.enforce_critical = True
29+
cls.sla_config.enforce_high = True
30+
cls.sla_config.enforce_medium = True
31+
cls.sla_config.enforce_low = True
32+
cls.sla_config.save()
33+
# for finding in Finding.objects.all().order_by("test"):
34+
# logger.error(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.sla_expiration_date}")
35+
logger.error(f"SLA Config: {cls.sla_config.critical} {cls.sla_config.high} {cls.sla_config.medium} {cls.sla_config.low}")
36+
37+
# New finding should have sla_expiration_date set
38+
def test_new_finding(self):
39+
finding = Finding(test=Test.objects.get(id=89), title="Test Finding", severity="High")
40+
finding.save()
41+
42+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
43+
logger.debug(finding_sla(finding))
44+
45+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
46+
self.assertEqual(self.sla_config.high, finding.sla_days_remaining())
47+
48+
# Finding within SLA should have correct sla_exration_date and days_remaining
49+
def test_active_within_sla(self):
50+
finding = Finding(test=Test.objects.get(id=89), title="Test Finding", severity="High")
51+
finding.save()
52+
53+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
54+
logger.debug(finding_sla(finding))
55+
56+
with patch("django.db.models.fields.timezone.now") as mock_now:
57+
mock_now.return_value = self.now + relativedelta(days=10)
58+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
59+
self.assertEqual(self.sla_config.high - 10, finding.sla_days_remaining())
60+
61+
# Finding outside SLA should have correct sla_exration_date and days_remaining
62+
def test_active_outside_sla(self):
63+
finding = Finding(test=Test.objects.get(id=89), title="Test Finding", severity="High")
64+
finding.save()
65+
66+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
67+
logger.debug(finding_sla(finding))
68+
69+
with patch("django.db.models.fields.timezone.now") as mock_now:
70+
mock_now.return_value = self.now + relativedelta(days=50)
71+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
72+
self.assertEqual(self.sla_config.high - 50, finding.sla_days_remaining())
73+
74+
# Finding mitigated inside SLA should have correct sla_exration_date and days_remaining
75+
def test_mitigated_inside_sla(self):
76+
finding = Finding(test=Test.objects.get(id=89), title="Test Finding", severity="High")
77+
finding.save()
78+
79+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
80+
logger.debug(finding_sla(finding))
81+
82+
initial_sla_expiration_date = finding.sla_expiration_date
83+
84+
with patch("django.db.models.fields.timezone.now") as mock_now:
85+
mock_now.return_value = self.now + relativedelta(days=10)
86+
finding.mitigated = mock_now.return_value
87+
finding.is_mitigated = True
88+
finding.active = False
89+
finding.save()
90+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
91+
logger.debug(finding_sla(finding))
92+
93+
# sla_expiration_date should not change just because a finding is mitigated
94+
self.assertEqual(initial_sla_expiration_date, finding.sla_expiration_date)
95+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
96+
self.assertEqual(20, finding.sla_days_remaining())
97+
self.assertTrue("within SLA" in finding_sla(finding))
98+
self.assertTrue(">20<" in finding_sla(finding))
99+
100+
with patch("django.db.models.fields.timezone.now") as mock_now:
101+
mock_now.return_value = self.now + relativedelta(days=20)
102+
finding.save()
103+
104+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
105+
logger.debug(finding_sla(finding))
106+
107+
# sla_expiration_date should not change just because a finding is saved
108+
self.assertEqual(initial_sla_expiration_date, finding.sla_expiration_date)
109+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
110+
self.assertEqual(20, finding.sla_days_remaining())
111+
self.assertTrue("within SLA" in finding_sla(finding))
112+
self.assertTrue(">20<" in finding_sla(finding))
113+
114+
# Finding mitigated outside SLA should have correct sla_exration_date and days_remaining
115+
def test_mitigated_outside_sla(self):
116+
finding = Finding(test=Test.objects.get(id=89), title="Test Finding", severity="High")
117+
finding.save()
118+
119+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
120+
logger.debug(finding_sla(finding))
121+
122+
initial_sla_expiration_date = finding.sla_expiration_date
123+
124+
with patch("django.db.models.fields.timezone.now") as mock_now:
125+
mock_now.return_value = self.now + relativedelta(days=45)
126+
finding.mitigated = mock_now.return_value
127+
finding.is_mitigated = True
128+
finding.active = False
129+
finding.save()
130+
131+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
132+
logger.debug(finding_sla(finding))
133+
134+
# sla_expiration_date should not change just because a finding is mitigated
135+
self.assertEqual(initial_sla_expiration_date, finding.sla_expiration_date)
136+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
137+
self.assertEqual(-15, finding.sla_days_remaining())
138+
self.assertTrue("Out of SLA" in finding_sla(finding))
139+
self.assertTrue("15 days past" in finding_sla(finding))
140+
self.assertTrue(">15<" in finding_sla(finding))
141+
142+
with patch("django.db.models.fields.timezone.now") as mock_now:
143+
mock_now.return_value = self.now + relativedelta(days=55)
144+
finding.save()
145+
146+
logger.debug(f"Finding: {finding.test.id} {finding.id} {finding.date} {finding.mitigated} {finding.sla_expiration_date}")
147+
logger.debug(finding_sla(finding))
148+
149+
# sla_expiration_date should not change just because a finding is saved
150+
self.assertEqual(initial_sla_expiration_date, finding.sla_expiration_date)
151+
self.assertEqual((self.now + relativedelta(days=self.sla_config.high)).date(), finding.sla_expiration_date)
152+
self.assertEqual(-15, finding.sla_days_remaining())
153+
self.assertTrue("Out of SLA" in finding_sla(finding))
154+
self.assertTrue("15 days past" in finding_sla(finding))
155+
self.assertTrue(">15<" in finding_sla(finding))

0 commit comments

Comments
 (0)