@@ -42,6 +42,7 @@ def setUp(self):
4242 def test_evaluates_every_enabled_ruleset_assigned_to_the_product (self , mock_evaluate ):
4343 ruleset = make_triage_ruleset (self .dataspace , enabled = True )
4444 make_product_triage_ruleset (self .product , ruleset = ruleset )
45+ mock_evaluate .reset_mock () # Called once already by the evaluate_on_assign signal.
4546
4647 reevaluate_product_rulesets (self .product )
4748
@@ -62,6 +63,7 @@ def test_skips_disabled_ruleset_assignments(self, mock_evaluate):
6263 def test_apply_preset_flag_is_forwarded (self , mock_evaluate ):
6364 ruleset = make_triage_ruleset (self .dataspace , enabled = True )
6465 make_product_triage_ruleset (self .product , ruleset = ruleset )
66+ mock_evaluate .reset_mock () # Called once already by the evaluate_on_assign signal.
6567
6668 reevaluate_product_rulesets (self .product , apply_preset = False )
6769
@@ -196,6 +198,38 @@ def test_disabling_then_reenabling_a_ruleset_reuses_the_existing_request(self):
196198 self .assertEqual (original_request , TriageRecord .objects .get ().request )
197199
198200
201+ class EvaluateOnAssignSignalTestCase (TestCase ):
202+ def setUp (self ):
203+ self .dataspace = Dataspace .objects .create (name = "nexB" )
204+ self .product = make_product (self .dataspace )
205+
206+ @patch ("vulnerabilities.triage.signals.evaluate_ruleset" )
207+ def test_assigning_an_enabled_ruleset_evaluates_it (self , mock_evaluate ):
208+ ruleset = make_triage_ruleset (self .dataspace , enabled = True )
209+
210+ make_product_triage_ruleset (self .product , ruleset = ruleset )
211+
212+ mock_evaluate .assert_called_once_with (ruleset = ruleset , product = self .product )
213+
214+ @patch ("vulnerabilities.triage.signals.evaluate_ruleset" )
215+ def test_assigning_a_disabled_ruleset_does_not_evaluate (self , mock_evaluate ):
216+ ruleset = make_triage_ruleset (self .dataspace , enabled = False )
217+
218+ make_product_triage_ruleset (self .product , ruleset = ruleset )
219+
220+ mock_evaluate .assert_not_called ()
221+
222+ @patch ("vulnerabilities.triage.signals.evaluate_ruleset" )
223+ def test_resaving_an_existing_assignment_does_not_reevaluate (self , mock_evaluate ):
224+ ruleset = make_triage_ruleset (self .dataspace , enabled = True )
225+ assignment = make_product_triage_ruleset (self .product , ruleset = ruleset )
226+ mock_evaluate .reset_mock ()
227+
228+ assignment .save ()
229+
230+ mock_evaluate .assert_not_called ()
231+
232+
199233class DeleteTriageRecordsOnUnassignSignalTestCase (TestCase ):
200234 def setUp (self ):
201235 self .dataspace = Dataspace .objects .create (name = "nexB" )
0 commit comments