Skip to content

Commit 7b83276

Browse files
committed
feat: keep rule priority when rule no longer matches
1 parent a007673 commit 7b83276

4 files changed

Lines changed: 30 additions & 6 deletions

File tree

backend/application/rules/services/rule_engine.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,9 @@ def apply_rules_for_observation(self, observation: Observation) -> None:
7373
observation.rule_rego_severity = ""
7474
observation.rule_status = ""
7575
observation.rule_rego_status = ""
76-
observation.rule_priority = None
77-
observation.rule_rego_priority = None
76+
# rule_priority and rule_rego_priority are intentionally not reset: the priority is kept
77+
# even if the rule no longer matches, so it stays visible why an assessment was made.
78+
# A rule that matches again overwrites it with the new value.
7879
observation.rule_vex_justification = ""
7980
observation.rule_rego_vex_justification = ""
8081
observation.rule_vex_remediations = None

backend/application/rules/services/simulator.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,7 @@ def simulate_rule(rule: Rule) -> Tuple[int, list[Observation]]:
5555
observation_before.rule_rego_status = ""
5656
observation_before.rule_severity = ""
5757
observation_before.rule_rego_status = ""
58-
observation_before.rule_priority = None
59-
observation_before.rule_rego_priority = None
58+
# rule_priority and rule_rego_priority are intentionally not reset, see Rule_Engine
6059
observation_before.rule_vex_justification = ""
6160
observation_before.rule_rego_vex_justification = ""
6261
observation_before.general_rule = None

backend/unittests/rules/services/test_rule_engine.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,27 @@ def test_check_rule_rego_lazy_loads_interpreter(self, mock_rule, mock_rego_inter
8585

8686
# --- apply_rules ---
8787

88+
@patch("application.rules.models.Rule.objects.filter")
89+
def test_apply_rules_keeps_priority_when_no_rule_matches(self, mock_rule):
90+
mock_rule.return_value = []
91+
self.product_1.apply_general_rules = False
92+
rule_engine = Rule_Engine(self.product_1)
93+
observation = Observation(
94+
title="observation",
95+
product=self.product_1,
96+
rule_priority=3,
97+
rule_rego_priority=2,
98+
current_priority=2,
99+
rule_severity="High",
100+
)
101+
102+
rule_engine.apply_rules_for_observation(observation)
103+
104+
self.assertEqual(observation.rule_priority, 3)
105+
self.assertEqual(observation.rule_rego_priority, 2)
106+
self.assertEqual(observation.current_priority, 2)
107+
self.assertEqual(observation.rule_severity, "")
108+
88109
# --- _check_regex ---
89110

90111
def test_check_regex_no_pattern(self):

backend/unittests/rules/services/test_simulator.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,8 @@ def test_observation_before_fields_are_reset(
284284
self, mock_obs_manager, mock_rule_engine_cls, mock_copy, mock_normalize
285285
):
286286
obs_before = MagicMock(spec=Observation)
287+
obs_before.rule_priority = 3
288+
obs_before.rule_rego_priority = 3
287289
mock_copy.return_value = obs_before
288290

289291
self._setup_queryset_mock(mock_obs_manager, [self.mock_observation])
@@ -295,8 +297,9 @@ def test_observation_before_fields_are_reset(
295297
self.assertEqual(obs_before.rule_status, "")
296298
self.assertEqual(obs_before.rule_rego_status, "")
297299
self.assertEqual(obs_before.rule_severity, "")
298-
self.assertIsNone(obs_before.rule_priority)
299-
self.assertIsNone(obs_before.rule_rego_priority)
300+
# priorities are intentionally kept, see Rule_Engine
301+
self.assertEqual(obs_before.rule_priority, 3)
302+
self.assertEqual(obs_before.rule_rego_priority, 3)
300303
self.assertEqual(obs_before.rule_vex_justification, "")
301304
self.assertEqual(obs_before.rule_rego_vex_justification, "")
302305
self.assertIsNone(obs_before.general_rule)

0 commit comments

Comments
 (0)